[AWS] STS / AssumeRole: 임시 자격, cross-account
STS, AssumeRole, AssumeRoleWithWebIdentity, AssumeRoleWithSAML, external ID, cross-account
정의
STS (Security Token Service) = 임시 자격 증명 발급. short-lived (15분-12시간) credentials.
5가지 API
| API | 사용 |
|---|---|
AssumeRole | IAM role assume |
AssumeRoleWithWebIdentity | OIDC (EKS IRSA, GitHub OIDC) |
AssumeRoleWithSAML | SAML SSO |
GetSessionToken | MFA token |
GetCallerIdentity | 누구인지 |
AssumeRole 흐름
sequenceDiagram
autonumber
participant User
participant STS
participant TargetRole
participant S3
User->>STS: AssumeRole(arn:role/admin)
Note over STS: 신뢰 관계 + 권한 확인
STS-->>User: { AccessKeyId, SecretAccessKey, SessionToken, Expiration }
User->>S3: GET object (임시 credentials)
S3-->>User: object
Note over User: 1시간 후 만료
User->>STS: AssumeRole 다시
Cross-Account AssumeRole
flowchart LR
Acct1["Account 1<br/>(User alice)"] -->|AssumeRole| Acct2Role["Account 2<br/>Role: data-reader"]
Acct2Role -->|trust policy| Trust["Principal: arn:aws:iam::1:user/alice"]
Acct2Role -->|permission| S3["S3 in Account 2"]
Trust Policy (Account 2 role)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::ACCOUNT-1:root" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": { "sts:ExternalId": "shared-secret-string" }
}
}]
}
IMPORTANT
External ID 가 confused deputy 공격 방어. SaaS 가 우리 계정 접근 시 반드시.
Web Identity (OIDC) - GitHub Actions
permissions:
id-token: write
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123:role/github-actions
aws-region: us-east-1
GitHub 의 OIDC token → AWS role assume. long-term access key 없이.
sequenceDiagram
GH[GitHub Actions] ->>OIDC: token 발급 (jwt)
GH->>STS: AssumeRoleWithWebIdentity(token)
STS->>AWS_OIDC: token 검증 (jwks)
AWS_OIDC-->>STS: OK
STS-->>GH: temporary credentials
GH->>AWS: API 호출
EKS IRSA (위와 동일)
자세한 건 aws-eks 의 IRSA 절.
Session Tags
aws sts assume-role \
--role-arn arn:role/x \
--role-session-name session \
--tags Key=Team,Value=backend
"Condition": {
"StringEquals": { "aws:PrincipalTag/Team": "backend" }
}
같은 role 의 세션마다 다른 tag → 세분화 권한.
흔한 함정
WARNING
- External ID 누락 = 3rd party 신뢰 약함.
- 장기 access key 와 혼용 = role 의 의미 깨짐.
- 세션 만료 갱신 안 함 = 1시간 후 API 호출 실패. SDK 의 자동 refresh 확인.
- trust policy 의 너무 넓은 Principal = 모든 user 가 assume.
관련 위키
이 글의 용어 (4개)
- [Auth] OAuth 2.0 / 2.1: Authorization Code + PKCEauth-security
- 정의 OAuth 2.0 (RFC 6749, 2012) 은 제3자 앱이 사용자 동의로 자원에 접근 하게 하는 권한 위임 프레임워크. 인증 (authentication) 이 아니라 …
- [AWS] EKS: managed Kubernetescloud
- 정의 EKS (Elastic Kubernetes Service) = AWS 의 managed K8s control plane. worker node 는 사용자 (또는 Fargat…
- [AWS] IAM: User, Role, Policy, STScloud
- 정의 IAM (Identity and Access Management) = AWS 의 권한 관리 전부. User, Group, Role, Policy. 객체 | 객체 | 의미 |…
- [CI/CD] GitHub Actions: workflow, action, runnerdevops
- 정의 GitHub Actions = GitHub 내장 CI/CD. YAML workflow + marketplace action. 2018 출시 → Travis CI 대체. 구조…
💬 댓글