IAM Roles - Deep Dive
Trust Policy, Cross-Account, Confused Deputy, Roles Anywhere
Tổng quan
IAM Role là một identity trong AWS với permissions cụ thể, được thiết kế để bất kỳ ai cần đều có thể assume (đảm nhận), thay vì gắn cố định với một người dùng.
Ai có thể assume Role?
- IAM Users (cùng account hoặc khác account)
- IAM Roles khác (role chaining)
- AWS Services (EC2, Lambda, ECS...)
- Federated users (SAML 2.0, OpenID Connect)
- External workloads (IAM Roles Anywhere)
Các loại Role
1. Service Role
Service Role là role mà một AWS service assume để thực hiện actions thay bạn.
Đặc điểm:
- Bạn tự tạo và quản lý
- Bạn có thể chỉnh sửa permissions
- Trust policy cho phép AWS service assume
Ví dụ Trust Policy cho EC2 Service Role:
2. Service-Linked Role
Service-Linked Role là loại service role được liên kết trực tiếp với một AWS service cụ thể.
Ví dụ Service-Linked Roles:
| Service | Role Name | Mục đích |
|---|---|---|
| Auto Scaling | AWSServiceRoleForAutoScaling | Manage EC2 instances |
| ECS | AWSServiceRoleForECS | Manage ECS resources |
| RDS | AWSServiceRoleForRDS | Enhanced monitoring |
| Elastic Load Balancing | AWSServiceRoleForElasticLoadBalancing | Manage load balancers |
Trust Policy vs Permissions Policy
Mỗi IAM Role có 2 phần policy (cả 2 đều cần thiết):
Trust Policy
Định nghĩa ai (principals) được phép assume role.
Các loại Principal trong Trust Policy:
| Principal Type | Ví dụ | Use case |
|---|---|---|
| AWS Account | "AWS": "arn:aws:iam::123456789012:root" | Cho phép toàn bộ account |
| IAM User | "AWS": "arn:aws:iam::123456789012:user/alice" | Cho phép user cụ thể |
| IAM Role | "AWS": "arn:aws:iam::123456789012:role/AdminRole" | Role chaining |
| AWS Service | "Service": "lambda.amazonaws.com" | Cho phép AWS service |
| Federated | "Federated": "arn:aws:iam::123456789012:saml-provider/ExampleProvider" | SSO/Identity federation |
Permissions Policy
Định nghĩa những gì role được phép làm sau khi assume.
Role Chaining
Role chaining là khi bạn dùng một role để assume role khác.
Ví dụ thực tế:
Giới hạn quan trọng của Role Chaining
| Giới hạn | Giá trị |
|---|---|
| Maximum session duration | 1 giờ (bất kể setting của role) |
| Session tags | Phải set Transitive để pass qua các hop |
Nguồn: Role chaining limits
Cross-Account Access
Cross-Account là gì?
Cross-Account Access là khi người/resource ở Account A cần truy cập resources ở Account B - là 2 AWS accounts hoàn toàn riêng biệt.
Tại sao công ty có nhiều AWS accounts?
Thực tế các công ty thường tách accounts theo môi trường:
Lý do tách accounts:
| Lý do | Giải thích |
|---|---|
| Isolation | Lỗi ở Dev không ảnh hưởng Prod |
| Billing | Biết chi phí từng môi trường |
| Security | Giới hạn blast radius khi bị hack |
| Compliance | Prod có policy riêng chặt hơn |
Vấn đề cần giải quyết
Giải pháp: IAM Role làm "cầu nối"
Cần CẢ HAI bên cho phép!
Từng bước setup
Bước 1: Account B (Prod) tạo Role - "Chủ nhà mời khách"
Account B nói: "Tôi cho phép Account A vào, nhưng chỉ được đọc S3 logs thôi"
Trust Policy - Ai được vào:
Permissions Policy - Được làm gì sau khi vào:
Bước 2: Account A (Dev) cấp quyền cho Hiệp - "Sếp cho nhân viên đi"
Bước 3: Hiệp assume role và truy cập
Ví dụ thực tế hay gặp
| Scenario | Account A | Account B |
|---|---|---|
| Dev team cần xem prod logs | Dev Account | Prod Account |
| CI/CD deploy lên production | DevOps Account | Prod Account |
| Security team audit nhiều accounts | Security Account | Tất cả accounts |
| Vendor/Partner cần access | Partner's Account | Your Account |
Confused Deputy Problem
Confused Deputy là vấn đề bảo mật khi một entity không có quyền có thể lừa một entity có nhiều quyền hơn thực hiện actions thay mình.
Ví dụ thực tế: Datadog Monitoring
Datadog là SaaS monitoring service - bạn cần cấp quyền để Datadog đọc CloudWatch metrics từ AWS account của bạn.
Datadog hoạt động như thế nào?
Bước 1: Bạn setup Datadog
Bước 2: Hacker cũng là khách hàng Datadog
Bước 3: Tấn công Confused Deputy
Hacker sửa request để yêu cầu Datadog đọc metrics từ account của BẠN:
Vấn đề: Trust Policy không phân biệt ai yêu cầu
Giải pháp: External ID
External ID = "mật khẩu bí mật" giữa bạn và Datadog.
Cách hoạt động
Trust Policy có External ID (AN TOÀN):
Giờ Hacker bị chặn
Tại sao 1 giờ credentials vẫn nguy hiểm?
Tóm tắt
| Khái niệm | Giải thích |
|---|---|
| Confused Deputy | Third-party (Datadog) bị lừa để truy cập sai account |
| Deputy (người bị lừa) | Datadog - third-party service |
| Kẻ tấn công | Hacker cũng là khách hàng của Datadog |
| Nạn nhân | Bạn - chủ account bị truy cập trái phép |
| External ID | Mật khẩu bí mật để chống bị lừa |
Quy tắc: Khi cho third-party access vào account, LUÔN yêu cầu External ID!
Nguồn thực tế: Datadog AWS Integration yêu cầu External ID khi setup.
Cross-Service Confused Deputy
Khi AWS service access resources thay bạn, dùng các condition keys:
| Condition Key | Mô tả |
|---|---|
aws:SourceAccount | Account ID của service gọi |
aws:SourceArn | ARN của resource gốc |
aws:SourceOrgID | Organization ID |
Ví dụ: CloudTrail ghi logs vào S3:
Nguồn: The confused deputy problem
IAM Roles Anywhere
Vấn đề cần giải quyết
Bạn có server nằm ngoài AWS (on-premises, datacenter công ty, hoặc cloud khác) cần truy cập AWS resources.
Cách cũ: Access Key (KHÔNG AN TOÀN)
Cách mới: IAM Roles Anywhere
Ý tưởng: Dùng certificate (chứng chỉ số) thay vì Access Key.
Tại sao certificate tốt hơn Access Key?
| Access Key | Certificate |
|---|---|
| Không tự hết hạn (phải tự rotate) | Có ngày hết hạn tự động |
| Chỉ là chuỗi text dễ copy | Gắn với identity cụ thể |
| Lộ = mất luôn | Có thể revoke ngay lập tức |
| Khó biết ai đang dùng | Biết rõ certificate thuộc server nào |
Luồng hoạt động chi tiết
Ví dụ thực tế: Jenkins CI/CD
Scenario: Công ty có Jenkins server on-premises, cần deploy code lên AWS.
Các khái niệm chính
| Khái niệm | Giải thích | Ví dụ |
|---|---|---|
| Certificate Authority (CA) | Nơi cấp certificates | AWS Private CA, hoặc CA công ty tự dựng |
| Trust Anchor | Đăng ký CA với AWS để AWS tin tưởng | "AWS ơi, certificates từ CA này là hợp lệ nhé" |
| Certificate | Chứng chỉ số của server | Giống CMND của server |
| Profile | Config chọn role nào sẽ assume | "Certificate này được assume role XYZ" |
Khi nào dùng IAM Roles Anywhere?
| Dùng Roles Anywhere | KHÔNG cần Roles Anywhere |
|---|---|
| Server on-premises | EC2, Lambda (đã có Instance/Execution Role) |
| Server ở Azure, GCP | ECS, EKS (đã có Task/Pod Role) |
| CI/CD on-premises (Jenkins, GitLab) | GitHub Actions (có OIDC Federation) |
| Edge devices, IoT | Bất kỳ workload chạy trong AWS |
So sánh các cách authenticate từ bên ngoài AWS
Yêu cầu Certificate
| Yêu cầu | Giá trị |
|---|---|
| Version | X.509v3 |
| Basic Constraints | CA: false |
| Key Usage | Digital Signature |
| Signing Algorithm | SHA256 hoặc mạnh hơn |
Setup cơ bản
Trust Policy cho Role:
Nguồn: What is IAM Roles Anywhere?
Session Policies
Session Policy là gì?
Vấn đề: Role có nhiều quyền, nhưng bạn chỉ muốn dùng một phần nhỏ trong một session cụ thể.
Cách hoạt động
Session Policy là policy được pass khi assume role để giới hạn thêm permissions.
Ví dụ cụ thể
Scenario: Bạn có script cần đọc file từ S3, nhưng role có full access.
Kết quả:
Điểm quan trọng
Tại sao cần Session Policy?
| Lý do | Giải thích |
|---|---|
| Least privilege | Chỉ lấy đúng quyền cần dùng cho task cụ thể |
| Giảm blast radius | Nếu credentials bị lộ, hacker chỉ có quyền hạn chế |
| Scoped tokens | Tạo tokens khác nhau cho các tasks khác nhau từ cùng 1 role |
| Temporary restrictions | Giới hạn tạm thời mà không cần sửa role |
So sánh: Có vs Không có Session Policy
Best Practices
1. Luôn dùng Role thay vì Access Keys khi có thể
2. Principle of Least Privilege
3. Dùng Conditions trong Trust Policy
4. Set Maximum Session Duration phù hợp
| Tác vụ | Recommended Duration |
|---|---|
| Interactive console | 1-4 giờ |
| Automated pipelines | 1-2 giờ |
| Long-running jobs | 6-12 giờ |
5. Monitor với CloudTrail
Theo dõi các events:
AssumeRoleAssumeRoleWithSAMLAssumeRoleWithWebIdentity