Безопасное хранение паролей для GitLab CI в виде секретов Yandex Lockbox
Вы можете безопасно хранить пароли в виде секретов Yandex Lockbox и использовать их в своих сценариях CI в Yandex Managed Service for GitLab. Так вы можете защитить и скрыть пароли в CI-скриптах от пользователей GitLab, в том числе администраторов.
Интеграция с Yandex Lockbox устроена следующим образом. Вы подготавливаете секрет Yandex Lockbox и переменную окружения GitLab, которая ссылается на этот секрет. Также вы устанавливаете GitLab Runner на виртуальную машину и привязываете к ней сервисный аккаунт. После этого вы создаете указанный ниже CI-скрипт. Он содержит специальную команду, которая запрашивает IAM-токен сервисного аккаунта. С помощью полученного IAM-токена и переменной окружения скрипт извлекает пароль из секрета. В результате пароль используется в CI-скрипте, но хранится во внешнем хранилище.
Чтобы инстанс Managed Service for GitLab мог обращаться к секретам Yandex Lockbox:
- Подготовьте инфраструктуру.
- Настройте сценарий CI.
- Проверьте результат.
- Устраните потенциальные уязвимости.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте инфраструктуру
-
Создайте и активируйте инстанс Managed Service for GitLab.
-
Создайте секрет Yandex Lockbox с названием
MY_SECRET
. -
Создайте сервисный аккаунт с ролью
lockbox.payloadViewer
.У этой роли нет прав на получение списка секретов, в результате без идентификатора секрета злоумышленник не сможет получить пароль из секрета.
-
Создайте переменную окружения
GitLab для проекта. Укажите в ней следующие настройки:-
Key —
MY_SECRET
. -
Value — идентификатор созданного секрета Yandex Lockbox.
-
Mask variable — включено.
Чтобы защитить пароли от кражи злоумышленниками, замаскируйте переменную. Так только пользователи с ролями
Maintainer
илиOwner
в проекте GitLab смогут увидеть значение переменной — идентификатор секрета Yandex Lockbox. Если злоумышленник подключится к виртуальной машине с GitLab Runner, без идентификатора секрета он не сможет узнать пароль из этого секрета.
-
-
Установите GitLab Runner на отдельной виртуальной машине Yandex Compute Cloud. При создании ВМ укажите созданный ранее сервисный аккаунт.
В настройках GitLab Runner укажите, что он доступен только для защищенных веток
и конкретных проектов (опции Protected и Lock to current projects). Если не указать эти настройки, CI-скрипты с паролями можно будет запустить в проектах, которые не отслеживают сотрудники информационной безопасности. В результате пароли могут быть скомпрометированы.Как настроить GitLab Runner
-
Откройте проект GitLab в браузере.
-
В меню слева перейдите в раздел Settings → CI/CD.
-
В разделе Runners нажмите кнопку Expand.
-
В строке с нужным GitLab Runner нажмите кнопку
и включите следующие опции:- Protected — GitLab Runner будет работать только с защищенными ветками;
- Lock to current projects — GitLab Runner будет работать только с текущими проектами.
-
Нажмите кнопку Save changes.
Подробнее о настройках GitLab Runner см. в документации GitLab
. -
Настройте сценарий CI
-
Создайте ветку для сценария CI. Включите для нее защиту
на уровне проекта. -
Переключитесь локально на созданную ветку.
-
В корне репозитория создайте файл
.gitlab-ci.yml
и вставьте в него CI-скрипт, который выводит значение секрета Yandex Lockbox:stages: - build build: stage: build script: - > export IAM_TOKEN_JSON=`curl --silent --header "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token` - export TOKEN=`echo $IAM_TOKEN_JSON | jq -rMc '.access_token'` - > curl --silent -header "Authorization: Bearer $TOKEN" https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SECRET_ID/payload - > export SECRET_JSON=`curl --silent --header "Authorization: Bearer $TOKEN" https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SECRET_ID/payload` - export VALUE_OF_MY_SECRET=`echo $SECRET_JSON | jq -rMc '.entries[] | select(.key | contains("MY_SECRET")) | .textValue'` - echo $VALUE_OF_MY_SECRET
-
Создайте коммит и отправьте его в удаленный репозиторий
origin
:git add . && git commit -m "Added .gitlab-ci.yml" && git push
После этого запустится сборка, которая запишет значение секрета Yandex Lockbox в переменную окружения VALUE_OF_MY_SECRET
.
Проверьте результат
- В меню слева в GitLab перейдите в раздел Build → Pipelines.
- Убедитесь, что сборка принимает статус Passed. Он означает, что сборка прошла успешно.
Устраните потенциальные уязвимости
-
Включите и настройте правила ревью кода в ветке для сценария CI.
Так злоумышленники не смогут получить значение переменной с помощью таких команд, как
env
,printenv
илиecho
. Сотрудники информационной безопасности смогут отслеживать изменения в ветке. -
Настройте группу безопасности для ВМ с GitLab Runner. Запретите в ней входящий трафик, который разрешает подключения к ВМ извне.
Если злоумышленник подключился к ВМ с GitLab Runner и знает идентификатор секрета Yandex Lockbox, он может получить доступ к секрету.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: