С помощью этого руководства вы развернете 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-образ.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Убедитесь, что у вас есть роль администратора проекта. Роль нужна, чтобы создать сервисный аккаунт и выдать ему права.
Подключите Key Management:
На верхней панели слева нажмите и выберите Управление → Key Management.
Нажмите Подключить.
Vault будет хранить данные в бакете Object Storage и обращаться к нему напрямую по S3 API. Если данные Vault хранятся только в контейнере, после перезапуска Vault окажется неинициализированным, все данные будут потеряны.
Чтобы выдать сервисному аккаунту права только на этот бакет:
На верхней панели слева нажмите и выберите Хранение данных → Object Storage.
Нажмите Создать бакет.
Введите название бакета, например vault-lab-data.
Нажмите Создать.
Остальные параметры бакета для лабораторной работы можно оставить по умолчанию.
От имени сервисного аккаунта Vault будет обращаться к Key Management и Object Storage. Сервисный аккаунт получит роли s3e.viewer и s3e.editor только на бакет, созданный на шаге 1, и не получит прав на проект. С помощью этих ролей можно читать, записывать и удалять объекты. Изменять настройки бакета нельзя.
Чтобы сервисный аккаунт мог обращаться к Key Management и Object Storage, создайте два ключа:
API-ключ — для обращений к Key Management;
ключ доступа — для обращений к Object Storage по S3 API.
На верхней панели слева нажмите и выберите Пользователи → Сервисные аккаунты.
Нажмите Создать аккаунт.
Введите название — vault-autounseal-sa.
Выберите уровень аккаунта — Проект.
Нажмите Продолжить.
Назначьте сервисному аккаунту роли s3e.viewer и s3e.editor на бакет vault-lab-data.
Нажмите Создать.
В созданном сервисном аккаунте перейдите на вкладку API-ключи.
Нажмите Создать API-ключ.
Введите название — vault-autounseal.
В поле Сервисы выберите Key Management.
Нажмите Создать.
Скопируйте значение Key Secret API-ключа.
После закрытия окна получить Key Secret будет нельзя.
Перейдите на вкладку Ключи доступа.
Нажмите Создать ключ.
Нажмите Создать.
Скопируйте значения Key ID и Key Secret ключа доступа.
После закрытия окна получить Key Secret будет нельзя.
Контейнер получит сохраненные секретные значения из Secret Management через переменные окружения. Секреты не будут сохранены ни в настройках контейнера, ни в Docker-образе.
Чтобы сохранить секреты в Secret Management и использовать их для контейнера:
На верхней панели слева нажмите и выберите Управление → Secret Management.
Нажмите Добавить секрет.
Введите название секрета — vault-lab-kms-api-key.
Вставьте значение Key Secret API-ключа, скопированное на шаге 2.
Нажмите Создать.
Нажмите Добавить секрет.
Введите название секрета — vault-lab-s3-secret.
Вставьте значение Key Secret ключа доступа, скопированное на шаге 2.
Нажмите Создать.
Vault использует ключ Key Management, чтобы зашифровывать и расшифровывать свой корневой ключ. Сервисный аккаунт получает роль sckm.user только на этот ключ. С помощью этой роли можно зашифровать и расшифровывать данные, операции по управлению ключом недоступны.
Чтобы создать ключ в Key Management и выдать на него права:
На верхней панели слева нажмите и выберите Управление → Key Management.
Перейдите на вкладку Симметричные ключи.
Нажмите Создать ключ.
Введите название ключа — vault-autounseal.
Выберите период ротации — Год.
Выберите алгоритм шифрования — AES-256.
Нажмите Создать.
Ключ появится в списке симметричных ключей.
Откройте ключ vault-autounseal.
Перейдите в раздел Права доступа.
Нажмите Назначить роли.
Выберите сервисный аккаунт vault-autounseal-sa, созданный на шаге 2.
Нажмите Продолжить.
Выберите роль sckm.user.
Нажмите Назначить.
Сервисный аккаунт vault-autounseal-sa появится в списке прав доступа ключа с ролью sckm.user.
На верхней панели слева нажмите и выберите Container Apps.
Перейдите в раздел Container Services.
Нажмите Создать.
Введите название контейнерного приложения — vault-lab.
Перейдите на вкладку Artifact Registry и укажите URI Docker-образа — vault.cr.cloud.ru/vault-autounseal:latest.
Выберите минимальную конфигурацию vCPU и RAM.
Укажите порт — 8200.
Скопируйте идентификатор тенанта Object Storage.
Идентификатор тенанта входит в ID ключа доступа к Object Storage API.
В новой вкладке браузера откройте Хранение данных → Object Storage → Параметры работы с API.
Скопируйте значение Tenant ID.
Добавьте переменные окружения:
Переменная | Значение | Описание |
|---|---|---|
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 ключа доступа |
Нажмите Следующий шаг.
Укажите минимальное количество экземпляров — 0, максимальное — 1.
Хранилище Object Storage в Vault не поддерживает одновременную работу нескольких экземпляров. При минимальном значении 0 экземпляр будет удален после простоя, а при следующем запросе запустится и распечатается автоматически.
Нажмите Следующий шаг.
Включите опцию Публичный адрес.
Нажмите Создать.
Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».
При инициализации Vault создаст корневой ключ, зашифрует его ключом Key Management и сохранит в бакете. Вместо ключей распечатывания Vault создаст ключи восстановления (recovery keys), которые нужны для административных операций, например для выпуска нового root-токена, но не используются для распечатывания.
Чтобы инициализировать Vault:
В карточке контейнера vault-lab скопируйте публичный URL и откройте его в браузере.
Откроется страница инициализации Vault.
В полях Key shares и Key threshold укажите 1.
В рабочей среде используйте не менее пяти долей и порог не менее трех.
Нажмите Initialize.
Сохраните Initial root token и Recovery key, нажав Download keys.
Нажмите Continue to Authenticate.
В поле Token вставьте root-токен.
Нажмите Sign in.
Перейдите в раздел Secrets Engines.
Нажмите Enable new engine.
Выберите KV.
Нажмите Next.
В поле Path введите lab.
Нажмите Enable engine.
Нажмите Create secret.
В поле Path for this secret введите demo.
Добавьте ключ message со значением hello from Key Management.
Нажмите Save.
В Vault будет создан секрет lab/demo.
Вернитесь на главную страницу сервиса Container Apps.
В строке с названием контейнера vault-lab выберите Остановить.
Подтвердите действие.
Экземпляр контейнера будет удален.
В строке с названием контейнера выберите Запустить.
Будет запущен новый экземпляр контейнера.
Дождитесь, когда контейнер перейдет в статус «Выполняется».
Откройте в браузере публичный URL контейнера.
Если экземпляров контейнера нет, запрос запустит новый экземпляр. Vault получит корневой ключ через Key Management без участия администратора — откроется страница входа.
Войдите с root-токеном.
Откройте секрет lab/demo.
Значение hello from Key Management станет доступно: данные сохранятся в бакете и расшифруются после перезапуска.
При каждом запуске Vault будет отправлять в Key Management зашифрованный корневой ключ на расшифровку. Каждое такое обращение будет фиксироваться в аудит-логах с указанием инициатора и операции.
Чтобы посмотреть обращение к ключу в аудит-логе:
На верхней панели слева нажмите и выберите Мониторинг → Аудит-логи.
В поле Период выберите интервал, в который вы выполняли лабораторную работу.
В поле Сервис-источник выберите Key Management.
В поле Тип события выберите AccessKey.
Найдите событие, время которого совпадает с перезапуском контейнера на шаге 7.
В столбце Инициатор будет указан сервисный аккаунт vault-autounseal-sa, а не ваш пользователь.
В строке события нажмите , чтобы открыть JSON-объект с полной информацией.
В блоке details найдите операцию:
"operation": "DECRYPT"
Операция DECRYPT означает, что Vault расшифровал свой корневой ключ ключом vault-autounseal при запуске.
Если ключ деактивирован, Vault не сможет запуститься, а данные в бакете останутся недоступными.
Чтобы проверить, что ключ Key Management управляет доступом ко всем данным Vault:
В Key Management деактивируйте ключ vault-autounseal.
Перезапустите контейнер vault-lab, как описано на шаге 7.
Откройте в браузере публичный URL контейнера.
Если не открыть Vault, контейнер не сможет запуститься.
Откройте контейнер vault-lab.
Перейдите на вкладку Логи.
В пользовательских логах найдите ошибку:
error parsing Seal configuration: Error making API request.URL: PUT https://kms.api.cloud.ru/v1/<project_id>/encrypt/vault-autounsealCode: 400. Errors:
Где <project_id> — ID вашего проекта.
При запуске Vault будет обращаться к ключу vault-autounseal, а Key Management будет отклонять запрос к деактивированному ключу.
Активируйте ключ vault-autounseal.
Перезапустите контейнер.
Откройте в браузере публичный URL контейнера.
Откроется страница входа — Vault снова автоматически распечатается.
Чтобы контейнер и бакет не тарифицировались после лабораторной работы, удалите созданные ресурсы:
Удалите контейнер vault-lab.
Удалите объекты из бакета vault-lab-data и сам бакет.
Удалите секреты vault-lab-kms-api-key и vault-lab-s3-secret.
Удалите сервисный аккаунт vault-autounseal-sa.
Удалите ключ vault-autounseal.
Вы развернули HashiCorp Vault в Container Apps и настроили автоматическое распечатывание с помощью Key Management. После перезапуска Vault распечатается без участия администратора, ключ распечатывания останется в Key Management, а каждое обращение к нему запишется в аудит-логе.