Безопасность по умолчанию в 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)
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: генерация сертификатов, пароля и enrollment-токена

Как выглядят первые запросы с включённой защитой

С момента старта 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"
}
Check yourself
Вы запустили ES 8 и хотите проверить его через curl. Напишите команду, которая авторизуется как пользователь elastic с паролем MyPass123 и при этом не проверяет TLS-сертификат (для быстрой локальной проверки). Что будет в ответе при успехе?

Сбрасываем пароль пользователя 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, этот шаг обычно не нужен — пароль уже известен из переменной окружения.

Check yourself
Вы устанавливали ES через apt-пакет и не увидели пароль пользователя elastic в терминале. Какую команду нужно выполнить, чтобы задать новый пароль вручную — не случайный, а свой?

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.

Check yourself
Enrollment-токен действует 30 минут, и вы не успели подключить Kibana. Токен истёк. Что нужно сделать? Напишите команду для self-managed-установки.

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.


Quick recall
Как восстановить пароль пользователя elastic, если он потерян или не был показан при запуске?
Quick recall
Почему запрос curl к https://localhost:9200 завершается ошибкой SSL certificate problem?
Quick recall
Какие три компонента безопасности Elasticsearch 8 инициализирует автоматически при первом старте?

См. также