Thank you for reading this post, don't forget to subscribe!
Предварительно уже должен быть установлен ELK стек
То есть имеем базовую систему, готовую к принятию логов. Авторизация не настроена, TLS на самих сервисах Elasticsearch и Kibana не настроен. Прямой доступ для всех и отовсюду. Я подобные конфигурации обычно защищаю на уровне firewall или списков allow, deny в nginx, который выступает в качестве proxy.
Настройка базовой безопасности в Elasticsearch
Начнём настройку с того, что выполним базовые рекомендации по безопасности в кластере elasticsearch. Для этого активируем настройку xpack.security. Добавляем в конфиг elasticsearch:
1 |
xpack.security.enabled: true |
После этого перезапустите службу elasticsearch:
1 |
# systemctl restart elasticsearch |
Теперь сгенерируем пароли к встроенным учётным записям (built-in users) elastic. Для этого запускаем утилиту elasticsearch-setup-passwords. По умолчанию она находится в папке /usr/share/elasticsearch/bin.
# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Сохраните где-то эти учетные данные. Они нам понадобятся далее, а больше вы их нигде не увидите. Более подробно о работе этой утилиты читайте в документации - elasticsearch-setup-passwords.
В настоящий момент Kibana не будет иметь доступ к кластеру. Чтобы это исправить, добавьте в её конфигурационный файл параметры:
1 2 3 |
xpack.security.enabled: true elasticsearch.username: "kibana_system" elasticsearch.password: "fDhdXdVfpGc9iAWKcu0w" |
Перезапустите Kibana:
1 |
# systemctl restart kibana |
Доступ через web интерфейс снова будет доступен, только теперь необходимо пройти встроенную в Kibana авторизацию. Для этого используйте созданный ранее пароль для учётной записи elastic.
Если используете Logstash, то для него тоже необходим доступ с использованием учетной записи, которую надо создать. Как это сделать, подробно описано в инструкции - Configuring Security in Logstash. Необходимо в Kibana перейти в раздел Stack Management -> Roles и добавить роль logstash_writer. Права сделать следующие:
- cluster - manage_index_templates и monitor
- indices - выбрать индексы, которые создает logstash и назначить им права all.
Затем переходите в раздел Users, добавляете пользователя logstash_writer, указываете пароль и назначаете ему ранее добавленную роль. После этого в конфигурации logstash, отвечающей за правила output, добавьте информацию об этой учетной записи:
1 2 3 4 5 6 7 8 9 |
output { elasticsearch { <strong>user => logstash_internal</strong> <strong>password => OMOFYuIOFcHLDyCBnzGU</strong> hosts => "localhost:9200" index => "nginx-%{+YYYY.MM.dd}" } } |
Перезапустите logstash:
1 |
# systemctl restart logstash |
Если всё в порядке, то переходите к следующему разделу. Если что-то не работает, то разбирайтесь для начала с этой настройкой.
Настройка TLS в Elasticsearch
Далее нам нужно настроить возможность соединения с elasticsearch по tls. Без этого не заработает авторизация через api_key, которую будет использовать служба Enterprise Search. Для этого сгенерируем самоподписанные сертификаты, используя утилиту elasticsearch-certutil. Сгенерируем с её помощью CA сертификат, которым будем подписывать все остальные.
1 2 |
# /usr/share/elasticsearch/bin/elasticsearch-certutil ca |
Созданный сертификат будет положен в директорию /usr/share/elasticsearch. Теперь сгенерируем клиентский сертификат с использованием CA, выпущенного ранее.
1 |
# /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 |
На выходе получим файл elastic-certificates.p12, который включает в себя сам сертификат, приватный ключ и CA. В общем, полный набор, который нам необходим. Копируем оба сертификата в /etc/elasticsearch. И обязательно назначьте права доступа к этим сертификатам пользователю elasticsearch.
1 2 3 |
# cd /etc/elasticsearch # chown root:elasticsearch elastic-stack-ca.p12 elastic-certificates.p12 # chmod 0660 elastic-stack-ca.p12 elastic-certificates.p12 |
Редактируем конфигурационный файл elasticsearch, добавляя туда следующие параметры:
1 2 3 4 5 6 |
xpack.security.authc.api_key.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.client_authentication: required xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12 |
Перезапустите elasticsearch и проверьте, что всё в порядке. Этих минимальных настроек будет достаточно для работы Elastic Enterprise Search. При желании, можно и все http запросы к кластеру настроить на https, но у меня не получилось это сделать с самоподписанным сертификатом, только с настоящим. В Kibana можно было настроить доверие к самоподписанному сертификату, а в Elastic Enterprise Search не получилось. Я не стал сильно разбираться и просто взял валидный сертификат.
Если вы хотите все, чтобы все запросы к кластеру были по https, то добавьте дополнительно следующие параметры:
1 2 3 4 |
xpack.security.http.ssl.enabled: true xpack.security.http.ssl.key: /etc/elasticsearch/private.key xpack.security.http.ssl.certificate: /etc/elasticsearch/cert.pem xpack.security.http.ssl.certificate_authorities: /etc/elasticsearch/ca-bundle.pem |
В данном случае используется действующий сертификат, купленный на год. Можно использовать и бесплатные сертификаты от Let's Encrypt, но придётся рассмотреть отдельно вопрос перезапуска всех служб, которые будут зависеть от этих сертификатов. Также во всех службах, которые будут обращаться к elasticsearch, надо не забывать указывать подключение через https, а не http и обязательно по имени домена, на который выпущен этот сертификат. Так что не забудьте с dns отдельно разобраться, чтобы все запросы были только по доменному имени, иначе службы будут ругаться на несоответствие адреса и записи домена в сертификате. Ну и сами сертификаты надо будет указать (key, crt, bundle), по аналогии с настройками elasticsearch.
Установка Elastic Enterprise Search
Перед установкой EES надо установить версию Java 8 или 11. На этом моменте я сильно завис, когда первый раз настраивал Elastic Enterprise Search. Дело в том, что в комплекте с elasticsearch уже идёт jdk. Она находится в директории - /usr/share/elasticsearch/jdk. Я пытался её подсунуть EES, чтобы не ставить еще раз java. Делал этот через объявление PATH с нужным путём в юните systemd - /usr/lib/systemd/system/enterprise-search.service. Добавлял туда:
1 |
Environment=PATH=<strong>/usr/share/elasticsearch/jdk</strong>:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin |
Если не добавлять вручную путь к java, то Enterprise Search ругается во время запуска:
1 |
enterprise-search[86191]: Could not find java in PATH |
После добавления PATH служба запускалась и даже начинала работать, но сыпала различные ошибки и по факту не работала, только делала вид. В логе было предупреждение на несоответствие версии java, но я изначально не придавал ему значения, думая, что это формальность. И только когда установил 8 или 11 версию, все заработало.
Так что ставим openjdk 11 в систему:
1 |
# dnf install java-11-openjdk-devel |
После установки java сама пропишет себя в /usr/bin/java, так что отдельно настраивать PATH для enterprise-search не придётся.
Теперь идём на страницу загрузки, скачиваем пакет под свою систему. В случае с rpm это будет следующая последовательность действий:
1 2 |
# wget https://artifacts.elastic.co/downloads/enterprise-search/enterprise-search-7.15.0.rpm # rpm -ivh enterprise-search-7.15.0.rpm |
Перед этим пробовал установить из стандартного репозитория elastic, но оттуда почему-то предлагается к установке пакет неподходящей архитектуры.
Так что пришлось устанавливать вручную. После установки, нам надо отредактировать конфигурационный файл /usr/share/enterprise-search/config/enterprise-search.yml. Добавляем туда:
1 2 3 4 |
elasticsearch.username: elastic elasticsearch.password: m97KOnUDTBVAaNetJdEG allow_es_settings_modification: true kibana.external_url: http://10.30.52.6:5601 |
Учётетную запись elastic мы настроили в самом начале. Это она же, встроенная (built-in). И не забудьте ip для web интерфейса kibana поменять на свой. Если настроили https, то доступ должен быть по доменному имени. Запускайте и добавляйте сразу в автозагрузку службу.
1 |
# systemctl enable --now enterprise-search |
Смотрим лог /var/log/enterprise-search/app-server.log. Там будет ошибка:
1 2 3 4 5 6 7 8 |
Invalid config file (/usr/share/enterprise-search/config/enterprise-search.yml): The setting '#/secret_management/encryption_keys' is not valid No secret management encryption keys were provided. Your secrets cannot be stored unencrypted. You can use the following generated encryption key in your config file to store new encrypted secrets: secret_management.encryption_keys: [f37a2e899b47e4749cc6c1ba01e8cfc27da9f367f0795caaed0c98e52f9dff83] |
Сохраните нужную настройку и добавьте её в в конфиг enterprise-search.yml:
secret_management.encryption_keys: [f37a2e899b47e4749cc6c1ba01e8cfc27da9f367f0795caaed0c98e52f9dff83]
Снова запускайте enterprise-search:
1 |
# systemctl start enterprise-search |
Теперь ошибок быть не должно. Проверьте системный лог /var/log/messages. Там будет информация о встроенной учетной записи enterprise_search. Её надо сохранить. Пригодится, если будете напрямую заходить в веб интерфейс enterprise-search, минуя Kibana.
Дождитесь, когда Elastic Enterprise Search закончит создание всех необходимых сущностей в кластере:
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
[2021-10-11T15:54:49.754+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: connectors_jobs_v5 [2021-10-11T15:54:49.767+00:00][2355404][2002][app-server][WARN]: Index .ent-search-actastic-connectors_jobs_v5 already exists! [2021-10-11T15:54:49.800+00:00][2355404][2002][app-server][WARN]: Going to re-create the existing empty index .ent-search-actastic-connectors_jobs_v5 [2021-10-11T15:54:55.217+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: synonyms [2021-10-11T15:54:59.473+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: document_types_v2 [2021-10-11T15:55:12.301+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_access_grants [2021-10-11T15:55:22.925+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_access_tokens [2021-10-11T15:55:40.138+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_applications_v2 [2021-10-11T15:55:49.517+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: engines_v15 [2021-10-11T15:56:05.271+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_accounts_v16 [2021-10-11T15:56:15.427+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_content_sources_v21 [2021-10-11T15:56:21.023+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_content_source_user_identities_v3 [2021-10-11T15:56:25.353+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_search_groups_v4 [2021-10-11T15:56:34.451+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_invitations_v2 [2021-10-11T15:56:44.807+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_organizations_v16 [2021-10-11T15:56:49.598+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_pre_content_sources [2021-10-11T15:56:58.891+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_role_mappings_v5 [2021-10-11T15:57:04.437+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_accounts_v9 [2021-10-11T15:57:14.853+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_api_tokens_v3 [2021-10-11T15:57:24.495+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_api_token_engines [2021-10-11T15:57:29.830+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_crawler_content_metadata [2021-10-11T15:57:41.719+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_crawler_content_url_metadata [2021-10-11T15:57:47.143+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_document_positions [2021-10-11T15:57:52.198+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_document_position_queries_v3 [2021-10-11T15:57:57.403+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_invitations_v3 [2021-10-11T15:58:01.884+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_roles_v3 [2021-10-11T15:58:07.157+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_engines_v3 [2021-10-11T15:58:13.895+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_search_settings [2021-10-11T15:58:19.811+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_mappings_v4 [2021-10-11T15:58:23.893+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_mapping_engines_v3 [2021-10-11T15:58:33.492+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: reindex_jobs [2021-10-11T15:58:39.493+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: secret_keeper_secrets [2021-10-11T15:58:44.220+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_domains_v4 [2021-10-11T15:58:53.884+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_crawl_requests_v4 [2021-10-11T15:59:01.565+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_process_crawls [2021-10-11T15:59:07.820+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_robots_txts_v3 [2021-10-11T15:59:11.690+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: telemetry_status_v2 [2021-10-11T15:59:16.037+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: users_v6 [2021-10-11T15:59:29.050+00:00][2355404][2002][app-server][INFO]: Saving 95 Actastic migrations [2021-10-11T15:59:29.489+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating indices for 36 models [2021-10-11T15:59:29.701+00:00][2355404][2002][app-server][INFO]: Found no migrations to run [2021-10-11T15:59:29.701+00:00][2355404][2002][app-server][INFO]: Enterprise Search indices are ready [2021-10-11T15:59:29.797+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating default Elasticsearch roles [2021-10-11T15:59:32.561+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating default Elasticsearch roles [2021-10-11T15:59:33.081+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default Workplace Search organization [2021-10-11T15:59:35.183+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default Workplace Search organization [2021-10-11T15:59:35.437+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default App Search account [2021-10-11T15:59:37.775+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default App Search account [2021-10-11T15:59:38.051+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default user account [2021-10-11T15:59:41.081+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default user account [2021-10-11T15:59:41.441+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default OAuth application [2021-10-11T15:59:42.809+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default OAuth application [2021-10-11T16:00:49.243+00:00][2355404][2002][app-server][INFO]: Starting HTTP server… [2021-10-11T16:00:56.914+00:00][2355404][2154][app-server][INFO]: Enterprise Search version=7.15.0, JRuby version=9.2.13.0, Ruby version=2.5.7, Rails version=5.1.7 [2021-10-11T16:00:58.666+00:00][2355404][2154][app-server][INFO]: Performing pre-flight checks for Elasticsearch running on http://127.0.0.1:9200… [2021-10-11T16:00:58.962+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch cluster is ready [2021-10-11T16:00:58.965+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully connected to Elasticsearch [2021-10-11T16:00:58.986+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully loaded Elasticsearch plugin information for all nodes [2021-10-11T16:00:59.016+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch running with an active basic license [2021-10-11T16:00:59.068+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch API key service is enabled [2021-10-11T16:00:59.069+00:00][2355404][2154][app-server][INFO]: [pre-flight] ILM is enabled in Elasticsearch [2021-10-11T16:00:59.069+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch X-Pack security is enabled and will be used for authentication [2021-10-11T16:00:59.071+00:00][2355404][2154][app-server][INFO]: Elasticsearch looks healthy and configured correctly to run Enterprise Search [2021-10-11T16:00:59.071+00:00][2355404][2154][app-server][INFO]: Performing pre-flight checks for Kibana running on http://10.30.52.6:5601… [2021-10-11T16:01:00.177+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully connected to Kibana [2021-10-11T16:01:01.260+00:00][2355404][2154][app-server][INFO]: Kibana looks healthy and configured correctly to run Enterprise Search [2021-10-11T16:01:03.785+00:00][2355404][2154][app-server][INFO]: Elastic APM agent is disabled [2021-10-11T16:01:19.148+00:00][2355404][2154][app-server][INFO]: ######################################################### Success! Elastic Enterprise Search is starting successfully. In a few moments, you'll be able to access Enterprise Search from Kibana at the following address: * URL: http://10.30.52.6:5601/app/enterprise_search/overview * If this is your first time starting Enterprise Search, check the console output above for your user authentication credentials. * Visit the documentation: https://www.elastic.co/guide/en/enterprise-search/7.15/index.html Secret session key has been generated. Set the key in your config file to persist user sessions through process restarts: secret_session_key: 5dd0ce292ac448979f7dc8652a610dd84e28a383f278a2b07b65154c82e460dd6917980b442e67a2f9e1dff1a80100f2e80b3d5dda5463e8e935fe8af9466af5 ######################################################### |
Проверьте, что служба запущена и слушает свой порт:
1 2 |
# netstat -tulnp | grep <strong>3002</strong> tcp6 0 0 127.0.0.1:<strong>3002</strong> :::* LISTEN 2355404/java |
Всё в порядке. Осталось только добавить в конфиг Kibana информацию о службе:
1 |
enterpriseSearch.host: http://localhost:3002 |
Перезапустите Kibana и отправляйтесь в веб интерфейс, в раздел Enterprise Search.
На этом установка Elastic Enterprise Search закончена, можно начинать использовать. Напомню, что для Self-hosted решения ELK этот функционал бесплатен.