Подключение стека Elasticsearch, Logstash и Kibana (ELK) в Docker Compose
Важно
- Версия внешнего сервиса должна совпадать с версией, указанной в файле
docker-compose.yml
. - В качестве примера в этой инструкции используется проект с именем
testit
. Вы можете использовать другое название.
Настройка внешнего подключения
При настройке стека ELK укажите в
.env
-файле следующие параметры соответственно вашей конфигурации:ELASTICSEARCH_CONNECTION_STRING=http://external-server:9200 (где external-server — IP-адрес или DNS-имя вашего сервера с Elasticsearch) ELASTICSEARCH_INDEX= (заданное вами имя индекса для Test IT) ELASTICSEARCH_LOGS_INDEX= (заданное вами имя индекса логов) LOGSTASH_CONNECTION_STRING=http://external-server:5044 (где external-server — IP-адрес или DNS-имя вашего сервера с Logstash)
В файле
docker-compose.yml
выполните следующие действия:Добавьте следующую строку в секцию
webapi
, разделenvironment
:Serilog__UserActionAll__WriteTo__1__Args__requestUri: "${LOGSTASH_CONNECTION_STRING:-http://logstash:5044}"
Добавьте следующую строку в секцию
auth
, разделenvironment
:Serilog__AdminAll__WriteTo__1__Args__requestUri: "${LOGSTASH_CONNECTION_STRING:-http://logstash:5044}"
Закомментируйте секции с сервисами Elasticsearch, Logstash, Kibana, зависимости от него других контейнеров (все упоминания
elasticsearch
,logstash
,kibana
в блокахdepends_on
) иelastic-volume
в спискеvolumes
.
Перезапустите систему Test IT:
docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120 --remove-orphans
Настройка безопасного соединения и аутентификации между компонентами ELK
После выполнения данной инструкции соединение между контейнерами logstash
, elasticsearch
, kibana
и webapi
будет происходить по TLS протоколу.
Создайте конфигурационные файлы для генерации самоподписанных сертификатов:
create-certs.yml
version: '2.2' services: create_certs: image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION} container_name: create_certs command: > bash -c ' yum install -y -q -e 0 unzip; if [[ ! -f /certs/bundle.zip ]]; then bin/elasticsearch-certutil cert --silent --pem --in config/certificates/instances.yml -out /certs/bundle.zip; unzip /certs/bundle.zip -d /certs; fi; chown -R 1000:0 /certs ' working_dir: /usr/share/elasticsearch volumes: - ./certs:/certs - .:/usr/share/elasticsearch/config/certificates networks: - elastic volumes: certs: driver: local networks: elastic: driver: bridge
create-certs.env
COMPOSE_PROJECT_NAME=testit VERSION=7.17.5
instances.yml
instances: - name: elasticsearch dns: - elasticsearch - localhost ip: - 127.0.0.1 - name: logstash dns: - logstash - localhost ip: - 127.0.0.1 ## Раскомментируйте строки ниже, чтобы настроить HTTPS для Kibana # - name: 'kibana' # dns: # - kibana # - localhost
Сгенерируйте сертификаты.
docker compose -f create-certs.yml --env-file create-certs.env run --rm create_certs
После того, как инструкции в контейнере будут выполнены, в текущей директории появится папка
certs
с сгенерированными сертификатами. Там должны находиться директорияca
и директории с названиями сервисов изinstances.yml
.Конвертируйте ключ сертификата
logstash.key
в форматpkcs8
.openssl pkcs8 -in ./certs/logstash/logstash.key -topk8 -nocrypt -out ./certs/logstash/logstash.key
Измените владельца файлов
logstash.key
иlogstash.crt
на пользователяlogstash (uid 1000)
.chown 1000 ./certs/logstash/logstash.*
Скопируйте содержимое директории
certs
в вольюмelk-tls-volume
.elk_certs=$(docker inspect testit_elk-tls-volume --format '{{ .Mountpoint }}') cp -r certs/* ${elk_certs}/
Скопируйте корневой сертификат
certs/ca/ca.crt
в вольюмtrusted-certificates-volume
, переименовав его вelk_ca.crt
, чтобы избежать перезаписи уже существующих сертификатов в данном вольюме.trusted_certs=$(docker inspect testit_trusted-certificates-volume --format '{{ .Mountpoint }}') cp certs/ca/ca.crt ${trusted_certs}/elk_ca.crt
В файле
.env
раскомментируйте строки, конфигурирующие SSL, и замените протокол в переменной ELASTICSEARCH_CONNECTION_STRING и LOGSTASH_CONNECTION_STRING на HTTPS.ELASTICSEARCH_CONNECTION_STRING=https://elasticsearch:9200 LOGSTASH_CONNECTION_STRING=https://logstash:5044 ... ELASTICSEARCH_SECURITY_ENABLED=true ELASTICSEARCH_SSL_ENABLED=true ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=/usr/share/elasticsearch/config/certificates/ca/ca.crt
В файле
docker-compose.elk.yml
раскомментируйте строки, указывающие пути к сертификатам.elasticsearch
xpack.security.http.ssl.certificate_authorities: "${ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES:-/usr/share/elasticsearch/config/certificates/ca/ca.crt}" xpack.security.http.ssl.key: /usr/share/elasticsearch/config/certificates/elasticsearch/elasticsearch.key xpack.security.http.ssl.certificate: /usr/share/elasticsearch/config/certificates/elasticsearch/elasticsearch.crt
logstash
ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES: "${ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES:-/usr/share/elasticsearch/config/certificates/ca/ca.crt}" SERVER_SSL_KEY: /usr/share/elasticsearch/config/certificates/logstash/logstash.key SERVER_SSL_CERTIFICATE: /usr/share/elasticsearch/config/certificates/logstash/logstash.crt
kibana
ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES: "${ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES:-/usr/share/elasticsearch/config/certificates/ca/ca.crt}" SERVER_SSL_KEY: /usr/share/elasticsearch/config/certificates/kibana/kibana.key SERVER_SSL_CERTIFICATE: /usr/share/elasticsearch/config/certificates/certificates/kibana/kibana.crt
После применения описанных выше настроек Kibana, Logstash и контейнер
webapi
не будут иметь возможности подключиться к Elasticsearch. Для подключения необходимо сгенерировать пароли для системных пользователейelasticsearch
с помощью утилитыelasticsearch-setup-passwords
.docker exec testit-elasticsearch-1 /bin/bash -c "bin/elasticsearch-setup-passwords auto --batch --url https://elasticsearch:9200"
Важно
Сохраните сгенерированные пароли в безопасном месте. Они понадобятся для конфигурации подключения контейнеров к
elasticsearch
, а также для аутентификации в Kibana.Укажите сгенерированные пароли в файле
.env
, раскомментировав следующие строки.ELASTICSEARCH_AUTH_ENABLED=true ELASTICSEARCH_USERNAME=elastic ELASTICSEARCH_PASSWORD=pass KIBANA_ELASTICSEARCH_USERNAME=kibana_system KIBANA_ELASTICSEARCH_PASSWORD=pass LOGSTASH_ELASTICSEARCH_USERNAME=elastic LOGSTASH_ELASTICSEARCH_PASSWORD=pass
В данном случае для доступа
logstash
вelasticsearch
используется супер-пользовательelastic
. Для дополнительной безопасности вы можете ограничить праваlogstash
, создав отдельную учетную запись. Пример создания такой учетной записи можно найти в документации Elastic.Измените конфигурацию пайплайна logstash в файле
/config_files/logstash/logstash.conf
с учетом необходимости безопасного соединения. Пример файла с настройками для безопасного соединения вы можете найти в разделе Возможность конфигурирования Logstash.Примените настройки, перезапустив систему.
docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120
Возможность конфигурирования Logstash
Для внесения изменений в конфигурацию сбора логов из Test IT, вы можете редактировать файл ./config_files/logstash/logstash.conf
в поставке Test IT по своему усмотрению.
Внимание
Не переименовывайте файл и не меняйте путь к нему! Файл примонтирован как вольюм в контейнер logstash.
- После первого внесения изменений в файл, выполните команду:
chown 1000 ./config_files/logstash/logstash.conf
Это необходимо, чтобы пользователь logstash в контейнере получил к файлу доступ.
После внесения любых изменений в файл logstash.conf обязательно выполняйте перезапуск контейнера logstash:
docker restart testit-logstash-1
Обратите внимание, что при создании собственной ILM политики рекомендуется указывать кастомное имя и не использовать имя по умолчанию (action_logs_policy), так как политика с данным именем будет приведена к настройкам по умолчанию при каждом старте контейнера logstash. Чтобы применить новую политику, после ее создания измените имя политики в файле
./config_files/logstash/logstash.conf
в следующей строке:ilm_policy => "<policy_name>" где <policy_name> — имя созданной вами политики.
Затем удалите index template ("action_logs" по умолчанию), к которому хотите применить политику, и выполните рестарт контейнера logstash. Все создаваемые далее индексы будут использовать новую ILM политику. Если необходимо, чтобы текущий индекс использовал новую политику, укажите ее название в настройках индекса, например в веб-интерфейсе kibana.
Важно
Если вы планируете использовать ssl в стеке Elk, пожалуйста, обратитесь к руководству по настройке защищенного соединения.
Пример конфигурации в файле logstash.conf с включенным ssl (развернуть)
input {
http {
type => "action"
codec => json
port => 5044
ssl => "${ELASTICSEARCH_SSL_ENABLED}"
ssl_certificate => "${SERVER_SSL_CERTIFICATE}"
ssl_key => "${SERVER_SSL_KEY}"
}
}
filter {
if [type] == "action" {
split {
field => "events"
target => "e"
remove_field => "events"
}
}
}
output {
if [type] == "action" {
elasticsearch {
hosts => "${ELASTICSEARCH_CONNECTION_STRING}"
user => "${ELASTICSEARCH_USERNAME:}"
password => "${ELASTICSEARCH_PASSWORD:}"
cacert => "${ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES}"
ilm_enabled => true
ilm_rollover_alias => "action_logs"
ilm_pattern => "{now/d{dd.MM.yyyy}}-000001"
ilm_policy => "action_logs_policy"
}
}
}