AWSMiddleTechnical

Что такое AssumeRole и cross-account access?

AssumeRole — STS API, возвращает временные credentials роли. Cross-account access: в целевом аккаунте роль с trust на исходный аккаунт, у вызывающего право sts:AssumeRole на ARN роли.

Механика

STS AssumeRole принимает RoleArn, RoleSessionName, опционально ExternalId, DurationSeconds, Policy, PolicyArns, Tags, SerialNumber+TokenCode для MFA. Возвращает AccessKeyId, SecretAccessKey, SessionToken и Expiration.

Настройка cross-account

В целевом аккаунте B создаётся роль DeployRole с trust policy на аккаунт A:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "AWS": "arn:aws:iam::111111111111:role/CiRunner" },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": { "sts:ExternalId": "talanto-prod" },
      "Bool": { "aws:MultiFactorAuthPresent": "true" }
    }
  }]
}

В исходном аккаунте A у CiRunner permissions policy:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::222222222222:role/DeployRole"
  }]
}

Использование

aws sts assume-role \
  --role-arn arn:aws:iam::222222222222:role/DeployRole \
  --role-session-name ci-build-1234 \
  --external-id talanto-prod \
  --duration-seconds 3600

Через ~/.aws/config:

[profile deploy]
role_arn = arn:aws:iam::222222222222:role/DeployRole
source_profile = ci
external_id = talanto-prod
role_session_name = ci-runner

В коде

import boto3

sts = boto3.client("sts")
resp = sts.assume_role(
    RoleArn="arn:aws:iam::222222222222:role/DeployRole",
    RoleSessionName="ci-build-1234",
    ExternalId="talanto-prod",
    DurationSeconds=3600,
)
creds = resp["Credentials"]
s3 = boto3.client(
    "s3",
    aws_access_key_id=creds["AccessKeyId"],
    aws_secret_access_key=creds["SecretAccessKey"],
    aws_session_token=creds["SessionToken"],
)

Подводные камни

  • Без ExternalId у третьесторонней роли — confused deputy.
  • Role chaining: AssumeRole из уже временной сессии ограничен 1 часом, даже если MaxSessionDuration роли — 12 часов.
  • В trust policy "AWS": "arn:aws:iam::ACCOUNT:root" = любой principal в том аккаунте, кому разрешён sts:AssumeRole.
  • Session policy в --policy может только сузить permissions, не расширить.
  • Без понятного RoleSessionName аудит CloudTrail (поле userIdentity.arn) бесполезен.
  • Session tags требуют sts:TagSession в trust policy, иначе AccessDenied.
  • Регион STS: глобальный endpoint sts.amazonaws.com выдаёт токены, не работающие в opt-in регионах; используйте региональные endpoint.

Common mistakes

  • Настроить только одну сторону доступа.
  • Думать, что permissions caller автоматически добавляются к role.
  • Не использовать ExternalId для внешнего поставщика.

What the interviewer is testing

  • Объясняет trust policy и sts:AssumeRole permission.
  • Понимает temporary credentials и session context.
  • Учитывает CloudTrail, MFA/session tags/external ID.

Sources

Related topics