The Elastic Stack (ранее известное как ELK Stack) — это мощное решение для централизованного логирования. Это набор программного обеспечения с открытым исходным кодом, разработанный Elastic. Оно позволяет администраторам искать, анализировать и визуализировать логи, полученные из любого источника в любом формате. Это практика, известная как централизованное логирование. Централизованное логирование может быть очень полезным при поиске проблем с серверами и приложениями, так как оно позволяет искать по всем логам из одного места. Оно также может помочь выявить проблемы на нескольких серверах путем сопоставления логов в определенное время.
В этом руководстве вы узнаете, как установить Elastic Stack на Ubuntu 18.04. Сначала воспользуйтесь нашим руководством, чтобы легко установить сервер Ubuntu на CloudSigma.
The Elastic Stack на Ubuntu
The Elastic Stack состоит из следующих компонентов:
- Elasticsearch: распределенная поисковая система RESTful. Она хранит все собранные данные.
- Logstash: — компонент обработки данных Elastic Stack. Он отправляет входящие данные в Elasticsearch.
- Kibana: Веб-интерфейс, предоставляющий функции поиска и визуализации логов.
- Beats: — легкий специализированный агент для передачи данных. Он может отправлять данные с множества машин в Logstash или Elasticsearch.
Вам потребуется вручную установить каждый компонент стека.
Предварительные требования
Перед тем как приступить к установке the Elastic Stack, необходимо выполнить несколько системных требований:
- Требования к оборудованию:
- CPU: 2 процессора (доступные для пользователя sudo без прав root)
- RAM: 4 ГБ
- OpenJDK 11 (последний выпуск Java LTS). Чтобы установить его, ознакомьтесь с нашим руководством по настройке Java на Ubuntu 18.04.
- Nginx с правильными конфигурациями. Вы можете воспользоваться нашим руководством по установке Nginx на Ubuntu 18.04, чтобы настроить его.
Обратите внимание, что объем хранилища зависит от количества собираемых и хранимых логов. Кроме того, Elastic Stack также работает с важной информацией о сервере. Чтобы обеспечить безопасность передачи данных, мы настоятельно рекомендуем настроить TLS/SSL-сертификат. Воспользуйтесь этим руководством для получения бесплатного SSL-сертификата на вашем сервере Nginx.
Помимо зашифрованного сервера, также потребуются следующие шаги:
- FQDN (полностью определенное доменное имя). В данном руководстве это будет <domain>.
- Обе DNS-записи следующих доменов указывают на сервер.
- Запись A с <domain>, указывающая на публичный IP-адрес сервера.
- Запись A с www.<domain>, указывающая на публичный IP-адрес сервера.
Установка Elastic Stack
-
Настройка репозитория Elastic
Компоненты Elastic Stack недоступны напрямую из официального репозитория Ubuntu. К счастью, Ubuntu позволяет использовать сторонниеrd репозитории для установки пакетов. Для наших целей мы добавим репозиторий пакетов Elastic. Этот репозиторий предлагает все последние обновления для всех пакетов Elastic. Все пакеты Elastic подписаны ключом подписи Elasticsearch для предотвращения подмены пакетов. Сначала добавьте ключ в связку ключей Ubuntu:
|
1 |
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - |
Затем добавьте список источников Elastic в каталог «sources.list.d». Это специальный каталог, который APT использует для поиска новых источников:
|
1 |
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:
|
1 |
sudo apt update |
Согласно официальной документации, рекомендуется устанавливать каждый из компонентов в порядке, указанном в данном руководстве. Это гарантирует, что компоненты, от которых зависит каждый продукт, находятся на своих местах.
-
Установка и настройка Elasticsearch
После настройки репозитория Elastic, APT готов к загрузке и установке всех пакетов Elastic. Выполните следующую команду для установки Elasticsearch:
|
1 |
sudo apt install elasticsearch |
Теперь вы можете настроить Elasticsearch. Файл «elasticsearch.yml» содержит параметры конфигурации кластеров, узлов, путей, сетей, памяти, шлюза и других элементов. Большинство из них уже предварительно настроены в файле. Затем откройте файл конфигурации Elasticsearch в любом текстовом редакторе:
|
1 |
sudo vim /etc/elasticsearch/elasticsearch.yml |
Elasticsearch по умолчанию прослушивает порт 9200 на всех интерфейсах. Мы рекомендуем ограничить внешний доступ к Elasticsearch, чтобы предотвратить чтение данных посторонними лицами или завершение работы кластеров Elasticsearch через REST API. Чтобы ограничить доступ к Elasticsearch и повысить его безопасность, раскомментируйте следующую строку и замените ее значение:
|
1 |
network.host: localhost |
Если Elasticsearch должен прослушивать определенный IP-адрес, замените «localhost» на целевой IP-адрес. Это минимальное требование к конфигурации перед запуском Elasticsearch. Сохраните и закройте файл конфигурации. Затем запустите службу Elasticsearch. Запуск Elasticsearch может занять некоторое время:
|
1 |
sudo systemctl start elasticsearch |
После этого необходимо убедиться, что Elasticsearch запускается при каждой загрузке сервера:
|
1 |
sudo systemctl enable elasticsearch |
Следующая команда проверит, работает ли служба Elasticsearch. Для этого достаточно отправить HTTP-запрос:
|
1 |
curl -X GET "localhost:9200" |
Ответ будет выглядеть примерно так. Это будет ответ, содержащий некоторую базовую информацию о локальном узле.
Установка и настройка панели управления Kibana
Kibana доступна непосредственно из репозитория Elastic. Обратите внимание, что Kibana следует устанавливать только после того, как вы уже установили Elasticsearch. Если репозиторий уже доступен, APT может напрямую загрузить и установить Kibana:
|
1 |
sudo apt install kibana |
После установки включите и запустите службу Kibana:
|
1 2 |
sudo systemctl enable kibana sudo systemctl start kibana |
По умолчанию Kibana настроена на прослушивание только «localhost». Для внешнего доступа требуется настройка обратного прокси-сервера. В данном случае в качестве обратного прокси-сервера будет использоваться Nginx. Используйте команду openssl для создания администратора Kibana. Это будет учетная запись пользователя для доступа к веб-интерфейсу Kibana. В данном примере именем пользователя будет «kibana_admin». Для обеспечения лучшей безопасности мы рекомендуем использовать нестандартное имя пользователя. Следующая команда создаст администратора для Kibana. Имя пользователя и пароль будут сгенерированы и сохранены в файле «htpasswd.users». Nginx должен быть настроен на использование этого имени пользователя и пароля:
|
1 |
echo "kibana_admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users |
Введите и подтвердите пароль в командной строке. Этот пароль будет важен для доступа к интерфейсу Kibana. После этого вам нужно создать файл серверного блока Nginx. Для демонстрации это будет example.com. Это также может быть любое другое описательное имя. Если для сервера настроены записи FQDN и DNS, имя файла также может соответствовать FQDN:
|
1 |
sudo vim /etc/nginx/sites-available/example.com |
Если там уже есть какое-либо содержимое, удалите его и замените следующими строками кода:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
server { listen 80; server_name example.com; auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.users; location / { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } |
Сохраните и закройте файл. Создайте символическую ссылку на новую конфигурацию в каталоге «sites-enabled». Если уже существует ссылка с таким же именем файла, этот шаг может не потребоваться:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |
Следующая команда заставит Nginx проверить наличие синтаксических ошибок:
|
1 |
sudo nginx -t |
Если возникнут проблемы с синтаксисом, убедитесь, что содержимое файла размещено правильно. Затем перезапустите службу Nginx:
|
1 |
sudo systemctl restart nginx |
Укажите UFW, чтобы разрешить подключение к Nginx:
|
1 |
sudo ufw allow 'Nginx Full' |
Теперь Kibana должна быть доступна по FQDN или публичному IP-адресу сервера Elastic Stack. Проверьте страницу статуса сервера Kibana:
|
1 |
http://<server_ip>:5601/status |
Установка и настройка Logstash
Хотя Beats может напрямую отправлять данные в базу данных Elasticsearch’s, для обработки данных рекомендуется использовать Logstash. Logstash может собирать данные и преобразовывать их в общий формат перед экспортом в другую базу данных. Выполните следующую команду APT для установки Logstash:
|
1 |
sudo apt install logstash |
После завершения установки пришло время настроить Logstash. Конфигурационные файлы Logstash имеют формат JSON. Все их можно найти в каталоге «/etc/logstash/conf.d». Полезно представить Logstash в виде конвейера, который принимает данные на одном конце, обрабатывает их и отправляет в место назначения. Конвейер Logstash требует двух обязательных элементов – input и output с одним необязательным элементом – filter. Плагин input принимает данные, плагин filter обрабатывает данные, а плагин output записывает данные в место назначения. Следующая команда создаст конфигурационный файл, который настроит Logstash для приема данных из Filebeat:
|
1 |
sudo vim /etc/logstash/conf.d/02-beats-input.conf |
Введите следующую конфигурацию input. Она описывает входные данные beats, которые будут прослушивать порт 5044 по протоколу TCP:
|
1 2 3 4 5 |
input { beats { port => 5044 } } |
Следующим шагом является создание конфигурационного файла с именем «10-syslog-filter.conf». Мы будем использовать его для настройки фильтра для syslogs (системных журналов):
|
1 |
sudo vim /etc/logstash/conf.d/10-syslog-filter.conf |
Введите следующий код конфигурации syslog. Этот код доступен непосредственно из Elastic guide. Этот код объясняет конфигурацию input для Logstash:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
input{ beats{ port => 5044 host => "0.0.0.0" } } filter { if [fileset][module] == "system" { if [fileset][name] == "auth" { grok { match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] } pattern_definitions => { "GREEDYMULTILINE"=> "(.|\n)*" } remove_field => "message" } date { match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } geoip { source => "[system][auth][ssh][ip]" target => "[system][auth][ssh][geoip]" } } else if [fileset][name] == "syslog" { grok { match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] } pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" } remove_field => "message" } date { match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } } |
Следующий конфигурационный файл будет отвечать за вывод. Откройте новый файл с именем «30-elasticsearch-output.conf»:
|
1 |
sudo vim /etc/logstash/conf.d/30-elasticsearch-output.conf |
Введите следующий код. Этот код описывает конфигурацию вывода для Logstash:
|
1 2 3 4 5 6 7 |
output { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } |
Протестируйте конфигурацию Logstash. Затем выполните следующую команду:
|
1 |
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t |
Если ошибок нет, Logstash выведет следующее сообщение об успешном завершении. Если запуск не удался, убедитесь, что все конфигурационные файлы содержат правильный код. Наконец, запустите и добавьте в автозагрузку службу Logstash:
|
1 2 |
sudo systemctl start logstash sudo systemctl enable logstash |
Теперь, когда Logstash успешно запущен и полностью настроен, давайте установим Filebeat.
Установка и настройка Filebeat
Elastic Stack использует агенты отправки данных, известные как «Beats», для сбора данных из различных источников и их передачи в Logstash/Elasticsearch. Вот краткий список доступных Beats от Elastic:
- Filebeat: сбор/отправка файлов журналов.
- Metricbeat: сбор/отправка метрик систем и служб.
- Packetbeat: сбор/анализ сетевых данных.
- Winlogbeat: сбор журналов событий Windows.
- Auditbeat: сбор данных подсистемы аудита Linux и мониторинг целостности файлов.
- Heartbeat: мониторинг доступности служб.
В рамках этого руководства нам понадобится Filebeat для отправки локальных логов в Elastic Stack. Сначала установите Filebeat:
|
1 |
sudo apt install filebeat |
Теперь вы можете настроить Filebeat. Сначала ему необходимо подключиться к Logstash. Мы будем использовать пример конфигурации, который поставляется с Filebeat. Откройте файл конфигурации в текстовом редакторе. Обратите внимание, что поскольку файл имеет формат YAML, важны правильные отступы:
|
1 |
sudo vim /etc/filebeat/filebeat.yml |
Найдите раздел «output.elasticsearch» и закомментируйте следующие строки. Это настроит Filebeat на прямую отправку событий в Elasticsearch/Logstash для дополнительной обработки. Затем перейдите к разделу «output.logstash». Далее раскомментируйте строки:
|
1 2 3 4 5 6 7 |
#output.elasticsearch: # Массив хостов для подключения. # hosts: ["localhost:9200"] output.logstash: # Хосты Logstash hosts: ["localhost:5044"] |
Filebeat поддерживает модули, которые могут расширить его функциональность. В этом руководстве мы будем использовать системный модуль, который собирает и анализирует логи, созданные службой системного логирования популярных дистрибутивов Linux. Включите системный модуль Filebeat:
|
1 |
sudo filebeat modules enable system |
Следующая команда Filebeat выведет список всех включенных и отключенных модулей:
|
1 |
sudo filebeat modules list |
По умолчанию Filebeat настроен на отслеживание стандартных путей для системного журнала (syslog) и журналов авторизации. Параметры модулей доступны в конфигурационном файле «/etc/filebeat/modules.d/system.yml».
Следующим шагом является загрузка шаблона индекса в Elasticsearch. Индекс Elasticsearch представляет собой коллекцию документов со схожими характеристиками. Каждый индекс имеет имя. Имя необходимо при выполнении различных операций внутри него. Шаблон индекса автоматически применяется каждый раз при создании нового индекса. Далее загрузите шаблон:
|
1 |
sudo filebeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]' |
По умолчанию Filebeat содержит пример дашборда для Kibana. Он помогает визуализировать данные Filebeat в Kibana. Однако перед использованием дашборда необходимо создать шаблон индекса и загрузить дашборды в Kibana. Во время загрузки дашбордов Filebeat обращается к Elasticsearch за информацией о версии. Для загрузки дашбордов при включенном Logstash требуется отключить вывод Logstash и включить вывод Elasticsearch. Следующая команда выполнит эту задачу:
|
1 |
sudo filebeat setup -e -E output.logstash.enabled=false -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601 |
Наконец, вы можете запустить Filebeat:
|
1 2 |
sudo systemctl start filebeat sudo systemctl enable filebeat |
Теперь пришло время протестировать конфигурацию Elastic Stack. Если все настроено правильно, вывод будет выглядеть примерно так:
|
1 |
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty' |
Если в выводе указано 0 совпадений (total hits), это означает, что Elasticsearch не загружает логи по искомому индексу. Это указывает на ошибку в конфигурации. Если вывод соответствует ожиданиям, значит, Elastic Stack успешно настроен.
Обзор дашбордов Kibana
Теперь пришло время изучить веб-интерфейс Kibana, который мы уже установили. Сначала откройте дашборд Kibana. Он должен быть доступен по FQDN или публичному IP-адресу сервера Elastic Stack:
|
1 |
http://<server_ip>:5601 |
Введите учетные данные для входа, которые мы сгенерировали ранее. После входа в систему дашборд будет выглядеть следующим образом:
В левой панели навигации выберите «Discover». Затем выберите шаблон «filebeat-*». Здесь отображаются все логи, собранные за последние 15 минут. Вы можете искать и просматривать логи, а также настраивать дашборд:
В левой панели навигации перейдите в Dashboard >> Filebeat System. Здесь доступны все примеры дашбордов из системного модуля Filebeat.
В следующем примере подробно описана различная статистика на основе сообщений syslog:
Он также может сообщать, какие пользователи выполняли команды с помощью sudo:
Наконец, Kibana дает вам возможность изучить множество других функций, таких как построение графиков и фильтрация, так что не стесняйтесь исследовать их самостоятельно.
Заключительные мысли
Elastic Stack — это мощное решение для анализа системных логов. Имейте в виду, что хотя любые логи или индексированные данные могут быть отправлены в Logstash с помощью Beats, они становятся более полезными, когда анализируются и структурируются с помощью фильтров Logstash.
Приятной работы!









Комментарии
Комментариев пока нет. Будьте первым.