Установка и настройка Squid proxy

Сначала устанавливаем squid для дальнейшего использования в качестве прокси-сервера с помощью следующей команды:

sudo apt install squid

После установки, squid необходимо настроить. Для этого открываем файл .conf с помощью следующей команды:

sudo nano /etc/squid/squid.conf

В открытом файле необходимо нажимаем Ctrl+W для того, чтобы чтобы найти необходимое место и прописать:

include /etc/squid/conf.d/*

В найденном месте ниже добавим строчки и поле сохраняем измененный файл:

auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/passwords`
auth_param basic realm proxy`
acl authenticated proxy_auth REQUIRED`
acl localnet src  176.59.142.172
http_access allow authenticated

176.59.142.172 - ip адрес локальной машины.

Установка Apache

Устанавливаем Apache для дальнейшего осуществления передачи данных при запросе и настраиваем аутентификацию по паролю

sudo apt install apache2-utils
sudo htpasswd -c /etc/squid/passwords *squid_username*

Запуск сервера

По умолчанию squid слушает 3128 порт

sudo systemctl start squid
sudo systemctl enable squid
sudo ufw allow 3128

Видим, что прокси успешно работает:

Elasticsearch

Установка Java

Установим Java с помощью следующих команд:

sudo apt update
sudo apt install default-jre
sudo apt install default-jdk

Установка Elasticsearch

Elasticsearch используется для хранения, анализа, поиска по логам.
Для начала используем cURL, инструмент командной строки для передачи данных с помощью URL, для импорта открытого ключа Elasticsearch GPG в APT. Так же используем аргументы -fsSL для подавления всех текущих и возможных ошибок (кроме сбоя сервера), а также, чтобы разрешить cURL подать запрос на другой локации при переадресации. Выводим результаты команды cURL в программу apt-key, которая добавит открытый ключ GPG в APT

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Добавим список источников Elastic в каталог sources.list.d, где APT будет искать новые источники:

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

Обновляем список пакетов, чтобы APT мог прочитать новый источник Elastic и устанавливаем Elasticksearch с помощью следующей команды:

sudo apt update
sudo apt install elasticsearch

Настройка Elasticsearch

Для настройки Elasticsearch мы отредактируем файлы конфигурации. В Elasticsearch имеется три файла конфигурации:

  • elasticsearch.yml для настройки Elasticsearch, главный файл конфигурации

  • jvm.options для настройки виртуальной машины Elasticsearch Java Virtual Machine (JVM)

  • log4j2.properties для настройки журнала Elasticsearch

Открываем файл elasticsearch.yml для изменения конфигураций. Файл elasticsearch.yml предоставляет варианты конфигурации для кластера, узла, пути, памяти, сети, обнаружения и шлюза. Нам необходимо изменить настройки только для хоста сети.

sudo nano /etc/elasticsearch/elasticsearch.yml

Для ограничения доступа и повышения безопасности находим строку с указанием network.host и убираем с нее значок комментария, после чего заменяем значение на 0.0.0.0, чтобы она выглядела следующим образом: "network.host: 0.0.0.0".
Elasticsearch формирует одноузловой кластер: discovery.type: single-node.
Включаем функции безопасности Elasticsearch на узле: xpack.security.enabled: true.

Запуск Elasticsearch

Запускаем Elasticsearch с помощью следующих команд:

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

Создание пользователей

sudo -u root /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

Сохраняем вывод

Changed password for user apm_system
PASSWORD apm_system = Ff7GWmJSS4X45NewBNZN

Changed password for user kibana_system
PASSWORD kibana_system = OZ7w09XTeHBg3rfihAsm

Changed password for user kibana
PASSWORD kibana = OZ7w09XTeHBg3rfihAsm

Changed password for user logstash_system
PASSWORD logstash_system = AKtK2rmOmkAwWfL17jCh

Changed password for user beats_system
PASSWORD beats_system = ymq4MVVHCdDIVBohH5l7

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = RbkSKKbivgZOoq02plda

Changed password for user elastic
PASSWORD elastic = nrRO28jYIplnaEP3JBou

Kibana

Установка Kibana

Установим Kibana, которая представляет собой удобную и красивую web панель для работы с логами, с помощью следующей команды:

sudo apt install kibana

Настройка Kibana

Откроем файл конфигурации:

sudo nano /etc/kibana/kibana.yml

Настроим username и укажем, что Elasticsearch должна работать на порту 9200, а Kibana на 5601:

elasticsearch.username: "kibana_system"
elasticsearch.host: "0.0.0.0:9200"
kibana.port: 5601

Запуск Kibana

Запустим Kibana с помощью следующих команд:

sudo systemctl start kibana
sudo systemctl enable kibana

Добавление пароля

sudo -u root /usr/share/kibana/bin/kibana-keystore create
sudo -u root /usr/share/kibana/bin/kibana-keystore add elasticsearch.password

Вписываем пароль, который получили при создании пользователей

Changed password for user kibana_system
PASSWORD kibana_system = OZ7w09XTeHBg3rfihAsm

Заходим в Elasticsearch, создаем суперпользователя

Logstash

Установка Logstash

Устанавливаем Logstash- сервис для сбора логов и отправки их в Elasticsearch.

sudo apt install logstash

Настройка Logstash

Открываем файл конфигураций:

sudo nano /etc/logstash/conf.d/logstash.conf

Указываем, что принимаем информацию на 5044 порт, формируем функцию, где в дальнейшем будут находиться правила, описываем передачу данных в Elasticsearch и сохраняем.

input { 
    beats { 
        port => 5044 
    }
}

filter {
  **Место для правил Grok**
}

output {
  elasticsearch {
    hosts => ["139.59.247.231:9200"]
    manage_template => false 
    index => "%{[@metadata][beat]}-%{[@metadata[version]}-%{+YYYY.MM.dd}"
    user => "user"
    password => "password"
  }
}

Проверяем синтаксис, чтобы в дальнейшем не появились ошибки

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t

Запуск Logstash

Запускаем Logstash с помощью следующих команд:

sudo systemctl start logstash
sudo systemctl enable logstash

Filebeat

Установка Filebeat - клиент для передачи логов в logstash

Заходим на прокси сервер

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt install filebeat

Настройка Filebeat

Изменяем файл конфигураций:

sudo filebeat modules enable system
sudo nano /etc/filebeat/filebeat.yml

Комментируем строчки "output.elasticsearch" и "hosts: ["localhost:9200"]"

Раскомментируем строчки "output.logstash" и "hosts: ["localhost:5044"]"

Изменим localhost на ip нашего сервера с ELK

Проверяем конфигурацию "sudo filebeat -e test output"
Так как мы отправляем события в Logstash, то необходимо вручную загрузить конвейеры загрузки. Для этого запустим команду:

sudo filebeat setup --pipelines --modules system

Установим index templates для Elasticsearch вручную.

Чтобы загрузить шаблон индекса вручную, запустим команду установки. Требуется подключение к Elasticsearch, но т.к. включен другой вывод, необходимо временно отключить этот вывод и включить Elasticsearch с помощью параметра -E. Отключаем выходные данные Logstash.

sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["139.59.247.231:9200"]' -E 'output.elasticsearch.username="dasha"' -E 'output.elasticsearch.password="123456"'
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["139.59.247.231:9200"]' -E 'output.elasticsearch.username="dasha"' -E 'output.elasticsearch.password="123456"' -E setup.kibana.host=139.59.247.231:5601

139.59.247.231 elk ip

Запуск Filebeat

Запускаем Filebeat с помощью следующих команд:

sudo systemctl start filebeat
sudo systemctl enable filebeat
curl -u dasha:123456 -XGET 'http://139.59.247.231:9200/filebeat-*/_search?pretty'

GROK

Grok-это фильтр внутри Logstash, который используется для разбора неструктурированных данных на что-то структурированное и подлежащее запросу. Он находится поверх регулярного выражения (regex) и использует текстовые шаблоны для сопоставления строк в файлах журналов.

Правило 1

Полученные логи

{
  "fields" : {
    "message": [
        "May  1 10:01:37 proxy sshd[87897]: Failed password for root from 49.88.112.76 port 14398 ssh2"
      ]
  }
}

Grok

%{SYSLOGTIMESTAMP} %{WORD:server_name} %{WORD:service_name}\[%{NUMBER:pid}\]: Failed password for %{WORD:user_name} from %{IP:source_ip} port %{NUMBER:port}

Новые полученные логи

{
  "fields": {
    "server_name": [
      "proxy"
    ],
    "user_name": [
      "root"
    ],
    "pid": [
      "87897"
    ],
    "source_ip": [
      "49.88.112.76"
    ],
    "service_name": [
      "sshd"
    ],
    "message": [
      "May  1 10:01:37 proxy sshd[87897]: Failed password for root from 49.88.112.76 port 14398 ssh2"
    ],
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "port": [
      "14398"
    ]
  }
}

Правило 2

Полученные логи

{
  "fields": {
    "message": [
      "Apr 27 02:13:09 proxy sshd[5803]: Received disconnect from 124.156.222.134 port 46278:11: Bye Bye [preauth]"
    ]
  }
}

Grok

%{SYSLOGTIMESTAMP} %{WORD:server_name} sshd\[%{NUMBER}\]: Received disconnect from %{IP:source_ip} port %{NUMBER:port}:%{DATA}: %{GREEDYDATA:msg}

Новые полученные логи

{
  "fields": {
    "msg": [
      "Bye Bye [preauth]"
    ],
    "server_name": [
      "proxy"
    ],
    "source_ip": [
      "14.224.148.16"
    ],
    "message": [
      "May  1 10:25:28 proxy sshd[88097]: Received disconnect from 14.224.148.16 port 36408:11: Bye Bye [preauth]"
    ],
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "port": [
      "36408"
    ]
  }
}

Правило 3

Полученные логи

{
  "fields": {
    "message": [
      "May  1 10:31:28 proxy sshd[88184]: Disconnected from authenticating user root 165.22.63.216 port 33010 [preauth]"
    ]
  }
}

Grok

%{SYSLOGTIMESTAMP} %{WORD:server_name} sshd\[%{NUMBER}\]: %{WORD:status} from authenticating user %{WORD:user_name} %{IP:source_ip} port %{NUMBER:port}

Новые полученные логи

{
  "fields": {
    "server_name": [
      "proxy"
    ],
    "user_name": [
      "root"
    ],
    "source_ip": [
      "124.194.74.203"
    ],
    "message": [
      "May  1 10:39:30 proxy sshd[88242]: Disconnected from authenticating user root 124.194.74.203 port 40918 [preauth]"
    ],
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "port": [
      "40918"
    ],
    "status": [
      "Disconnected"
    ]
  }
}

Комментарии (8)


  1. MrSelfDestruct
    11.05.2022 11:05
    +1

    Вопрос по выбору версии elasticsearch, почему именно 7-я, а не 8-я? Да и не стоит ли сейчас посмотреть на версию от Amazon (OpenSearch), если говорить о 7-ке?


  1. martin74ua
    11.05.2022 11:18
    +7

    Зачем squid? зачем вообще этот очередной пересказ мануалов своими словами?


  1. Rastler
    11.05.2022 11:56
    +2

    В нынешних реалиях даже репозиторий elastic search недоступен из РФ, нужно делать зеркало или загружать в ручную пакеты. Можно было бы хотя бы это указать, а то полезность статьи и так нулевая.


  1. chukov
    11.05.2022 17:23
    +1

    Зачем вам понадобился jdk?

    Как я понимаю squid генерирует логи?


  1. pprometey
    11.05.2022 18:22
    +1

    То же самое о чем статья, но одной строкой:

    git clone https://github.com/deviantony/docker-elk.git && cd docker-elk && docker-compose up -d
    


  1. bykvaadm
    12.05.2022 00:05
    +1

    Вступление? Выводы? Я бы рекомендовал скрыть и переписать статью.


  1. makapohmgn
    12.05.2022 06:15
    +1

    Для ограничения доступа и повышения безопасности находим строку с указанием network.host и убираем с нее значок комментария, после чего заменяем значение на 0.0.0.0, чтобы она выглядела следующим образом: "network.host: 0.0.0.0".

    Серьёзно?


  1. E32_735i
    12.05.2022 09:21

    НА ДВОРЕ 2022

    @

    21 ВЕК

    @

    УСТАНОВИМ СКВИД