Управление секретами в 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"
|
ВАЖНО
|
Миграция секретов в 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, выполните следующие действия:
-
Остановите и удалите контейнер ADCM:
$ sudo docker rm -f adcmВАЖНОДиректорию /opt/adcm/var удалять нельзя, так как в ней находится файл секретов. -
Запустите контейнер 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.
-
-
Выполните загрузку секретов в Vault:
$ docker exec -it adcm python3 /adcm/python/manage_secrets.py loadОжидаемый результат выполнения команды:
Secrets were loaded
-
Остановите и удалите контейнер ADCM:
$ sudo docker rm -f adcm -
Запустите 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> -
После запуска ADCM в штатном режиме убедитесь, что:
-
Веб-интерфейс ADCM доступен и работает корректно.
-
В интерфейсе Vault по пути, указанному в переменной
VAULT_MOUNT_POINT, успешно созданы записи с секретами.
-