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.