Класичний підхід: у секретах CI лежать статичні ключі хмарного облікового запису (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY) з правами на деплой.
Проблеми статичних ключів:
- живуть роками - їх рідко ротують, бо це болісно;
- витікають: у журналах збирання, через скомпрометовану залежність чи action у пайплайні, через неуважний
echo, через форк з доступом до секретів; - працюють звідусіль - вкрадений ключ можна використати з будь-якого комп'ютера;
- часто мають завеликі права («адміністратор, щоб точно запрацювало»).
OIDC (OpenID Connect) - без збережених секретів:
- на кожен запуск пайплайну CI-платформа (GitHub Actions, GitLab CI) видає короткоживучий підписаний токен з даними про запуск: репозиторій, гілка, середовище, workflow;
- хмарний провайдер (AWS, GCP, Azure) довіряє CI-платформі як провайдеру ідентичності й обмінює цей токен на тимчасові облікові дані на хвилини;
- довіра обмежена умовами: «лише репозиторій
org/shop, лише гілкаmain, лише оточенняproduction».
permissions:
id-token: write # дозволити запуску отримати OIDC-токен
contents: read
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/deploy-shop
aws-region: eu-central-1
Що це дає:
- нема чого красти - у секретах CI немає довгоживучих ключів;
- облікові дані живуть хвилини і прив'язані до конкретного запуску;
- точні умови: пул-реквест з форку чи інша гілка роль не отримають.
Що важливо налаштувати правильно:
- умови довіри (claims) мають бути вузькими - лише
repoбез гілки чи середовища дозволить будь-якій гілці (зокрема з необережного PR) деплоїти в продакшен; - права ролі - найменші: деплой конкретного сервісу, а не адміністратор облікового запису;
- захист оточень у CI (обов'язкове затвердження для
production).
Решта гігієни CI: закріплення сторонніх actions за хешем коміту (а не тегом), мінімальні permissions для GITHUB_TOKEN, обережність з pull_request_target, секрети не потрапляють у журнали.