Облачные секреты: AWS engine

Тот же принцип динамики, но для облака: Vault выдаёт временные ключи доступа AWS.

AWS secrets engine — движок, динамически выдающий временные креды AWS (Access Key/Secret Key или STS-токены) по запросу и отзывающий их по истечении аренды.

Долгоживущие ключи AWS — классический источник катастроф: один закоммиченный AKIA... может стоить компании огромного счёта за майнинг. AWS-движок Vault убирает статические ключи, выдавая временные по запросу.

Настройка движка

vault secrets enable aws

# креды, под которыми Vault управляет IAM
vault write aws/config/root \
  access_key=AKIA_ADMIN_KEY \
  secret_key=admin-secret \
  region=eu-central-1

Роль: что выдавать

Роль описывает, какие права получат временные креды. Здесь — политика доступа только на чтение S3-бакета:

vault write aws/roles/s3-readonly \
  credential_type=iam_user \
  policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject", "s3:ListBucket"],
    "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"]
  }]
}
EOF

Запрос временных кредов

vault read aws/creds/s3-readonly
{
  "lease_id": "aws/creds/s3-readonly/k2Lm9",
  "lease_duration": 3600,
  "data": {
    "access_key": "AKIA_TEMP_XXXX",
    "secret_key": "temp-secret-key",
    "security_token": null
  }
}

Два типа кредов

credential_typeЧто выдаётОсобенности
iam_userсоздаёт реального временного IAM-пользователяесть задержка распространения IAM, лимит на число юзеров
assumed_roleSTS-токен через AssumeRoleбыстрее, короче живёт, предпочтительно

Как работает под капотом

Для iam_user Vault под админскими ключами вызывает IAM API: создаёт пользователя, прикрепляет инлайн-политику, генерирует ключ доступа и отдаёт его. По истечении аренды — удаляет пользователя и ключ. Для assumed_role Vault обращается к STS и возвращает короткоживущий набор (access key + secret + security token), который AWS сам инвалидирует по сроку. Важная тонкость iam_user: только что созданные ключи IAM распространяются по AWS не мгновенно, поэтому первые секунды запрос может получать AccessDenied — приложение должно делать ретраи.

Частые ошибки

  • Использовать iam_user там, где подошёл бы assumed_role — упираетесь в лимит IAM-пользователей и задержку распространения.
  • Не делать ретраи на свежих iam_user-кредах — словите случайные AccessDenied.
  • Широкая policy_document — временные креды с лишними правами всё равно опасны.
  • Долгий max_ttl — нивелирует выгоду временных кредов.

Итог

  • AWS engine выдаёт временные IAM-креды по запросу и отзывает по истечении аренды.
  • assumed_role (STS) обычно предпочтительнее iam_user: быстрее и без лимитов на юзеров.
  • Свежие iam_user-ключи распространяются не мгновенно — нужны ретраи.
Проверьте себя
1. Какую проблему решает AWS secrets engine?
AУскоряет S3
BУбирает долгоживущие статические ключи AWS, выдавая временные по запросу
CШифрует бакеты
DУправляет биллингом
2. Почему assumed_role часто предпочтительнее iam_user?
AОн даёт больше прав
BSTS-креды быстрее выдаются, короче живут и не упираются в лимит IAM-пользователей
CОн не требует политики
Diam_user не поддерживается
3. Почему свежие iam_user-креды могут давать AccessDenied первые секунды?
AVault выдаёт неверный ключ
BНовые IAM-ключи распространяются по AWS не мгновенно — нужны ретраи
CИстёк lease
DНе настроен регион