본문으로 건너뛰기
김신건의 로그

[AWS] STS / AssumeRole: 임시 자격, cross-account

· 수정 · 📖 약 1분 · 214자/단어 #aws #sts #assume-role #iam #cloud
STS, AssumeRole, AssumeRoleWithWebIdentity, AssumeRoleWithSAML, external ID, cross-account

정의

STS (Security Token Service) = 임시 자격 증명 발급. short-lived (15분-12시간) credentials.

5가지 API

API사용
AssumeRoleIAM role assume
AssumeRoleWithWebIdentityOIDC (EKS IRSA, GitHub OIDC)
AssumeRoleWithSAMLSAML SSO
GetSessionTokenMFA 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 IDconfused 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

  1. External ID 누락 = 3rd party 신뢰 약함.
  2. 장기 access key 와 혼용 = role 의 의미 깨짐.
  3. 세션 만료 갱신 안 함 = 1시간 후 API 호출 실패. SDK 의 자동 refresh 확인.
  4. 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 대체. 구조…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기