Короткий ответ
Секреты хранят во внешнем менеджере секретов или встроенном secret-store CI-системы, подключают к джобе через переменные с пометкой «secret»/masked, выдают джобе временные учётные данные с ограниченным сроком жизни и настраивают маскирование вывода, чтобы значение не печаталось в логах даже при случайном echo.
Как это работает подробнее
большинство CI-систем (GitLab CI, GitHub Actions) поддерживают защищённые переменные, которые подставляются в окружение джобы без отображения значения в UI и автоматически маскируются в логах при точном совпадении строки. Для более строгих требований используют динамическую выдачу через Vault/OIDC-федерацию: джоба обменивает короткоживущий CI-токен на временные креды непосредственно перед выполнением, и эти креды истекают сразу после джобы.
Пример кода
# GitHub Actions: OIDC-обмен на временные AWS-креды без долгоживущего секрета в репозитории
permissions:
id-token: write
jobs:
deploy:
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/ci-deploy-role
aws-region: eu-west-1Что использовать на практике
- Практика. избегают передачи секретов через аргументы командной строки (видны в
ps auxи иногда в логах), передают через переменные окружения или файл с ограниченными правами; настраивают отключение трассировки команд (set +x) в shell-скриптах там, где участвует секрет; ограничивают, какие ветки/пайплайны могут запрашивать какие секреты (protected branches/environments). - Проверка. Ожидаемое поведение: джоба получает временные AWS-креды с TTL в пределах выполнения пайплайна без хранения статического AWS access key в секретах репозитория; проверить можно по логам CloudTrail — вызовы придут от временной сессионной роли ci-deploy-role, а не от постоянного IAM-пользователя.
Подводные камни
- Ошибка. печатать секрет в лог для «дебага» и забывать убрать; хранить статический долгоживущий токен в CI-переменной вместо динамической выдачи через OIDC; давать одному общему CI-токену доступ сразу ко всем секретам проекта вместо разделения по окружениям (dev/staging/prod).