AWS Security Token Service (STS)
Temporary Credentials, AssumeRole, Web Identity, SAML, Session Policies
Tổng quan
AWS Security Token Service (AWS STS) là dịch vụ tạo temporary security credentials để truy cập AWS resources.
Nói ngắn gọn:
AWS STS thường xuất hiện khi bạn dùng:
- IAM Role
- Cross-account access
- AWS service role như EC2, Lambda, ECS task role
- Federation với SAML/OIDC
- Amazon Cognito Identity Pool
- AWS IAM Identity Center
- GitHub Actions OIDC vào AWS
STS giải quyết vấn đề gì
Vấn đề với long-term credentials
Nếu bạn hardcode access key trong app:
Rủi ro:
- Key có thể bị commit lên GitHub.
- Key có thể nằm trong server, container image, log, hoặc máy developer.
- Nếu bị lộ, attacker dùng được đến khi bạn rotate hoặc disable.
- Khó cấp quyền tạm thời cho user ngoài AWS account.
STS dùng temporary credentials
STS tạo credentials khi cần, có thời hạn, và gắn với session cụ thể.
AWS nêu các lợi ích chính của temporary credentials:
- Không cần phân phối hoặc nhúng long-term credentials trong application.
- Có thể cấp quyền cho users không có AWS identity riêng.
- Credentials có lifetime giới hạn, hết hạn thì không thể tái sử dụng.
STS đứng sau những cơ chế nào
Câu nhớ nhanh:
Cứ thấy AWS cấp temporary credentials thì gần như có STS ở phía sau.
| Cơ chế bạn thấy | STS/API phía sau | Ghi nhớ |
|---|---|---|
| IAM Role | AssumeRole hoặc cơ chế STS-managed tương đương | Role là “ghế quyền”; STS phát “vé tạm” để ngồi vào role. |
| Cross-account access | AssumeRole | Account A assume role ở Account B. |
| EC2 Instance Profile | Temporary credentials dựa trên role | App lấy credentials qua Instance Metadata Service, không hard-code key. |
| ECS Task Role | Temporary credentials dựa trên task role | Container lấy credentials qua task metadata endpoint. |
| Lambda Execution Role | Temporary credentials dựa trên execution role | Lambda runtime cung cấp credentials tạm cho function. |
| EKS IRSA | AssumeRoleWithWebIdentity | Kubernetes ServiceAccount dùng OIDC token để lấy AWS credentials. |
| GitHub Actions OIDC | AssumeRoleWithWebIdentity | CI/CD không cần lưu AWS access key dài hạn. |
| SAML federation | AssumeRoleWithSAML | User từ corporate IdP như Okta/Entra ID vào AWS. |
| OIDC federation | AssumeRoleWithWebIdentity | IdP phát JWT/OIDC token, AWS đổi thành temporary credentials. |
| Cognito Identity Pool | Temporary credentials qua STS | App user đổi token từ User Pool/IdP thành AWS credentials. |
| IAM Identity Center / AWS CLI SSO | Role session/temporary credentials | User SSO vào AWS account và nhận credentials tạm để dùng Console/CLI. |
| MFA-protected temporary credentials cho IAM user | GetSessionToken | IAM user lấy credentials tạm có MFA context. |
| Custom federation broker | GetFederationToken hoặc AssumeRole | Broker tự xác thực user ngoài AWS rồi xin credentials tạm. |
Ngược lại, các dịch vụ như KMS, Secrets Manager, ACM, WAF, GuardDuty, Inspector, Macie không “đứng sau bởi STS” theo nghĩa nghiệp vụ chính. Caller có thể dùng STS credentials để gọi API của chúng, nhưng lõi của các dịch vụ đó không phải là cấp credentials.
Temporary credentials gồm những gì
Temporary credentials từ STS thường gồm:
| Thành phần | Ý nghĩa |
|---|---|
AccessKeyId | Access key ID tạm thời |
SecretAccessKey | Secret key tạm thời |
SessionToken | Token bắt buộc đi kèm request |
Expiration | Thời điểm credentials hết hạn |
Ví dụ response rút gọn:
Điểm quan trọng:
- Temporary credentials hoạt động gần giống access key dài hạn khi gọi AWS API.
- Khác biệt chính là phải gửi thêm session token.
- Sau khi hết hạn, AWS không còn chấp nhận request ký bằng credentials đó.
- Không nên giả định kích thước tối đa cố định của
SessionToken; AWS khuyến nghị không hardcode giới hạn token size.
STS hoạt động như thế nào
Flow tổng quát:
Có 2 lớp quyền quan trọng:
| Lớp | Trả lời câu hỏi | Ví dụ |
|---|---|---|
| Trust policy | Ai được assume role? | User, role, service, SAML provider, OIDC provider |
| Permissions policy | Role làm được gì sau khi assume? | s3:GetObject, ec2:DescribeInstances |
Ví dụ trust policy cho EC2 assume role:
Ví dụ permissions policy sau khi role được assume:
Các API STS quan trọng
| API | Dùng khi nào | Caller |
|---|---|---|
AssumeRole | IAM user/role assume IAM role, thường dùng cross-account hoặc privilege elevation có kiểm soát | IAM user hoặc IAM role |
AssumeRoleWithWebIdentity | OIDC/JWT web identity, Cognito, GitHub Actions OIDC | Caller có JWT hợp lệ từ IdP |
AssumeRoleWithSAML | Enterprise federation qua SAML 2.0 | Caller có SAML assertion |
GetSessionToken | Lấy temporary credentials cho IAM user, thường dùng MFA-protected API access | IAM user hoặc root |
GetFederationToken | Custom federation broker cấp temporary credentials cho federated user | IAM user hoặc root |
GetCallerIdentity | Kiểm tra identity hiện tại của credentials | Gần như mọi principal |
Nguồn: Compare AWS STS credentials
AssumeRole chi tiết
AssumeRole trả về temporary credentials để truy cập AWS resources.
Use cases phổ biến:
- User ở Account A truy cập resource ở Account B.
- Developer tạm thời assume admin/support role có MFA.
- CI/CD role assume deploy role.
- Role chaining trong một số workflow.
Flow cross-account
Hai điều kiện cần có
Để cross-account assume role thành công:
- Role trust policy ở Account B phải trust principal/account từ Account A.
- Principal ở Account A phải có identity policy cho phép gọi
sts:AssumeRolevào role ARN ở Account B.
AWS nói rõ AssumeRole tạo credentials gồm access key ID, secret access key, và security token; thường dùng trong cùng account hoặc cross-account access.
AssumeRole với MFA
Trust policy có thể yêu cầu MFA:
Khi gọi AssumeRole, caller truyền:
SerialNumber: ARN hoặc serial của MFA deviceTokenCode: mã TOTP hiện tại
Pattern này hay gặp trong:
- Cross-account admin access
- Break-glass role
- Production access
AssumeRoleWithWebIdentity và Cognito
AssumeRoleWithWebIdentity đổi OIDC-compatible JWT thành temporary credentials.
AWS mô tả API này trả về AWS security credentials tạm thời khi nhận JSON Web Token từ identity provider như Login with Amazon, Facebook, Google, GitHub Actions, Azure DevOps, hoặc provider tương thích OIDC.
Flow:
Liên hệ với Cognito User Pool và Identity Pool
Trong kiến trúc Cognito:
Ví dụ upload S3 theo user:
Điểm cần nhớ:
AssumeRoleWithWebIdentitykhông yêu cầu AWS credentials để ký request.- Request dùng web identity token/JWT làm bằng chứng.
- AWS validate chữ ký token qua public keys của IdP và kiểm tra role trust policy.
AssumeRoleWithSAML
AssumeRoleWithSAML dùng khi doanh nghiệp có identity provider hỗ trợ SAML 2.0.
Use cases:
- Nhân viên login qua corporate IdP như Active Directory Federation Services, Okta, Ping, Azure AD/Entra ID.
- Không tạo IAM user cho từng nhân viên.
- IdP gửi SAML assertion sang AWS.
- AWS STS trả temporary credentials cho role phù hợp.
Flow:
Khác với AssumeRole:
- Caller không cần long-term AWS credentials trước đó.
- Caller cần SAML assertion hợp lệ từ known identity provider.
- Phù hợp với enterprise SSO/federation.
Nguồn: Requesting credentials through a SAML 2.0 identity provider
GetSessionToken và GetFederationToken
GetSessionToken
GetSessionToken tạo temporary credentials cho IAM user hoặc root user.
Thường dùng để:
- Yêu cầu MFA trước khi gọi API nhạy cảm.
- Tạo session tạm thời từ IAM user credentials.
Điểm cần nhớ:
- Hỗ trợ MFA.
- Không hỗ trợ session policy.
- Temporary credentials từ
GetSessionTokenbị giới hạn khi gọi một số IAM/STS APIs.
GetFederationToken
GetFederationToken dùng trong custom federation broker.
Pattern:
Trong thực tế hiện đại, nhiều workload ưu tiên:
- IAM Identity Center cho workforce SSO
- Cognito cho web/mobile users
- OIDC federation cho CI/CD như GitHub Actions
Session Policies
Session policy là policy truyền vào khi tạo temporary session.
Điểm quan trọng:
Session policy chỉ có thể giảm quyền, không thể tăng quyền.
Ví dụ role cho phép S3 full access trong một bucket:
Khi assume role, truyền session policy chỉ cho một prefix:
Kết quả:
- Session chỉ được
GetObjectvàPutObject. - Chỉ trong prefix
users/alice/*. - Không được quyền ngoài role gốc.
AWS nêu rõ session permissions là giao của role identity-based policies và session policies.
Nguồn: AssumeRole - Permissions
Session Tags và ABAC
Session tags là tag key-value gắn vào role session khi gọi STS.
Ví dụ:
Sau đó IAM policy có thể dùng principal tag:
Ứng dụng:
- ABAC: Attribute-Based Access Control
- Phân quyền theo department, project, tenant, cost center
- Audit tốt hơn trong CloudTrail
Lưu ý:
- Principal cần quyền pass session tags.
- Có thể đánh dấu tag là transitive để tag đi tiếp trong role chaining.
- Session tags có packed binary limit cùng session policies; response
PackedPolicySizecho biết mức gần giới hạn.
Nguồn: AssumeRole - Tags
Duration và Expiration
Duration phụ thuộc API và cấu hình role.
Với AssumeRole:
| Thuộc tính | Giá trị |
|---|---|
| Minimum | 900 giây, tức 15 phút |
| Default | 3600 giây, tức 1 giờ |
| Maximum | Tối đa theo maximum session duration của role, có thể đến 12 giờ |
| Role chaining | Tối đa 1 giờ |
Ví dụ:
Nếu role max session duration là 6 giờ mà bạn request 12 giờ, request sẽ fail.
Nếu bạn đang dùng role A rồi assume role B, đó là role chaining. Trong role chaining, session qua AWS CLI/API bị giới hạn tối đa 1 giờ.
Nguồn: AssumeRole - DurationSeconds
Regional vs Global Endpoint
AWS STS có:
- Global endpoint:
https://sts.amazonaws.com - Regional endpoints: ví dụ
https://sts.us-east-1.amazonaws.com
AWS nói bạn có thể gửi STS API calls đến global endpoint hoặc Regional endpoints. Regional endpoint gần hơn có thể:
- Giảm latency
- Cải thiện performance
- Cho phép failover sang endpoint Region khác nếu không liên lạc được endpoint ban đầu
Điểm quan trọng:
Nguồn: AWS STS and AWS regions
Common Architectures
1. EC2 truy cập S3 bằng Instance Profile
Không hardcode access key trên EC2. Gắn IAM role vào instance profile.
2. Lambda truy cập DynamoDB
Lambda service assume execution role thay function.
3. Cross-account deployment
Trust policy ở Prod Account trust CI/CD Account hoặc CI/CD role.
4. GitHub Actions OIDC vào AWS
Không cần lưu AWS access key trong GitHub secrets.
5. Cognito User Pool + Identity Pool + S3
Đây là flow của câu hỏi edtech course documents.
Security Best Practices
1. Ưu tiên role thay vì long-term access keys
2. Dùng least privilege
Role permissions policy chỉ nên chứa action/resource cần thiết.
Không dùng Action: "*" và Resource: "*" trừ khi thật sự cần.
3. Trust policy phải chặt
Trust policy là cửa vào của role.
Với cross-account third party, dùng:
ExternalIdaws:PrincipalArnaws:PrincipalOrgID- MFA condition khi phù hợp
4. Dùng MFA cho privileged AssumeRole
Production/admin roles nên yêu cầu MFA:
5. Dùng session duration ngắn vừa đủ
Nguyên tắc:
| Use case | Duration gợi ý |
|---|---|
| CI/CD deploy | Vừa đủ cho pipeline |
| Human admin access | Ngắn, thường 1-4 giờ |
| Break-glass access | Rất ngắn, audit chặt |
| App service role | Để SDK/service tự refresh |
6. Không log credentials
Không log:
SecretAccessKeySessionToken- Full environment variables chứa credentials
7. Audit bằng CloudTrail
Theo dõi các event:
AssumeRoleAssumeRoleWithWebIdentityAssumeRoleWithSAMLGetSessionTokenGetFederationToken
Kiểm tra:
- Ai assume role?
- Assume role từ đâu?
- Session name là gì?
- Có source identity/session tags không?
- Có MFA không?
Exam Tips
STS không phải là gì?
| Hiểu nhầm | Sự thật |
|---|---|
| STS lưu user database | Không, đó là IAM/Identity Center/Cognito/IdP |
| STS tự quyết định quyền | Không, quyền đến từ IAM role/policy/session policy |
| Temporary credentials không cần token | Sai, phải dùng SessionToken |
| User Pool trực tiếp grant quyền S3 | Sai, cần Identity Pool/STS/IAM role |
| Session policy tăng quyền role | Sai, chỉ giảm quyền bằng intersection |
Quick Reference
| Câu hỏi | Đáp án nhanh |
|---|---|
| STS dùng để làm gì? | Cấp temporary security credentials |
| Credentials gồm gì? | AccessKeyId, SecretAccessKey, SessionToken, Expiration |
| API phổ biến nhất? | AssumeRole |
| Cross-account dùng gì? | sts:AssumeRole |
| OIDC/JWT dùng gì? | AssumeRoleWithWebIdentity |
| SAML dùng gì? | AssumeRoleWithSAML |
| Temporary credentials hết hạn thì sao? | AWS không chấp nhận API request ký bằng credentials đó |
| Session policy có tăng quyền không? | Không, chỉ giới hạn thêm |
| Role chaining duration tối đa? | 1 giờ |
| AssumeRole default duration? | 1 giờ |
| AssumeRole minimum duration? | 15 phút |
| AssumeRole max duration? | Theo role max session duration, tối đa 12 giờ |