Безопасность по умолчанию в Elasticsearch 8
Если вы запускаете ES 7 и ES 8 рядом — разница бросается в глаза сразу. Там где раньше был простой HTTP, теперь HTTPS. Там где раньше можно было слать запросы без логина — теперь нужны имя пользователя и пароль. Это не баг и не что-то, что нужно специально включить: в Elasticsearch 8 security включена из коробки и работает с первой секунды.
Что именно это значит на практике — разберём по шагам.
Что включается автоматически при первом старте
При самом первом запуске нового кластера ES 8 делает три вещи без вашего участия:
1. Генерирует TLS-сертификаты — для шифрования трафика между нодами (transport layer) и для REST API (HTTP layer). Файлы появляются в каталоге конфигурации:
- http_ca.crt — корневой CA-сертификат, которым подписаны все HTTP-сертификаты кластера;
- http.p12 — keystore с сертификатом и ключом для HTTPS;
- transport.p12 — аналогичный файл для межнодового транспорта.
2. Задаёт пароль для встроенного суперпользователя elastic и печатает его в стандартный вывод. Важный нюанс: при установке через RPM или Debian-пакет пароль не выводится автоматически — его нужно сбросить вручную (об этом ниже).
3. Создаёт enrollment-токен для Kibana — временную строку, по которой Kibana сама подключится к кластеру и получит нужные сертификаты. Токен действует 30 минут.
В итоге, когда ES поднялся, в терминале вы увидите примерно такой блок:
✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.
Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
M0nPass_w0rd
HTTP CA certificate SHA-256 fingerprint:
d5:b8:3b:...
Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana first starts.
• Copy the following enrollment token and paste it into Kibana in your browser:
eyJ2ZXIiOiI4LjEuM...
Configure other nodes to join this cluster:
Copy the following enrollment token and run...> ⚠️ Если вы запустили ES с перенаправлением вывода в файл (> elasticsearch.log), автоконфигурация пропускается и пароль нигде не появляется. Запускайте первый раз без редиректа.
sequenceDiagram
participant U as Вы
participant ES as Elasticsearch 8
participant K as Kibana
ES->>ES: Первый старт
ES->>ES: Генерирует TLS-сертификаты
ES->>ES: Задаёт пароль elastic
ES->>ES: Создаёт enrollment-токен (30 мин)
ES-->>U: Выводит пароль + токен в терминал
U->>K: Вставляет enrollment-токен
K->>ES: Запрашивает конфиг и сертификаты
ES-->>K: Возвращает TLS CA + auth
K-->>U: Kibana подключена и готова к работе
U->>ES: curl -u elastic:pass --cacert http_ca.crt
ES-->>U: 200 OK (зашифрованный HTTPS)Как выглядят первые запросы с включённой защитой
С момента старта ES 8 слушает на https://localhost:9200, а не http://. Простой запрос без авторизации даёт ошибку:
curl https://localhost:9200
# curl: (60) SSL certificate problem: unable to get local issuer certificateТо есть нужно и сертификат передать, и аутентификацию. Полная команда:
curl -u elastic:M0nPass_w0rd \
--cacert /etc/elasticsearch/certs/http_ca.crt \
https://localhost:9200Что тут происходит:
-u elastic:M0nPass_w0rd— Basic-аутентификация: имя пользователя и пароль;--cacert— указываем curl, какому CA-сертификату доверять; без этого curl отклоняет самоподписанный сертификат ES.
Для быстрых локальных экспериментов можно пропустить проверку сертификата флагом -k (--insecure). Это не безопасно, зато не нужно думать о сертификатах на этапе обучения:
curl -k -u elastic:M0nPass_w0rd https://localhost:9200Удачный ответ выглядит так:
{
"name": "node-1",
"cluster_name": "elasticsearch",
"version": {
"number": "8.19.0",
...
},
"tagline": "You Know, for Search"
}Сбрасываем пароль пользователя elastic
Если пароль потерян, устарел или вы устанавливали ES через пакетный менеджер и пароль вообще не был показан — используйте утилиту elasticsearch-reset-password:
# Сгенерировать новый случайный пароль и напечатать его:
bin/elasticsearch-reset-password -u elastic
# Задать пароль вручную (интерактивно):
bin/elasticsearch-reset-password -u elastic -iПри Docker-запуске утилита находится внутри контейнера:
docker exec -it elasticsearch bin/elasticsearch-reset-password -u elastic -iДля Docker-варианта из предыдущей статьи, где пароль задаётся через ELASTIC_PASSWORD, этот шаг обычно не нужен — пароль уже известен из переменной окружения.
Enrollment-токен: что это и зачем
Enrollment-токен — короткоживущий JWT, закодированный в Base64. Внутри него зашиты адрес кластера, отпечаток CA-сертификата и временные учётные данные. Когда Kibana получает этот токен, она сама:
- узнаёт, куда подключаться;
- доверяет нужному TLS-сертификату;
- авторизуется через встроенный сервисный аккаунт
kibana_system.
Если 30 минут истекли или токен был использован — создайте новый:
# Для self-managed (запускать на машине с ES):
bin/elasticsearch-create-enrollment-token -s kibana
# В Docker:
docker exec -it elasticsearch \
bin/elasticsearch-create-enrollment-token -s kibanaФлаг -s kibana означает «токен для Kibana». Для добавления новой ES-ноды в кластер используют -s node.
Что делать при работе через Kibana Dev Tools
Когда Kibana подключена к кластеру через enrollment-токен, Dev Tools Console автоматически передаёт авторизацию от вашего текущего пользователя. Вам не нужно вписывать логин и пароль в каждый запрос — Kibana делает это за вас.
Запрос в Dev Tools выглядит без всякой авторизации:
GET /А под капотом Kibana превращает его в полноценный HTTPS-запрос с нужными заголовками. Именно поэтому Dev Tools — наиболее удобный способ работы с ES при обучении: меньше рутины с сертификатами и паролями. Подробнее об интерфейсе консоли читайте в статье Kibana Dev Tools и работа через REST API.
API-ключи как альтернатива паролю
Basic-аутентификация (-u user:password) удобна для экспериментов, но для продакшна лучше использовать API-ключи: они не привязаны к конкретному пользователю, их можно ограничить по правам и отозвать в любой момент. Создаются через _security/api_key:
POST /_security/api_key
{
"name": "my-app-key"
}В ответ ES вернёт id и api_key — из них формируют заголовок:
Authorization: ApiKey <base64(id:api_key)>Подробный разбор с примерами — в статье Безопасность: пользователи, роли и API-ключи.
Краткая шпаргалка по командам
Когда можно отключить безопасность
Единственная законная причина отключить security — локальная разработка на изолированной машине, где данные не важны. Как показано в предыдущей статье, для этого при Docker-запуске используют переменную xpack.security.enabled=false.
Во всех остальных случаях — даже на тестовом сервере, доступном извне — security должна оставаться включённой. Открытый ES-кластер в интернете становится целью атак в течение нескольких часов после появления на публичном IP.
См. также
- Способы развернуть Elasticsearch 8: Docker, Elastic Cloud, self-managed и ECК
- Kibana Dev Tools и работа через REST API
- Безопасность: пользователи, роли и API-ключи
- Кластер, ноды, шарды и реплики
- Снапшоты и восстановление данных