Настройка внешнего подключения стека Elasticsearch, Logstash и Kibana (ELK)

Важно

  • Версия внешнего сервиса должна совпадать с версией, указанной в файле docker-compose.yml.
  • В качестве примера в этой инструкции используется проект с именем testit. Вы можете использовать другое название.

Настройка внешнего подключения

  1. При настройке стека ELK укажите в .env-файле следующие параметры соответственно вашей конфигурации:

    ELASTICSEARCH_CONNECTION_STRING=http://external-server:9200 (где external-server — IP-адрес или DNS-имя вашего сервера с Elasticsearch)
    ELASTICSEARCH_INDEX= (заданное вами имя индекса для TestIT)
    ELASTICSEARCH_LOGS_INDEX= (заданное вами имя индекса логов)
    LOGSTASH_CONNECTION_STRING=http://external-server:5044 (где external-server — IP-адрес или DNS-имя вашего сервера с Logstash)
    
  2. В файле 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.

  3. Перезапустите систему Test IT:

    docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120 --remove-orphans
    

Настройка безопасного соединения и аутентификации между компонентами ELK

После выполнения данной инструкции соединение между контейнерами logstash, elasticsearch, kibana и webapi будет происходить по TLS протоколу.

  1. Создайте конфигурационные файлы для генерации самоподписанных сертификатов:

    • 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
      
  2. Сгенерируйте сертификаты.

    docker compose -f create-certs.yml --env-file create-certs.env run --rm create_certs
    

    После того, как инструкции в контейнере будут выполнены, в текущей директории появится папка certs с сгенерированными сертификатами. Там должны находиться директория ca и директории с названиями сервисов из instances.yml.

  3. Конвертируйте ключ сертификата logstash.key в формат pkcs8.

    openssl pkcs8 -in ./certs/logstash/logstash.key -topk8 -nocrypt -out ./certs/logstash/logstash.key
    
  4. Измените владельца файлов logstash.key и logstash.crt на пользователя logstash (uid 1000).

    chown 1000 ./certs/logstash/logstash.*
    
  5. Скопируйте содержимое директории certs в вольюм elk-tls-volume.

    elk_certs=$(docker inspect testit_elk-tls-volume --format '{{ .Mountpoint }}')
    cp -r certs/* ${elk_certs}/
    
  6. Скопируйте корневой сертификат 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
    
  7. В файле .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
    
  8. В файле 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
      
  9. После применения описанных выше настроек 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.

  10. Укажите сгенерированные пароли в файле .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, создав отдельную учетную запись. Пример создания такой учетной записи можно найти в документации Elasticopen in new window.

  11. Измените конфигурацию пайплайна logstash в файле /config_files/logstash/logstash.conf с учетом необходимости безопасного соединения. Пример файла с настройками для безопасного соединения вы можете найти в разделе Возможность конфигурирования Logstash.

  12. Примените настройки, перезапустив систему.

    docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120
    

Возможность конфигурирования Logstash

Для внесения изменений в конфигурацию сбора логов из Test IT, вы можете редактировать файл ./config_files/logstash/logstash.conf в поставке Test IT по своему усмотрению.

Внимание

Не переименовывайте файл и не меняйте путь к нему! Файл примонтирован как вольюм в контейнер logstash.

  1. После первого внесения изменений в файл, выполните команду:
    chown 1000 ./config_files/logstash/logstash.conf
    

Это необходимо, чтобы пользователь logstash в контейнере получил к файлу доступ.

  1. После внесения любых изменений в файл logstash.conf обязательно выполняйте перезапуск контейнера logstash:

    docker restart testit-logstash-1
    
  2. Обратите внимание, что при создании собственной ILM политики рекомендуется указывать кастомное имя и не использовать имя по умолчанию (action_logs_policy), так как политика с данным именем будет приведена к настройкам по умолчанию при каждом старте контейнера logstash. Чтобы применить новую политику, после ее создания измените имя политики в файле ./config_files/logstash/logstash.conf в следующей строке:

    ilm_policy => "<policy_name>"
    где <policy_name> — имя созданной вами политики.
    
  3. Затем удалите 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"
		    }
	    }
    }

Смотрите также

Обновлено: