Централизованное ведение журналов перестаёт быть роскошью, как только вы запускаете более пары серверов. Просмотр файлов через SSH работает до тех пор, пока не перестаёт работать, а когда в 2 часа ночи происходит инцидент, вам нужны все строки журналов со всех хостов в одном месте с возможностью поиска. Именно эту задачу ELK Stack успешно решает уже более десяти лет, а версия 8 делает его безопасным по умолчанию.
В этом руководстве подробно описана установка Elasticsearch 8, Logstash 8 и Kibana 8 на Ubuntu 26.04 LTS. Вы добавите Filebeat для передачи /var/log/syslog в конвейер, настроите фильтр Logstash grok, установите Nginx с сертификатом Let’s Encrypt перед Kibana и проверите поступление реальных событий syslog в Kibana Discover. В инструкциях предполагается использование одноузловой лабораторной среды, но все шаги остаются такими же для многоузлового производственного кластера.
Протестировано в апреле 2026 года на Ubuntu 26.04 LTS (Resolute Raccoon) с Elasticsearch 8.19.14, Logstash 8.19.14, Kibana 8.19.14, Filebeat 8.19.14, Nginx 1.28.3
Необходимые условия
Elastic 8.x требует большого объёма памяти и большого количества файловых дескрипторов. Если ресурсы хоста занижены, кластер либо откажется запускаться, либо выйдет из строя под нагрузкой.
- Сервер Ubuntu 26.04 LTS (подойдет свежая установка). Если вы начинаете с нуля, в нашем руководстве по начальной настройке сервера Ubuntu 26.04 описаны основные моменты
- Минимум 4 ГБ оперативной памяти для лабораторной среды (лучше 8 ГБ — именно с таким объёмом мы проводили тестирование)
- Не менее 20 ГБ свободного места на диске; индексы быстро растут
- 2 ядра процессора
- Пользователь с правами sudo
- DNS-имя, которое можно настроить для сервера для HTTPS (мы используем
elk-lab.computingforgeeks.com)
Elasticsearch поставляется с собственным встроенным JDK и работает на его основе независимо от того, что установлено на хосте. Для работы стека не требуется отдельная установка Java. Если вы запускаете другие приложения JVM на том же компьютере и хотите использовать системный OpenJDK, следуйте нашему руководству по установке Java OpenJDK на Ubuntu 26.04, но для данного случая это не обязательно.
Шаг 1: Настройка ядра и системы
Elasticsearch отказывается запускаться с значением по умолчанию vm.max_map_count. Увеличьте его сейчас и сделайте это изменение постоянным:
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/elk.conf
Увеличьте ограничение на количество открытых файлов, чтобы Elasticsearch и Logstash могли открывать тысячи сегментных файлов, которые им нужны:
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf
Выйдите из системы и войдите заново, чтобы изменения встроены в вашу оболочку. Модули служб systemd наследуют свои собственные ограничения от пакетов Elastic, поэтому сами службы автоматически применяют их при запуске.
Шаг 2: Добавьте репозиторий APT для Elastic 8.x
Импортируйте ключ подписи Elastic и добавьте источник APT для версии 8.x:
sudo apt update
sudo apt install -y curl gnupg apt-transport-https ca-certificates wget
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | \
sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
Все четыре компонента (Elasticsearch, Kibana, Logstash, Filebeat) поставляются из этого единственного репозитория. У Elastic есть отдельный канал 9.x, но версия 8.x по-прежнему является активно поддерживаемой линейкой LTS, на которой работает большинство производственных развертываний.
Шаг 3: Установка и запуск Elasticsearch
Установите пакет Elasticsearch:
sudo apt install -y elasticsearch
Установщик автоматически генерирует TLS-сертификаты для HTTP-уровня и транспортного уровня, создаёт всех встроенных пользователей и выводит на экран пароль для elastic суперпользователя. Немедленно скопируйте этот пароль и раздел с токеном регистрации из вывода программы установки. Они понадобятся вам на следующем шаге, а Elasticsearch больше не будет их выводить.
Соответствующий раздел выглядит следующим образом:
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : StrongPass123
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Забыли пароль? Сбросьте его с помощью sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic: будет выведен новый пароль.
Настройте размер кучи JVM перед первым запуском. Elasticsearch автоматически настраивает размер кучи примерно на половину объёма оперативной памяти системы, что подходит для выделенного сервера, но является расточительным на общей виртуальной машине в лаборатории. Для хоста с 8 ГБ оперативной памяти, на котором все четыре компонента ELK установлены на одной машине, зафиксируйте размер кучи Elasticsearch на уровне 1 ГБ:
sudo tee /etc/elasticsearch/jvm.options.d/heap.options > /dev/null <<'OPTS'
-Xms1g
-Xmx1g
OPTS
Включите и запустите службу:
sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch.service
Первый запуск занимает от 30 до 60 секунд, пока Elasticsearch записывает своё состояние безопасности на диск. Убедитесь, что он отвечает на HTTPS-порте, используя пароль из вывода программы установки:
curl -sk -u elastic:StrongPass123 https://localhost:9200
Исправный узел возвращает своё имя и версию:
{
"name" : "elk-lab",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "CmHzu1ehRQuOvH5AWLhVPQ",
"version" : {
"number" : "8.19.14",
"build_flavor" : "default",
"build_type" : "deb",
"lucene_version" : "9.12.2"
},
"tagline" : "You Know, for Search"
}
Флаг -k пропускает проверку сертификата, поскольку автоматически сгенерированный центр сертификации (CA) отсутствует в системном хранилище доверенных сертификатов. Это допустимо для внутренних вызовов с того же хоста.
Шаг 4: Установка и регистрация Kibana
Установите Kibana:
sudo apt install -y kibana
Kibana 8 требует токен регистрации для подключения к Elasticsearch. Сгенерируйте его на узле Elasticsearch:
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Команда выведет длинный BLOB-объект в формате base64. Этот BLOB-объект представляет собой учетные данные с ограниченным сроком действия, которые Kibana будет использовать для подключения, получения сертификата центра сертификации и создания собственной учетной записи службы. Введите его непосредственно в программу настройки Kibana:
sudo /usr/share/kibana/bin/kibana-setup --enrollment-token "<PASTE-TOKEN-HERE>"
Успешное выполнение выглядит следующим образом:
- Configuring Kibana...
✔ Kibana configured successfully.
To start Kibana run:
bin/kibana
Привяжите Kibana к localhost, чтобы с ней взаимодействовал только Nginx, и укажите её публичный URL, чтобы сгенерированные ссылки работали корректно:
sudo sed -i 's|^#server.host: .*|server.host: "127.0.0.1"|' /etc/kibana/kibana.yml
sudo sed -i 's|^#server.publicBaseUrl: .*|server.publicBaseUrl: "https://elk-lab.computingforgeeks.com"|' /etc/kibana/kibana.yml
sudo systemctl enable --now kibana
На первую инициализацию Kibana уходит около 30 секунд. Если вы нетерпеливы, просмотрите журнал: sudo journalctl -u kibana -f.
Ошибка: «Сервер Kibana ещё не готов»
Если браузер застрянет на этом сообщении более 60 секунд, это означает, что Kibana не смогла подключиться к Elasticsearch. Три распространённые причины: пароль Elasticsearch был сменён, а Kibana по-прежнему использует устаревшие kibana_system учетные данные, путь к сертификату в /etc/kibana/kibana.yml указывает на несуществующий файл или Elasticsearch не запустился. Проверьте эти причины в указанном порядке с помощью sudo journalctl -u kibana -n 100.
Шаг 5: Установка и настройка Logstash
Установите пакет Logstash:
sudo apt install -y logstash
Logstash должен обмениваться данными с Elasticsearch по HTTPS, используя тот же сертификат центра сертификации (CA), который сгенерировал Elasticsearch. Скопируйте сертификат CA в каталог конфигурации Logstash:
sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/logstash/http_ca.crt
sudo chmod 644 /etc/logstash/http_ca.crt
Также уменьшите размер кучи Logstash. 512 МБ вполне достаточно для лабораторной среды с одним узлом:
sudo sed -i 's|^-Xms.*|-Xms512m|; s|^-Xmx.*|-Xmx512m|' /etc/logstash/jvm.options
Создайте конвейер, который принимает входные данные от Beats, анализирует строки syslog с помощью шаблона grok и отправляет результат в Elasticsearch:
sudo nano /etc/logstash/conf.d/syslog-pipeline.conf
Вставьте эту конфигурацию. Замените пароль на тот, который был указан в шаге 3:
input {
beats {
port => 5044
}
}
filter {
if [fileset][name] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_host} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
}
}
}
output {
elasticsearch {
hosts => ["https://localhost:9200"]
index => "logstash-syslog-%{+YYYY.MM.dd}"
user => "elastic"
password => "StrongPass123"
ssl_certificate_authorities => ["/etc/logstash/http_ca.crt"]
}
}
Для производственной среды замените учетные данные суперпользователя elastic на учетные данные выделенной роли. Самый быстрый способ — создать роль с write и create_index на logstash-*, назначить её новому пользователю и указать этого пользователя здесь. Использование «elastic» в конфигурации конвейера — это упрощение для лабораторных условий, а не шаблон, который следует сохранять.
Запустите Logstash:
sudo systemctl enable --now logstash
Первый запуск происходит медленно. Logstash тратит до 45 секунд только на компиляцию своего конвейера и открытие порта 5044. Просмотрите журнал один раз и дождитесь сообщения «Successfully started Logstash API endpoint»:
sudo journalctl -u logstash -f
Шаг 6: Установите Filebeat для передачи syslog
Filebeat — это лёгкий модуль передачи данных, который отслеживает файлы и пересылает их в Logstash. Установите его из того же репозитория:
sudo apt install -y filebeat
Замените конфигурацию по умолчанию на такую, которая отслеживает syslog и отправляет данные на вход Logstash Beats:
sudo tee /etc/filebeat/filebeat.yml > /dev/null <<'YAML'
filebeat.inputs:
- type: filestream
id: syslog
enabled: true
paths:
- /var/log/syslog
- /var/log/auth.log
fields:
fileset:
name: syslog
fields_under_root: true
output.logstash:
hosts: ["localhost:5044"]
logging.level: info
YAML
Включите и запустите службу:
sudo systemctl enable --now filebeat
Создайте тестовую строку журнала и подождите несколько секунд, пока весь конвейер (от Filebeat через Logstash до Elasticsearch) не обработает её:
logger "Hello from the ELK Stack test"
sleep 10
curl -sk -u elastic:StrongPass123 "https://localhost:9200/_cat/indices/logstash*?v"
Новый индекс с сегодняшней датой подтверждает, что конвейер работает от начала до конца:
health status index pri rep docs.count store.size
yellow open logstash-syslog-2026.04.14 1 1 2542 1.3mb
Жёлтый индикатор работоспособности является нормальным для кластера с одним узлом. Жёлтый цвет означает, что первичные шарды выделены, но реплики выделить невозможно (для их размещения есть только один узел). Добавление второго узла автоматически сменит цвет индикатора на зелёный.
Шаг 7: Обратный прокси Nginx с SSL-сертификатом Let’s Encrypt
Kibana прослушивает обычный HTTP на 127.0.0.1:5601. Установите перед ним Nginx с настоящим сертификатом, чтобы можно было безопасно подключаться к нему из любого места. Если вы еще не знакомы с Nginx, подробности можно найти в нашем полном руководстве «Nginx на Ubuntu 26.04 с Let’s Encrypt».
Установите Nginx и certbot с плагином Cloudflare DNS. Проверка DNS работает даже если у сервера нет публичного IP-адреса, что удобно для лабораторных виртуальных машин, находящихся за NAT:
sudo apt install -y nginx certbot python3-certbot-dns-cloudflare
Создайте файл с учетными данными, содержащий ваш токен API Cloudflare, и обеспечьте его безопасность:
echo "dns_cloudflare_api_token = your-cloudflare-token-here" | sudo tee /etc/letsencrypt/cloudflare.ini
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
Укажите elk-lab.computingforgeeks.com IP-адрес сервера в DNS Cloudflare (прокси выключен, серое облако), затем выпустите сертификат:
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d elk-lab.computingforgeeks.com \
--non-interactive --agree-tos -m [email protected]
Certbot записывает сертификат и ключ в /etc/letsencrypt/live/elk-lab.computingforgeeks.com/. Настройте виртуальный хост Nginx, который завершает соединение TLS на этом сервере и проксирует остальное в Kibana:
sudo nano /etc/nginx/sites-available/elk-lab
Вставьте следующую конфигурацию:
server {
listen 80;
server_name elk-lab.computingforgeeks.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name elk-lab.computingforgeeks.com;
ssl_certificate /etc/letsencrypt/live/elk-lab.computingforgeeks.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/elk-lab.computingforgeeks.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5601;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
}
}
Включите сайт и перезагрузите Nginx:
sudo ln -sf /etc/nginx/sites-available/elk-lab /etc/nginx/sites-enabled/elk-lab
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Откройте порты 80 и 443 в UFW:
sudo ufw allow 'Nginx Full'
Certbot создаёт таймер systemd, который обновляет сертификат два раза в день. Убедитесь, что он работает, не выполняя фактического обновления:
sudo certbot renew --dry-run
Шаг 8: Войдите в Kibana и изучите данные
Перейдите по адресу https://elk-lab.computingforgeeks.com. Вы попадёте на экран входа в Elastic:
Войдите, указав имя пользователя elastic и пароль из шага 3. При первом входе в систему Kibana предложит настроить примерные данные: пропустите этот шаг и перейдите в Управление → Управление стеком → Управление индексами. Вы должны увидеть logstash-syslog-* индекс с реальным количеством документов и объёмом хранилища:
Далее создайте представление данных, чтобы Discover мог выполнять запросы к логам. Перейдите в «Управление стеком» → «Представления данных» → «Создать представление данных», задайте имя Syslog, шаблон индекса — logstash-*, а поле временной метки — на @timestamp. Сохраните настройки.
Откройте меню «гамбургер» и нажмите «Discover». Установите в выборе времени значение «Последние 24 часа», если в диапазоне по умолчанию (15 минут) ничего не отображается. События из /var/log/syslog поступают вместе с host.name, messageи всех полей Grok:
Гистограмма вверху показывает скорость поступления данных во времени. В ходе нашего теста Filebeat передал около 3 970 документов в течение первого часа после включения конвейера. Это включает в себя обычные записи systemd, cron и sshd, а также все события аутентификации, сгенерированные хостом.
Быстрая проверка состояния из терминала подтверждает, что все четыре службы активны:
Отсюда вы можете создавать информационные панели в «Аналитика» → «Панель мониторинга», создавать сохраненные поиски или настраивать оповещения в разделе «Управление стеком» → «Правила».
Укрепление безопасности в производственной среде
Описанная выше лабораторная среда с одним узлом отлично подходит для изучения стека. Прежде чем запускать её для производственных рабочих нагрузок, необходимо усилить безопасность в нескольких аспектах.
Удалите суперпользователя elastic из Logstash. Создайте роль с manage_index_templates, monitorи write/create_index на logstash-*. Назначьте её новому пользователю с именем logstash_writer. Обновите /etc/logstash/conf.d/syslog-pipeline.conf , чтобы использовать этого пользователя. Учётная запись elastic должна существовать только на случай чрезвычайных ситуаций.
Перейдите на кластер из трёх узлов Elasticsearch. Кластер с одним узлом не может иметь реплик, поэтому любой сбой диска или хоста приведёт к потере данных. Три узла, подходящих для роли мастера, — это минимум для производственной среды. В документации Elastic это указано как требование к формированию кластера, а не как рекомендация.
Настройте управление жизненным циклом индексов. Объёмы системных журналов быстро растут. Создайте политику ILM, которая будет переносить индексы при достижении 50 ГБ или по истечении 30 дней, перемещать старые индексы в «теплый» уровень хранения через 7 дней и удалять их через 90 дней. В Kibana для этого предусмотрен интерфейс в разделе «Управление стеком» → «Политики жизненного цикла индексов».
Добавьте резервное копирование с помощью моментальных снимков. Настройте репозиторий S3 или общий NFS-репозиторий и запланируйте ежедневные снимки с помощью SLM (управление жизненным циклом снимков). Потеря индекса из-за некорректного изменения отображения происходит чаще, чем сбой оборудования.
Осуществляйте мониторинг самого стека. Включите встроенный модуль мониторинга стека Elastic и настройте его на отдельный небольшой кластер, чтобы система самодиагностики продолжала работать даже при сбое кластера. Если вы предпочитаете внешний мониторинг, Prometheus на Ubuntu 26.04 корректно собирает данные из экспортера Elasticsearch, а Grafana отображает дашборды. В качестве более простой альтернативы Netdata из коробки отслеживает кучу JVM и поведение GC.
Если вы также планируете передавать логи из контейнерных рабочих нагрузок, Filebeat имеет режим автоматического обнаружения, который отлично сочетается с Docker на Ubuntu 26.04. Для сбора метрик на уровне хоста и приложений наряду с логами Zabbix или Nagios дополняют возможности ELK.