AWS IAM (Identity and Access Management)
Users, Groups, Roles, Policies
Tổng quan
IAM là dịch vụ miễn phí của AWS để quản lý:
- Ai (Who) có thể truy cập AWS resources
- Làm gì (What) với những resources đó
Đặc điểm quan trọng:
- ✅ Global service - không thuộc region cụ thể
- ✅ Miễn phí - không tính phí sử dụng IAM
- ✅ Eventual consistency - thay đổi có thể mất vài giây để apply globally
AWS Account vs IAM User
[!IMPORTANT] Đây là khái niệm quan trọng cần hiểu rõ! Account và User là 2 thứ KHÁC NHAU hoàn toàn.
Định nghĩa
Diagram trực quan
So sánh chi tiết
| AWS Account | IAM User | |
|---|---|---|
| Tạo bởi | AWS (khi đăng ký) | IAM trong account |
| Định danh | Account ID (12 số) + Email | Username |
| Billing | ✅ Nhận bill | ❌ Không nhận bill |
| Số lượng | 1 email = 1 account | Nhiều users trong 1 account |
| Permissions | Root = full access | Tùy theo policies được gán |
| Resources | CHỨA resources | SỬ DỤNG resources |
Ví von thực tế
Multiple Accounts (có và không có Organizations)
[!TIP]
- Không có Organizations: Vẫn tạo được nhiều accounts (mỗi email 1 account), nhưng chúng ĐỘC LẬP hoàn toàn, không liên quan nhau
- Có Organizations: Quản lý nhiều accounts CÙNG NHAU - consolidated billing, SCPs giới hạn quyền, centralized management
Xem chi tiết tại aws-organizations.md
Các thành phần chính
ARN (Amazon Resource Name)
ARN là định danh duy nhất để xác định bất kỳ resource nào trong AWS. ARN được dùng rất nhiều trong IAM Policies.
Format của ARN
| Phần | Ý nghĩa | Ví dụ |
|---|---|---|
arn | Cố định | arn |
partition | AWS partition | aws, aws-cn (China), aws-us-gov |
service | Tên service | s3, ec2, lambda, iam |
region | Region (có thể trống) | us-east-1, ap-southeast-1 |
account-id | AWS Account ID | 123456789012 |
resource | Resource type và ID | bucket/my-bucket, role/MyRole |
Ví dụ ARN
Tại sao có ::: vs : ?
Một số trường có thể BỎ TRỐNG → tạo ra nhiều dấu : liền nhau:
Quy tắc nhớ nhanh
ARN trong IAM Policies
1. Root User
Root User là tài khoản được tạo khi đăng ký AWS account.
| Đặc điểm | Mô tả |
|---|---|
| Quyền | Full access - làm được mọi thứ |
| Đăng nhập | Email + Password |
| Không thể restrict | Không thể giới hạn quyền của root |
Best Practices cho Root User
Khi nào BẮT BUỘC dùng Root?
- Thay đổi account settings (name, email, password)
- Close AWS account
- Restore IAM user permissions
- Change/cancel AWS Support plan
- Register as seller in Reserved Instance Marketplace
- Enable MFA delete trên S3 bucket
2. IAM Users
IAM User đại diện cho 1 người hoặc 1 application cần truy cập AWS.
Đặc điểm
| Thuộc tính | Mô tả |
|---|---|
| Username | Unique trong account |
| Credentials | Password (console) và/hoặc Access Keys (CLI/API) |
| Permissions | Được gán qua policies (trực tiếp hoặc qua group) |
| Mặc định | Không có quyền gì khi mới tạo |
Ví dụ tạo IAM User
Access Keys
Dùng để truy cập AWS qua CLI, SDK, API (không phải Console):
Best Practices:
- Rotate access keys định kỳ (90 ngày)
- Không dùng access keys của root user
- 1 user có tối đa 2 access keys (để rotate)
AWS Account ID và Account Alias
Account ID là gì?
Account ID là số 12 chữ số duy nhất định danh cho mỗi AWS Account (không phải của Root User - mà của toàn bộ Account).
Tại sao IAM User cần Account ID khi login?
IAM Users chỉ tồn tại trong một AWS Account cụ thể, không phải global. Khi login, AWS cần biết:
- Account nào bạn muốn đăng nhập (Account ID)
- User nào trong account đó (Username + Password)
[!IMPORTANT] Có thể có IAM User tên "hiep" trong Account A và IAM User tên "hiep" trong Account B - đây là 2 users khác nhau.
Account Alias là gì?
| Khái niệm | Mô tả |
|---|---|
| Account ID | Số 12 chữ số, AWS tự gán, không đổi được |
| Account Alias | Tên thay thế (tự đặt), dễ nhớ hơn Account ID |
| Account Name | Tên hiển thị của account (khác với Alias) |
Account Alias giúp tạo URL login dễ nhớ hơn:
Lưu ý về Account Alias:
- ✅ Optional - không bắt buộc phải tạo
- ✅ Unique globally - không được trùng với account khác trên toàn AWS
- ✅ Tạo/sửa trong IAM Console → Dashboard → AWS Account → Create Alias
So sánh cách đăng nhập: Root User vs IAM User
| Root User | IAM User | |
|---|---|---|
| URL Login | console.aws.amazon.com | <account-id>.signin.aws.amazon.com/console hoặc <alias>.signin.aws.amazon.com/console |
| Đăng nhập bằng | Email + Password | Account ID/Alias + Username + Password |
| Cần Account ID? | ❌ Không | ✅ Có |
Cách lấy Account ID
1. Từ AWS Console:
- Click vào tên account/user ở góc trên bên phải → Account ID hiển thị trong dropdown
2. Từ AWS CLI:
3. Từ IAM Dashboard:
- Vào IAM Console → Dashboard → xem mục AWS Account
3. IAM Groups
IAM Group là tập hợp các IAM Users để quản lý permissions dễ hơn.
Đặc điểm
| Thuộc tính | Mô tả |
|---|---|
| Chứa gì | Chỉ chứa IAM Users (không chứa group khác) |
| 1 user thuộc nhiều groups | ✅ Được phép |
| Group không có credentials | Group không đăng nhập được |
| Permissions | Attach policies vào group → users thừa hưởng |
Ví dụ
4. IAM Roles
IAM Role là identity với temporary credentials để delegate access.
Khác biệt User vs Role
| IAM User | IAM Role | |
|---|---|---|
| Ai dùng | 1 người/application cố định | Nhiều entities có thể assume |
| Credentials | Long-term (password, access keys) | Temporary (tự động rotate) |
| Use case | Employees, permanent apps | AWS services, cross-account, federated users |
Khi nào dùng Role?
Ví dụ: EC2 Instance Role
Tại sao dùng Role thay vì User/Access Key?
Các trường hợp phổ biến dùng Role
| Tình huống | Ví dụ | Tại sao dùng Role |
|---|---|---|
| AWS Service → Service | EC2 đọc S3, Lambda ghi DynamoDB | Service không thể đăng nhập bằng password |
| Cross-account access | Account Dev truy cập Account Prod | An toàn hơn share credentials |
| Quyền cao tạm thời | Developer cần Admin để deploy | Quyền tự hết hạn sau 1-12 giờ |
| Federated users (SSO) | Nhân viên đăng nhập bằng Google/Okta | Không cần tạo IAM User cho từng người |
Trust Policy vs Permissions Policy
Mỗi Role có 2 loại policy:
| Policy | Trả lời câu hỏi | Ví dụ |
|---|---|---|
| Trust Policy | "Ai được assume role này?" | EC2, Lambda, Account B |
| Permissions Policy | "Assume rồi được làm gì?" | s3:GetObject, dynamodb:PutItem |
Cách phân biệt 2 loại Policy
Workflow: 2 Policies link với nhau như thế nào?
Cả 2 đều CẦN!
| Scenario | Trust Policy | Permission Policy | Kết quả |
|---|---|---|---|
| ✅ Đầy đủ | EC2 được assume | s3:GetObject | Thành công |
| ❌ Thiếu Trust | EC2 KHÔNG được assume | s3:GetObject | Fail ngay |
| ❌ Thiếu Permission | EC2 được assume | (trống) | Access Denied |
User Assume Role như thế nào?
So sánh: Gán Policy trực tiếp vs Assume Role
Credentials hết hạn thì sao?
| EC2/Lambda Role | User Assume Role | |
|---|---|---|
| Refresh | Tự động (SDK lo) | Thủ công (phải gọi lại) |
| Cơ chế | SDK gọi Instance Metadata Service | User gọi sts assume-role |
| Hết hạn | Không bao giờ mất quyền | Phải assume lại |
EC2 Role - Tự động refresh:
User Assume Role - Phải refresh thủ công:
Cách làm tự động hơn cho User:
| Cách | Mô tả |
|---|---|
| AWS CLI profiles | Config role_arn trong ~/.aws/config, CLI tự assume |
| SDK credential providers | Code tự refresh khi gần hết hạn |
| AWS SSO | Đăng nhập 1 lần, tự động assume roles |
Local vs EC2: Credentials khác nhau, code giống nhau
Code không cần thay đổi:
Thứ tự AWS SDK tìm credentials (Credential Provider Chain):
→ Viết code 1 lần, chạy được ở mọi nơi:
- Local: dùng Access Key
- EC2/ECS/Lambda: dùng Role (an toàn hơn)
5. IAM Policies
Policy là JSON document định nghĩa permissions.
Cấu trúc Policy
Giải thích các thành phần
| Element | Mô tả | Ví dụ |
|---|---|---|
| Version | Policy language version | "2012-10-17" (luôn dùng này) |
| Statement | Danh sách permissions | Array of objects |
| Sid | Statement ID (optional) | "AllowS3Read" |
| Effect | Allow hoặc Deny | "Allow" / "Deny" |
| Action | Các actions được phép/cấm | "s3:GetObject" |
| Resource | Resources áp dụng | ARN của resource |
| Condition | Điều kiện áp dụng (optional) | IP, time, MFA... |
Loại Policies
| Loại | Mô tả | Khi nào dùng |
|---|---|---|
| AWS Managed | AWS tạo sẵn, maintain | Bắt đầu nhanh, common use cases |
| Customer Managed | Bạn tự tạo | Cần custom permissions |
| Inline | Gắn trực tiếp vào user/role | 1-1 relationship, không reuse |
Ví dụ AWS Managed Policies
[!TIP] Xem chi tiết tất cả 6 loại IAM Policy Types (Identity-based, Resource-based, Permissions Boundaries, SCPs, ACLs, Session Policies) tại IAM JSON Policy Types
Policy Evaluation Logic
Khi có nhiều policies, AWS evaluate theo thứ tự:
Nguyên tắc quan trọng:
- Default: Deny - Không có permission = denied
- Explicit Deny wins - Deny luôn thắng Allow
- Allow phải explicit - Phải có Allow statement
Best Practices
1. Least Privilege Principle
2. Sử dụng Groups
3. Enable MFA
Multi-Factor Authentication (MFA)
MFA thêm một lớp bảo mật bằng cách yêu cầu 2 yếu tố để đăng nhập:
Các loại MFA Devices AWS hỗ trợ
| Loại | Mô tả | Ví dụ |
|---|---|---|
| Virtual MFA | App trên điện thoại | Google Authenticator, Authy, Microsoft Authenticator |
| U2F Security Key | Hardware key cắm USB | YubiKey, Feitian |
| Hardware MFA | Token device chuyên dụng | Gemalto (legacy), Thales |
| TOTP Hardware | Hardware tạo OTP | Token2, SafeNet |
1. Virtual MFA Device
Phổ biến nhất, sử dụng app trên smartphone.
Ưu điểm:
- ✅ Miễn phí
- ✅ Dễ setup
- ✅ Có thể backup (Authy)
Nhược điểm:
- ❌ Mất điện thoại = mất MFA
- ❌ Bị phishing (nhập code vào trang giả)
2. U2F Security Key (FIDO U2F)
Universal 2nd Factor (U2F) là chuẩn xác thực mở sử dụng hardware key.
Cách hoạt động:
Ưu điểm:
- ✅ Phishing-resistant - Không thể bị lừa nhập vào trang giả
- ✅ Không cần nhập code - Chỉ cần chạm key
- ✅ Dùng cho nhiều accounts - 1 key cho nhiều services
- ✅ Không cần pin/điện thoại - Có key là đủ
Nhược điểm:
- ❌ Tốn tiền (~$25-50)
- ❌ Mất key = không login được (nên có backup key)
Các U2F Keys phổ biến:
| Key | Giá khoảng | Đặc điểm |
|---|---|---|
| YubiKey 5 NFC | $45-55 | USB-A/C + NFC, nhiều protocols |
| YubiKey Security Key | $25 | Chỉ FIDO U2F/FIDO2, giá rẻ |
| Feitian ePass | $20-30 | USB-A, giá rẻ |
| Google Titan Key | $30-35 | USB-A + NFC, by Google |
3. Hardware MFA Device
Legacy hardware tokens, ít phổ biến hơn.
So sánh các loại MFA
| Tiêu chí | Virtual MFA | U2F Key | Hardware Token |
|---|---|---|---|
| Chi phí | Free | $25-50 | $15-30 |
| Phishing resistant | ❌ | ✅ | ❌ |
| Cần điện thoại | ✅ | ❌ | ❌ |
| Dễ backup | ✅ (Authy) | ❌ (cần mua 2 key) | ❌ |
| Dễ sử dụng | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Bảo mật | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
MFA cho Root User - QUAN TRỌNG!
Require MFA trong IAM Policies
Bạn có thể yêu cầu MFA để thực hiện các actions quan trọng:
Exam Tips - MFA
[!IMPORTANT] Keywords để nhớ MFA:
- Virtual MFA = App điện thoại (Google Authenticator, Authy)
- U2F Security Key = Hardware key (YubiKey) - Phishing resistant
- Root user PHẢI enable MFA
- U2F là lựa chọn bảo mật nhất
| Câu hỏi | Trả lời |
|---|---|
| MFA nào chống phishing tốt nhất? | U2F Security Key |
| MFA miễn phí? | Virtual MFA (app) |
| Root user nên dùng MFA nào? | U2F Security Key (AWS recommended) |
| U2F hoạt động thế nào? | Cắm USB + chạm key, không cần nhập code |
4. Rotate Credentials
5. Dùng Roles thay vì Access Keys
6. Review Permissions Regularly
IAM Security Tools
| Tool | Mô tả |
|---|---|
| IAM Credential Report | Account-level report về tất cả users và credentials |
| IAM Access Analyzer | Phát hiện resources shared với external entities |
| IAM Policy Simulator | Test policies trước khi apply |
| IAM Access Advisor | Xem services mà user đã access và last accessed time |