Облачная платформаEvolution

Автоматическое распечатывание HashiCorp Vault в Container Apps с помощью Key Management


С помощью этого руководства вы развернете HashiCorp Vault в Container Apps и настроите автоматическое распечатывание (auto-unseal) хранилища с помощью ключа Key Management. После перезапуска контейнера Vault автоматически распечатается без участия администратора. Все обращения к ключу отобразятся в сервисе «Аудит-логирование».

Вы будете использовать следующие сервисы:

  • Key Management — сервис для управления криптографическими ключами и шифрования данных.

  • Secret Management — сервис для безопасного хранения секретов.

  • Object Storage — объектное S3-хранилище с бесплатным хранением файлов объемом до 15 ГБ.

  • Container Apps — сервис для запуска контейнерных приложений в облаке. Не требует знания Kubernetes и создания виртуальных машин.

  • «Аудит-логирование» — сервис, позволяющий собирать логи и просматривать историю событий, а также экспортировать журналы логов во внешнюю клиентскую систему SIEM.

Для успешного выполнения сценария используйте следующие версии сервисов и протоколов:

  • HashiCorp Vault 1.20.0.

  • Docker-образ vault.cr.cloud.ru/vault-autounseal:latest из публичного реестра Artifact Registry.

    Образ подготовлен для запуска в Container Apps: Vault запускается от имени непривилегированного пользователя, хранит данные в бакете Object Storage и получает параметры Key Management и Object Storage из переменных окружения.

    Если Vault уже развернут, настройте для него автоматическое распечатывание.

    В этом руководстве автоматическое распечатывание уже встроено в Docker-образ.

Шаги:

  1. Создайте бакет для данных Vault.

  2. Создайте сервисный аккаунт и ключи для него.

  3. Сохраните секреты в Secret Management.

  4. Создайте ключ в Key Management и выдайте на него права.

  5. Создайте контейнер с Vault.

  6. Инициализируйте Vault.

  7. Перезапустите контейнер.

  8. Убедитесь, что Vault распечатался автоматически.

  9. Найдите обращение к ключу в аудит-логе.

  10. Проверьте, что ключ Key Management управляет доступом к Vault.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Убедитесь, что у вас есть роль администратора проекта. Роль нужна, чтобы создать сервисный аккаунт и выдать ему права.

  3. Подключите Key Management:

    1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Управление → Key Management.

    2. Нажмите Подключить.

1. Создайте бакет для данных Vault

Vault будет хранить данные в бакете Object Storage и обращаться к нему напрямую по S3 API. Если данные Vault хранятся только в контейнере, после перезапуска Vault окажется неинициализированным, все данные будут потеряны.

Чтобы выдать сервисному аккаунту права только на этот бакет:

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Хранение данных → Object Storage.

  2. Нажмите Создать бакет.

  3. Введите название бакета, например vault-lab-data.

  4. Нажмите Создать.

Остальные параметры бакета для лабораторной работы можно оставить по умолчанию.

2. Создайте сервисный аккаунт и ключи для него

От имени сервисного аккаунта Vault будет обращаться к Key Management и Object Storage. Сервисный аккаунт получит роли s3e.viewer и s3e.editor только на бакет, созданный на шаге 1, и не получит прав на проект. С помощью этих ролей можно читать, записывать и удалять объекты. Изменять настройки бакета нельзя.

Чтобы сервисный аккаунт мог обращаться к Key Management и Object Storage, создайте два ключа:

  • API-ключ — для обращений к Key Management;

  • ключ доступа — для обращений к Object Storage по S3 API.

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Пользователи → Сервисные аккаунты.

  2. Нажмите Создать аккаунт.

  3. Введите название — vault-autounseal-sa.

  4. Выберите уровень аккаунта — Проект.

  5. Нажмите Продолжить.

  6. Назначьте сервисному аккаунту роли s3e.viewer и s3e.editor на бакет vault-lab-data.

  7. Нажмите Создать.

  8. В созданном сервисном аккаунте перейдите на вкладку API-ключи.

  9. Нажмите Создать API-ключ.

  10. Введите название — vault-autounseal.

  11. В поле Сервисы выберите Key Management.

  12. Нажмите Создать.

  13. Скопируйте значение Key Secret API-ключа.

    После закрытия окна получить Key Secret будет нельзя.

  14. Перейдите на вкладку Ключи доступа.

  15. Нажмите Создать ключ.

  16. Нажмите Создать.

  17. Скопируйте значения Key ID и Key Secret ключа доступа.

    После закрытия окна получить Key Secret будет нельзя.

3. Сохраните секреты в Secret Management

Контейнер получит сохраненные секретные значения из Secret Management через переменные окружения. Секреты не будут сохранены ни в настройках контейнера, ни в Docker-образе.

Чтобы сохранить секреты в Secret Management и использовать их для контейнера:

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Управление → Secret Management.

  2. Нажмите Добавить секрет.

  3. Введите название секрета — vault-lab-kms-api-key.

  4. Вставьте значение Key Secret API-ключа, скопированное на шаге 2.

  5. Нажмите Создать.

  6. Нажмите Добавить секрет.

  7. Введите название секрета — vault-lab-s3-secret.

  8. Вставьте значение Key Secret ключа доступа, скопированное на шаге 2.

  9. Нажмите Создать.

4. Создайте ключ в Key Management и выдайте на него права

Vault использует ключ Key Management, чтобы зашифровывать и расшифровывать свой корневой ключ. Сервисный аккаунт получает роль sckm.user только на этот ключ. С помощью этой роли можно зашифровать и расшифровывать данные, операции по управлению ключом недоступны.

Чтобы создать ключ в Key Management и выдать на него права:

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Управление → Key Management.

  2. Перейдите на вкладку Симметричные ключи.

  3. Нажмите Создать ключ.

  4. Введите название ключа — vault-autounseal.

  5. Выберите период ротации — Год.

  6. Выберите алгоритм шифрования — AES-256.

  7. Нажмите Создать.

    Ключ появится в списке симметричных ключей.

  8. Откройте ключ vault-autounseal.

  9. Перейдите в раздел Права доступа.

  10. Нажмите Назначить роли.

  11. Выберите сервисный аккаунт vault-autounseal-sa, созданный на шаге 2.

  12. Нажмите Продолжить.

  13. Выберите роль sckm.user.

  14. Нажмите Назначить.

Сервисный аккаунт vault-autounseal-sa появится в списке прав доступа ключа с ролью sckm.user.

5. Создайте контейнер с Vault

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Container Apps.

  2. Перейдите в раздел Container Services.

  3. Нажмите Создать.

  4. Введите название контейнерного приложения — vault-lab.

  5. Перейдите на вкладку Artifact Registry и укажите URI Docker-образа — vault.cr.cloud.ru/vault-autounseal:latest.

  6. Выберите минимальную конфигурацию vCPU и RAM.

  7. Укажите порт — 8200.

  8. Скопируйте идентификатор проекта.

  9. Скопируйте идентификатор тенанта Object Storage.

    Идентификатор тенанта входит в ID ключа доступа к Object Storage API.

    1. В новой вкладке браузера откройте Хранение данных → Object Storage → Параметры работы с API.

    2. Скопируйте значение Tenant ID.

  10. Добавьте переменные окружения:

    Переменная

    Значение

    Описание

    VAULT_TRANSIT_SEAL_MOUNT_PATH

    <project_id>

    Идентификатор проекта, скопированный в пункте 8

    VAULT_TRANSIT_SEAL_KEY_NAME

    vault-autounseal

    Название ключа Key Management

    VAULT_TOKEN

    Секрет vault-lab-kms-api-key

    Ссылка на секрет Secret Management с API-ключом сервисного аккаунта

    AWS_S3_BUCKET

    vault-lab-data

    Название бакета, созданного на шаге 1

    AWS_ACCESS_KEY_ID

    <tenant_id>:<key_id>

    Tenant ID из пункта 9 и Key ID ключа доступа, скопированный на шаге 2. Указываются через двоеточие

    AWS_SECRET_ACCESS_KEY

    Секрет vault-lab-s3-secret

    Ссылка на секрет Secret Management с Key Secret ключа доступа

  11. Нажмите Следующий шаг.

  12. Укажите минимальное количество экземпляров — 0, максимальное — 1.

    Примечание

    Хранилище Object Storage в Vault не поддерживает одновременную работу нескольких экземпляров. При минимальном значении 0 экземпляр будет удален после простоя, а при следующем запросе запустится и распечатается автоматически.

  13. Нажмите Следующий шаг.

  14. Включите опцию Публичный адрес.

  15. Нажмите Создать.

  16. Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».

6. Инициализируйте Vault

При инициализации Vault создаст корневой ключ, зашифрует его ключом Key Management и сохранит в бакете. Вместо ключей распечатывания Vault создаст ключи восстановления (recovery keys), которые нужны для административных операций, например для выпуска нового root-токена, но не используются для распечатывания.

Чтобы инициализировать Vault:

  1. В карточке контейнера vault-lab скопируйте публичный URL и откройте его в браузере.

    Откроется страница инициализации Vault.

  2. В полях Key shares и Key threshold укажите 1.

    Подсказка

    В рабочей среде используйте не менее пяти долей и порог не менее трех.

  3. Нажмите Initialize.

  4. Сохраните Initial root token и Recovery key, нажав Download keys.

  5. Нажмите Continue to Authenticate.

  6. В поле Token вставьте root-токен.

  7. Нажмите Sign in.

  8. Перейдите в раздел Secrets Engines.

  9. Нажмите Enable new engine.

  10. Выберите KV.

  11. Нажмите Next.

  12. В поле Path введите lab.

  13. Нажмите Enable engine.

  14. Нажмите Create secret.

  15. В поле Path for this secret введите demo.

  16. Добавьте ключ message со значением hello from Key Management.

  17. Нажмите Save.

В Vault будет создан секрет lab/demo.

7. Перезапустите контейнер

  1. Вернитесь на главную страницу сервиса Container Apps.

  2. В строке с названием контейнера vault-lab выберите Остановить.

  3. Подтвердите действие.

    Экземпляр контейнера будет удален.

  4. В строке с названием контейнера выберите Запустить.

    Будет запущен новый экземпляр контейнера.

  5. Дождитесь, когда контейнер перейдет в статус «Выполняется».

8. Убедитесь, что Vault распечатался автоматически

  1. Откройте в браузере публичный URL контейнера.

    Если экземпляров контейнера нет, запрос запустит новый экземпляр. Vault получит корневой ключ через Key Management без участия администратора — откроется страница входа.

  2. Войдите с root-токеном.

  3. Откройте секрет lab/demo.

Значение hello from Key Management станет доступно: данные сохранятся в бакете и расшифруются после перезапуска.

9. Найдите обращение к ключу в аудит-логе

При каждом запуске Vault будет отправлять в Key Management зашифрованный корневой ключ на расшифровку. Каждое такое обращение будет фиксироваться в аудит-логах с указанием инициатора и операции.

Чтобы посмотреть обращение к ключу в аудит-логе:

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Мониторинг → Аудит-логи.

  2. В поле Период выберите интервал, в который вы выполняли лабораторную работу.

  3. В поле Сервис-источник выберите Key Management.

  4. В поле Тип события выберите AccessKey.

  5. Найдите событие, время которого совпадает с перезапуском контейнера на шаге 7.

    В столбце Инициатор будет указан сервисный аккаунт vault-autounseal-sa, а не ваш пользователь.

  6. В строке события нажмите Показать, чтобы открыть JSON-объект с полной информацией.

  7. В блоке details найдите операцию:

    "operation": "DECRYPT"

    Операция DECRYPT означает, что Vault расшифровал свой корневой ключ ключом vault-autounseal при запуске.

10. Проверьте, что ключ Key Management управляет доступом к Vault

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

Чтобы проверить, что ключ Key Management управляет доступом ко всем данным Vault:

  1. В Key Management деактивируйте ключ vault-autounseal.

  2. Перезапустите контейнер vault-lab, как описано на шаге 7.

  3. Откройте в браузере публичный URL контейнера.

    Если не открыть Vault, контейнер не сможет запуститься.

  4. Откройте контейнер vault-lab.

  5. Перейдите на вкладку Логи.

  6. В пользовательских логах найдите ошибку:

    error parsing Seal configuration: Error making API request.
    URL: PUT https://kms.api.cloud.ru/v1/<project_id>/encrypt/vault-autounseal
    Code: 400. Errors:

    Где <project_id> — ID вашего проекта.

    При запуске Vault будет обращаться к ключу vault-autounseal, а Key Management будет отклонять запрос к деактивированному ключу.

  7. Активируйте ключ vault-autounseal.

  8. Перезапустите контейнер.

  9. Откройте в браузере публичный URL контейнера.

Откроется страница входа — Vault снова автоматически распечатается.

Удалите ресурсы

Чтобы контейнер и бакет не тарифицировались после лабораторной работы, удалите созданные ресурсы:

  1. Удалите контейнер vault-lab.

  2. Удалите объекты из бакета vault-lab-data и сам бакет.

  3. Удалите секреты vault-lab-kms-api-key и vault-lab-s3-secret.

  4. Удалите сервисный аккаунт vault-autounseal-sa.

  5. Удалите ключ vault-autounseal.

Результат

Вы развернули HashiCorp Vault в Container Apps и настроили автоматическое распечатывание с помощью Key Management. После перезапуска Vault распечатается без участия администратора, ключ распечатывания останется в Key Management, а каждое обращение к нему запишется в аудит-логе.