Управление секретами в ADCM

ADCM поддерживает различные хранилища секретов, что позволяет безопасно работать с чувствительными данными и использовать внешние системы.

Ниже приведена таблица с секретами, которые создаются при первичном запуске ADCM.

Основные секреты
Путь к секрету Описание

/adcm/ansible/ansible_vault

Секрет, используемый Ansible для шифрования конфиденциальных данных

/adcm/django/secret_key

Секретный ключ, используемый приложением Django

/adcm/backend/status_service_token

Токен, используемый бэкенд-сервером (Backend Server) для аутентификации в статус-сервере (Status Server)

/adcm/status_service/adcm_token

Токен, используемый статус-сервером для аутентификации в ADCM

/adcm/status_checker/status_service_token

Токен, используемый компонентом, отправляющим heartbeat о состоянии компонента на хосте, для аутентификации в статус-сервере

ADCM предоставляет возможность хранения секретов двумя способами:

  • в файловой системе (FilesystemBackend);

  • в Vault (VaultBackend).

Выбор используемого хранилища определяется переменной окружения SECRET_BACKEND.

По умолчанию используется файловое хранилище. При необходимости можно настроить использование Vault.

Файловое хранилище

По умолчанию ADCM хранит секреты в файловой системе. Секреты сохраняются в файле /adcm/data/vars/secrets_v2.json, который создается автоматически при установке ADCM. Использование файлового хранилища не требует дополнительной настройки и применяется, если не указано иное хранилище секретов.

Пример структуры файла secret_v2.json:

{
  "adcm": {
    "ansible": {
      "ansible_vault": "..."
    },
    "django": {
      "secret_key": "..."
    },
    "backend": {
      "status_service_token": "..."
    },
    "status_service": {
      "adcm_token": "..."
    },
    "status_checker": {
      "status_service_token": "..."
    }
  }
}

Vault

ПРИМЕЧАНИЕ
При первичной установке ADCM автоматически генерирует необходимые секреты и сохраняет их в выбранном хранилище. Если выполняется обновление ADCM с переходом с файлового хранилища на Vault, необходимо предварительно выполнить миграцию секретов вручную. Подробнее см. в разделе Миграция секретов в Vault.

ADCM поддерживает работу с Vault, в качестве которого может использоваться HashiCorp Vault или другие совместимые решения (например, OpenBao).

Для использования Vault необходимо выполнить следующие предварительные требования:

  • Создать токен с правами чтения/записи секретов.

  • Создать mount point, который будет использоваться ADCM (VAULT_MOUNT_POINT).

Токен необходимо сохранить в файл на хосте ADCM, так как в дальнейшем этот файл указывается в переменной VAULT_TOKEN_FILE.

Интеграция ADCM с Vault осуществляется посредством указания соответствующих переменных окружения. Подробная информация о переменных окружения, используемых для настройки подключения к Vault, приведена в статье Установка.

ПРИМЕЧАНИЕ
Для включения Vault необходимо указать переменную окружения SECRET_BACKEND со значением VaultBackend. Если переменная SECRET_BACKEND не определена, по умолчанию используется файловое хранилище секретов (FilesystemBackend).

Ниже приведен пример запуска ADCM с использованием Vault.

$ docker run -d --name adcm -p 8000:8000 -v /opt/adcm:/adcm/data -v /opt/adcm/conf/ssl:/etc/ssl/certs -v /opt/adcm/token:/adcm/token -e DB_HOST="<DB_HOST>" -e DB_PORT="<DB_PORT>" -e DB_USER="<DB_USER>" -e DB_NAME="<DB_NAME>" -e DB_PASS="<DB_PASSWORD>" -e SECRET_BACKEND="VaultBackend" -e VAULT_URL="<VAULT_URL>" -e VAULT_MOUNT_POINT="<VAULT_MOUNT_POINT>" -e VAULT_TOKEN_FILE="/adcm/data/token" hub.arenadata.io/adcm/adcm:<version>

где <version> — это версия Docker-образа в одном из следующих форматов:

  • <major>.<minor>.<patch> — если необходим конкретный патч ADCM. Пример: 2.0.0.

  • <major>.<minor> — если необходим последний патч в рамках выбранной версии ADCM. Пример: 2.0.

Вы можете использовать переменные окружения VAULT_CA_FILE, VAULT_CLIENT_CERT_FILE и VAULT_CLIENT_KEY_FILE для установки защищенного подключения к Vault.

Подготовьте файлы SSL-сертификатов и разместите их в доступном каталоге (например, /etc/ssl/certs). Затем укажите пути к ним с помощью переменных окружения:

-e VAULT_CA_FILE="/adcm/data/conf/ssl/ca.crt" -e VAULT_CLIENT_CERT_FILE="/adcm/data/conf/ssl/client.crt" -e VAULT_CLIENT_KEY_FILE="/adcm/data/conf/ssl/client.key"
ВАЖНО
  • latest использовался для ранних версий ADCM и начиная с версии 2.0.0 больше не поддерживается.

  • До выпуска ADCM 2.0.0 для версионирования использовался следующий формат: YYYY.MM.DD.HH.

Миграция секретов в Vault

При переходе с файлового хранилища (FilesystemBackend) на Vault (VaultBackend) необходимо перенести существующие секреты в Vault. Для этого используется команда load скрипта manage_secrets.py, которая переносит секреты из файла secret_v2.json в Vault.

ВАЖНО
Обратная миграция секретов из Vault в файловое хранилище не поддерживается.

Команда load считывает секреты из файла (по умолчанию используется /adcm/data/vars/secrets_v2.json) и загружает их в настроенный экземпляр Vault.

Также команда поддерживает следующие флаги:

  • --force — позволяет перезаписать существующие секреты в Vault.

  • --file <file_path> — определяет путь к файлу с секретами.

Чтобы выполнить миграцию секретов из локального хранилища в Vault, выполните следующие действия:

  1. Остановите и удалите контейнер ADCM:

    $ sudo docker rm -f adcm
    ВАЖНО
    Директорию /opt/adcm/var удалять нельзя, так как в ней находится файл секретов.
  2. Запустите контейнер ADCM в режиме MIGRATION_MODE, указав настройки подключения к Vault, не указывая значение переменной SECRET_BACKEND:

    $ docker run -d -it --name adcm -p 8000:8000 -v /opt/adcm:/adcm/data -v /opt/adcm/conf/ssl:/etc/ssl/certs -v /opt/adcm/token:/adcm/token -e DB_HOST="<DB_HOST>" -e DB_PORT="<DB_PORT>" -e DB_USER="<DB_USER>" -e DB_NAME="<DB_NAME>" -e DB_PASS="<DB_PASSWORD>" -e VAULT_URL="<VAULT_URL>" -e VAULT_MOUNT_POINT="<VAULT_MOUNT_POINT>" -e VAULT_TOKEN_FILE="/adcm/token" -e MIGRATION_MODE=1 hub.arenadata.io/adcm/adcm:<version>

    где <version> — это версия Docker-образа в одном из следующих форматов:

    • <major>.<minor>.<patch> — если необходим конкретный патч ADCM. Пример: 2.0.0.

    • <major>.<minor> — если необходим последний патч в рамках выбранной версии ADCM. Пример: 2.0.

  3. Выполните загрузку секретов в Vault:

    $ docker exec -it adcm python3 /adcm/python/manage_secrets.py load

    Ожидаемый результат выполнения команды:

    Secrets were loaded
  4. Остановите и удалите контейнер ADCM:

    $ sudo docker rm -f adcm
  5. Запустите ADCM в штатном режиме с использованием переменной SECRET_BACKEND="VaultBackend":

    $ docker run -d --name adcm -p 8000:8000 -v /opt/adcm:/adcm/data -v /opt/adcm/conf/ssl:/etc/ssl/certs -v /opt/adcm/token:/adcm/token -e DB_HOST="<DB_HOST>" -e DB_PORT="<DB_PORT>" -e DB_USER="<DB_USER>" -e DB_NAME="<DB_NAME>" -e DB_PASS="<DB_PASSWORD>" -e SECRET_BACKEND="VaultBackend" -e VAULT_URL="<VAULT_URL>" -e VAULT_MOUNT_POINT="<VAULT_MOUNT_POINT>" -e VAULT_TOKEN_FILE="/adcm/token" -e VAULT_CA_FILE="<CA_CERT_PATH>" -e VAULT_CLIENT_CERT_FILE="<CLIENT_CERT_PATH>" -e VAULT_CLIENT_KEY_FILE="<CLIENT_KEY_PATH>" hub.arenadata.io/adcm/adcm:<version>
  6. После запуска ADCM в штатном режиме убедитесь, что:

    • Веб-интерфейс ADCM доступен и работает корректно.

    • В интерфейсе Vault по пути, указанному в переменной VAULT_MOUNT_POINT, успешно созданы записи с секретами.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней