how/cicd
Workflow получает короткий JWT от GitHub, обменивает его на временные STS-creds, запускает Terraform - и через час всё это просто исчезает. Никаких access-key секретов.
Стандартный способ дать CI доступ к AWS - это положить
AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY в GitHub Secrets.
И это плохо по нескольким причинам:
OIDC заменяет эту схему на короткоживущий обмен. Идея: GitHub умеет выпускать JWT с информацией о репозитории, ветке и workflow. AWS умеет верить этому JWT (если ты настроил доверие) и возвращать временные credentials. Все секреты живут не дольше одного запуска CI.
Жми ▶ - пошагово.
IAM user tf-ci создан в AWS, у него есть access key, ключ
скопирован в GitHub Secrets. В workflow:
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}Терраформ подхватит их и пойдёт работать с AWS. Это работает. И это проблема:
Поэтому в продакшне эта схема считается legacy.
итого
Что важно запомнить:
audience в trust-policy - это sts.amazonaws.com.
GitHub подписывает JWT этим audience. AWS проверяет
совпадение - если в JWT другой audience, отказ.sub в JWT содержит строку вида
repo:my-org/my-repo:ref:refs/heads/main. Trust policy в IAM
role обычно ограничивает: «только этот repo и только эта
ветка». Так PR из форка не получит доступ.AdministratorAccess -
если CI скомпрометирован, blast-radius ограничен этой ролью.Дальше: tf-policy-gate про то, как ещё больше сузить безопасность через policy-engine между plan и apply.