IAM & AWS CLI
Toàn bộ nền móng bảo mật của AWS. Mọi dịch vụ bạn học sau này — EC2, S3, Lambda — đều phải đi qua IAM để được phép làm bất cứ điều gì. Học chắc chương này thì 20% câu hỏi ở các chương sau tự khắc dễ.
IAM là gì & tài khoản Root
IAM = Identity and Access Management. Đây là nơi bạn tạo ra ai được vào tài khoản AWS và họ được làm gì. Hai câu hỏi đó có tên riêng trong bảo mật:
- Authentication (xác thực) — anh là ai? (mật khẩu, access key, MFA)
- Authorization (phân quyền) — anh được phép làm gì? (policies)
IAM là global service: user, group, role, policy bạn tạo ra dùng chung cho mọi region. Không có chuyện "IAM user ở Singapore" — tạo một lần, dùng khắp nơi. Đây là điểm đề thi rất hay hỏi dưới dạng "dịch vụ nào là global?".
Tài khoản Root — thứ nguy hiểm nhất trong tài khoản
Root account là email bạn dùng để đăng ký AWS. Nó có toàn quyền tuyệt đối, không policy nào chặn được nó, và không thể bị giới hạn. Nếu lộ root là mất trắng tài khoản.
Đừng dùng root cho công việc hàng ngày. Đừng chia sẻ root cho ai. Đặc biệt: đừng tạo access key cho root — không có lý do chính đáng nào để làm việc đó.
Dùng root đúng một lần để: tạo IAM user admin cho chính mình, bật MFA cho root, đặt password policy. Sau đó cất root đi. (Vài tác vụ hiếm bắt buộc phải root: đóng tài khoản, đổi support plan, đổi tên tài khoản, khôi phục quyền khi lỡ khóa nhầm.)
Users, Groups
User = một người thật (Alice, Bob) hoặc một ứng dụng cần credential riêng. Group = một túi chứa user, dùng để cấp quyền theo vai trò (Developers, Operations, Audit).
Tại sao dùng group? Vì gắn policy vào 20 user riêng lẻ thì khi đổi quyền bạn phải sửa 20 chỗ. Gắn vào group thì sửa một chỗ.
Ba quy tắc bắt buộc thuộc lòng
| Quy tắc | Đúng / Sai | Giải thích |
|---|---|---|
| Group chứa group khác | SAI | Group chỉ chứa user. Không có group lồng group. |
| User thuộc nhiều group | ĐÚNG | Bob vừa Developer vừa Operations là hợp lệ — quyền cộng dồn. |
| User không thuộc group nào | ĐÚNG | Hợp lệ nhưng không khuyến khích — nên dùng group cho gọn. |
Câu hỏi kiểu "Một IAM group có thể chứa group khác không?" xuất hiện rất thường xuyên. Đáp án luôn là không.
Công ty 25 người chia ba group: Developers (đọc ghi bucket dev, không đụng production), Operations (quản EC2 và RDS), Finance (chỉ xem Billing). Bạn Minh vừa code vừa trực hệ thống nên thuộc cả Developers lẫn Operations — quyền tự cộng dồn. Khi Minh nghỉ việc, xóa một user là xong, không phải đi gỡ quyền ở năm chỗ khác nhau.
Policies & cấu trúc JSON
Policy là một tài liệu JSON mô tả quyền. Không có policy = không có quyền gì (nguyên tắc implicit deny: mặc định mọi thứ bị từ chối cho đến khi được cho phép tường minh).
Nguyên tắc least privilege
Chỉ cấp đúng quyền tối thiểu để làm việc, không hơn. Đề thi luôn chọn phương án hẹp nhất mà vẫn đủ dùng. Nếu có hai đáp án đều "chạy được", chọn cái ít quyền hơn.
Cấu trúc một policy
{
"Version": "2012-10-17", ← luôn là ngày này, không phải ngày hôm nay
"Id": "S3-Account-Permissions", ← tùy chọn, chỉ để đặt tên
"Statement": [
{
"Sid": "1", ← tùy chọn, id của statement
"Effect": "Allow", ← Allow hoặc Deny
"Principal": { ← AI được áp dụng
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": [ ← LÀM GÌ (dạng service:Operation)
"s3:GetObject",
"s3:PutObject"
],
"Resource": ["arn:aws:s3:::mybucket/*"], ← TRÊN TÀI NGUYÊN NÀO
"Condition": { ← tùy chọn: KHI NÀO
"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}
}
}
]
}
Bốn thành phần cốt lõi cần nhớ đúng tên tiếng Anh: Effect · Principal · Action · Resource. Sid, Id, Condition là tùy chọn. Version luôn là 2012-10-17.
Phân loại policy
| Loại | Gắn vào đâu | Ví dụ |
|---|---|---|
| Identity-based | User, Group, Role | "Alice được đọc S3" |
| Resource-based | Chính tài nguyên | S3 Bucket Policy: "bucket này cho account X đọc" |
Điểm khác biệt để nhận diện: resource-based policy bắt buộc có Principal (vì phải nói rõ ai được truy cập), còn identity-based thì không cần — bản thân việc gắn vào user đã là principal rồi.
| Cách quản lý | Đặc điểm |
|---|---|
| AWS Managed | AWS viết sẵn và tự cập nhật (vd AdministratorAccess, ReadOnlyAccess). Tiện, nhưng thường rộng hơn mức cần. |
| Customer Managed | bạn tự viết, tái sử dụng cho nhiều identity. Đây là lựa chọn được khuyến nghị khi cần quyền riêng. |
| Inline | Dán trực tiếp vào một user/role, không tái sử dụng được. Xóa identity là mất policy. Dùng khi quan hệ 1-1 nghiêm ngặt. |
Ngoài ra còn Inline policy trên group và khái niệm kế thừa: user nhận toàn bộ quyền từ mọi group nó thuộc, cộng với policy gắn trực tiếp lên nó.
Resource-based policy trong thực tế: đối tác cần tải báo cáo hàng tháng từ bucket của bạn. Thay vì tạo IAM user cho người ngoài công ty, bạn viết một bucket policy cho phép account ID của đối tác gọi s3:GetObject trên đúng prefix /reports/*. Đối tác dùng tài khoản AWS của họ, bạn không phải quản thêm credential nào.
Cách AWS đánh giá quyền
Chương 4 của Maarek chỉ nói lướt phần này, nhưng đề thi dùng nó liên tục nên bạn nắm sớm sẽ lợi. Khi một request đến, AWS xử theo thứ tự:
- Mặc định là Deny (implicit deny) — không ai có quyền gì cả.
- Tìm thấy Allow tường minh ở bất kỳ policy nào → cho phép.
- Tìm thấy Deny tường minh ở bất kỳ policy nào → từ chối, và không gì lật ngược được.
Explicit Deny luôn thắng Explicit Allow. Một user có AdministratorAccess nhưng bị một policy khác Deny s3:DeleteBucket thì vẫn không xóa được bucket.
Quyền của một user = hợp (union) của: policy gắn trực tiếp + policy của mọi group nó thuộc. Không có chuyện "group này ưu tiên hơn group kia" — tất cả cộng dồn, rồi mới áp quy tắc Deny thắng.
Công cụ để thử trước khi áp dụng: IAM Policy Simulator — nhập user + action + resource, nó trả lời cho phép hay không, và policy nào quyết định.
Password Policy & MFA
Password Policy
Mật khẩu mạnh là lớp phòng thủ đầu tiên. Trong IAM, bạn cấu hình được:
- Độ dài tối thiểu
- Bắt buộc loại ký tự: chữ hoa, chữ thường, số, ký tự đặc biệt
- Cho phép/không cho phép user tự đổi mật khẩu
- Bắt đổi mật khẩu sau N ngày (password expiration)
- Cấm dùng lại mật khẩu cũ (prevent password reuse)
MFA — Multi Factor Authentication
Nguyên lý: password (thứ bạn biết) + security device (thứ bạn sở hữu). Kẻ tấn công có mật khẩu vẫn không vào được vì không cầm thiết bị trong tay.
Bật MFA cho root account và cho mọi IAM user có quyền admin. Đây là khuyến nghị số một của AWS.
Bốn loại thiết bị MFA — bảng vàng của chương này
| Loại | Thiết bị / Hãng | Điểm nhận diện trong đề |
|---|---|---|
| Virtual MFA device | Google Authenticator, Authy | Chạy trên điện thoại. Authy hỗ trợ nhiều token trên cùng một thiết bị → dùng khi có nhiều tài khoản. |
| U2F Security Key | YubiKey (Yubico) | Cắm USB. Một khóa hỗ trợ nhiều root và IAM user — từ khóa "một thiết bị vật lý cho nhiều user". |
| Hardware Key Fob MFA | Gemalto | Cục nhỏ hiện dãy số 6 chữ số. |
| Key Fob cho AWS GovCloud (US) | SurePassID | Chỉ xuất hiện khi đề nhắc GovCloud. |
Cả 4 loại đều do bên thứ ba sản xuất, AWS không tự làm thiết bị MFA nào. Nhớ cặp tên: YubiKey → U2F, Gemalto → key fob thường, SurePassID → GovCloud.
Một nhân viên bị lừa nhập mật khẩu vào trang đăng nhập giả mạo. Vài giờ sau có lượt đăng nhập từ IP nước ngoài nhưng dừng lại ở bước MFA. Nếu không bật MFA, kẻ tấn công đã có toàn quyền của user đó — kịch bản phổ biến nhất sau đó là bật hàng loạt EC2 để đào tiền ảo, và hóa đơn nhảy lên hàng chục nghìn đô trong vài ngày trước khi ai đó kịp phát hiện.
Console, CLI, SDK & CloudShell
Có đúng ba cách truy cập AWS, mỗi cách dùng credential khác nhau:
| Cách | Dùng gì để xác thực | Dành cho |
|---|---|---|
| Management Console | Username + password (+ MFA) | Con người, thao tác tay |
| CLI | Access keys | Con người gõ lệnh / script trong terminal |
| SDK | Access keys | Code gọi AWS từ bên trong ứng dụng |
Access Keys
Access key gồm hai phần:
- Access Key ID ~ vai trò như username (dạng
AKIA...) - Secret Access Key ~ vai trò như password
Không chia sẻ access key. Không commit vào Git. Không nhúng vào code hay AMI. Access key = danh tính của bạn; ai cầm nó thì là bạn trong mắt AWS.
Secret Access Key chỉ hiện đúng một lần lúc tạo. Mất là mất luôn — không có cách xem lại. Giải pháp duy nhất: tạo cặp key mới rồi vô hiệu hóa/xóa key cũ.
CLI vs SDK — phân biệt cho chắc
| AWS CLI | AWS SDK | |
|---|---|---|
| Bản chất | Công cụ dòng lệnh, mã nguồn mở | Thư viện nhúng vào code |
| Chạy ở đâu | Terminal / shell script | Bên trong ứng dụng của bạn |
| Xây trên | Python SDK (boto3) | Từng ngôn ngữ riêng |
| Ngôn ngữ hỗ trợ | — | JavaScript, Python (boto3), Java, .NET, Go, PHP, Ruby, C++… + Mobile SDK (Android/iOS) + IoT Device SDK |
Cả hai đều gọi cùng một bộ API công khai của AWS. Console cũng vậy — nó chỉ là giao diện web bọc quanh API đó.
Vài lệnh CLI nên quen tay
aws configure # nhập Access Key, Secret, region, output format
aws configure --profile work # cấu hình nhiều profile song song
aws iam list-users # kiểm tra kết nối
aws sts get-caller-identity # "tôi đang là ai?" — cực hữu ích khi debug quyền
aws s3 ls --region ap-southeast-1
AWS CloudShell
Terminal chạy ngay trong trình duyệt, ngay trong Console. Điểm hay: nó tự dùng quyền của user đang đăng nhập — không cần cấu hình access key, không cần aws configure.
- File bạn tạo trong CloudShell được lưu lại giữa các phiên (thư mục home có dung lượng riêng).
- Upload/download file được qua menu Actions.
- ⚠️ Không có ở tất cả region — điểm này đề hay hỏi.
Access key đúng chỗ: script backup chạy 2h sáng trên máy chủ đặt tại văn phòng, dùng access key của một IAM user chuyên dụng chỉ có quyền ghi vào đúng một bucket.
CloudShell đúng chỗ: đang ở nhà, cần kiểm tra nhanh xem instance nào còn chạy. Mở console, bấm CloudShell, gõ aws ec2 describe-instances — không cần cài AWS CLI lên máy lạ, không cần copy access key đi đâu cả.
IAM Roles — phần ra thi nặng nhất chương
Vấn đề: một EC2 instance cần đọc file từ S3. Nó không phải người, không có username/password. Vậy cấp quyền cho nó kiểu gì?
Câu trả lời: IAM Role. Role giống hệt user (cũng có policy gắn vào), nhưng thay vì dành cho người, nó dành cho dịch vụ AWS đảm nhận (assume).
Tạo IAM Role có quyền s3:GetObject → gắn role vào EC2 instance → ứng dụng trên EC2 tự động lấy được credential tạm thời và gọi S3.
Không bao giờ nhét access key vào EC2 (file cấu hình, biến môi trường, user data, hay AMI). Đề thi luôn cài phương án này làm mồi. Thấy "EC2 / Lambda cần truy cập dịch vụ AWS" → đáp án là IAM Role.
Vì sao Role an toàn hơn Access Key
- Credential do role cấp là tạm thời và tự động xoay vòng — không có secret cố định nằm trên đĩa để bị lộ.
- Muốn thu hồi quyền: sửa policy của role, có hiệu lực ngay, không phải đi tìm và xóa key ở từng máy.
- Cùng một role dùng cho hàng trăm instance trong Auto Scaling Group.
Các role thường gặp
| Role | Dùng khi |
|---|---|
| EC2 Instance Role | Ứng dụng trên EC2 gọi S3, DynamoDB, SSM… |
| Lambda Execution Role | Hàm Lambda ghi log CloudWatch, đọc DynamoDB… |
| CloudFormation Service Role | CloudFormation tạo tài nguyên thay mặt bạn |
| Cross-account Role | Cho account khác truy cập tài nguyên của mình (sẽ đào sâu ở phần IAM nâng cao) |
Trường hợp duy nhất vẫn cần access key: máy chủ/laptop ngoài AWS (on-premise) cần gọi AWS. Khi đó tạo IAM user riêng cho ứng dụng đó, cấp quyền hẹp, và xoay key định kỳ.
Ứng dụng upload ảnh: EC2 nhận ảnh từ người dùng, đẩy lên S3 rồi ghi metadata vào DynamoDB. Bạn tạo một role có hai quyền s3:PutObject và dynamodb:PutItem, gắn vào launch template. Giờ cao điểm Auto Scaling sinh thêm 10 máy — cả 10 tự có quyền ngay, không ai phải copy key. Khi phát hiện quyền thừa, sửa policy một chỗ là toàn bộ 10 máy nhận ngay lập tức.
IAM Security Tools
Đúng hai công cụ, và đề thi thích ra câu bắt phân biệt chúng.
| IAM Credentials Report | IAM Access Advisor | |
|---|---|---|
| Phạm vi | Account-level — toàn bộ tài khoản | User-level — từng user một |
| Cho biết gì | Danh sách mọi user và trạng thái credential: có MFA chưa, password đổi lần cuối khi nào, access key tạo/xoay/dùng lần cuối khi nào | User đó được cấp quyền cho những service nào, và lần cuối truy cập mỗi service là khi nào |
| Dùng để | Kiểm toán, tìm user chưa bật MFA / key quá cũ | Cắt quyền thừa, siết về least privilege |
| Định dạng | File CSV tải về | Tab trong màn hình chi tiết user |
Report = báo cáo toàn tài khoản (rộng, về credential). Advisor = cố vấn cho một user (hẹp, về quyền đã dùng). Từ khóa "which permissions are unused" → Access Advisor. Từ khóa "which users don't have MFA" → Credentials Report.
Rà soát định kỳ mỗi quý: tải Credentials Report, lọc ra 3 user chưa bật MFA và 2 access key đã hơn 400 ngày chưa xoay. Sau đó mở Access Advisor cho user CI/CD, thấy nó được cấp quyền trên 12 service nhưng suốt 6 tháng chỉ thực sự gọi S3 và ECR — cắt 10 service còn lại. Hai công cụ, hai mục đích, dùng nối tiếp nhau trong cùng một buổi audit.
Shared Responsibility Model cho IAM
AWS lo bảo mật CỦA cloud, bạn lo bảo mật TRONG cloud. Áp vào IAM cụ thể:
| AWS chịu trách nhiệm | Bạn chịu trách nhiệm |
|---|---|
| Hạ tầng, bảo vệ trung tâm dữ liệu | Tạo & quản lý user, group, role, policy |
| Phân tích cấu hình, khuyến nghị bảo mật | Bật MFA cho mọi tài khoản |
| Validation & compliance của dịch vụ IAM | Xoay vòng (rotate) access key thường xuyên |
| Vận hành hạ tầng xác thực | Review permission bằng Report / Access Advisor |
IAM Best Practices
- Không dùng root account trừ lúc setup ban đầu.
- Một user vật lý = một IAM user. Không dùng chung tài khoản.
- Gán quyền qua group, không rải trực tiếp lên user.
- Đặt password policy mạnh.
- Bật MFA — root và mọi user quan trọng.
- Ứng dụng chạy trên AWS → IAM Role, tuyệt đối không access key.
- Cần dùng access key (ngoài AWS) → cấp quyền hẹp, xoay vòng định kỳ.
- Kiểm tra định kỳ bằng Credentials Report và Access Advisor.
- Least privilege là mặc định trong mọi quyết định.
- Không chia sẻ IAM user hay access key với bất kỳ ai.
Khi bốn đáp án đều "hoạt động được", chọn cái nào ít quyền nhất, dùng role thay key, và không đụng đến root. Ba tiêu chí đó giải được phần lớn câu IAM.
Map từ khóa đề thi
| Đề nhắc đến… | Nghĩ ngay tới |
|---|---|
| "application on EC2 needs to access S3" | IAM Role gắn vào EC2 |
| "credentials stored in the application" | Sai — chuyển sang IAM Role |
| "which users have not enabled MFA" | Credentials Report |
| "permissions granted but never used" | Access Advisor |
| "test whether a policy allows an action" | IAM Policy Simulator |
| "multiple tokens on one device" | Virtual MFA (Authy) |
| "one physical key for many users" | U2F Security Key (YubiKey) |
| "GovCloud" | SurePassID key fob |
| "global service" | IAM, Route 53, CloudFront, WAF |
| "terminal in the browser, no setup" | AWS CloudShell (không có ở mọi region) |
| "on-premise server calls AWS API" | IAM user + access keys (ngoại lệ hợp lệ) |
| "user has Admin but still can't do X" | Có explicit Deny ở đâu đó — Deny thắng |
Cheat sheet 60 giây
- IAM là global, miễn phí, nền tảng của mọi dịch vụ khác.
- Root: chỉ setup, bật MFA, rồi cất đi. Không tạo access key cho root.
- Group chứa user, không chứa group. User thuộc 0–n group.
- Policy JSON: Effect, Principal, Action, Resource (+ Sid, Condition tùy chọn), Version
2012-10-17. - Mặc định Deny → Allow tường minh mới có quyền → Deny tường minh thắng tất cả.
- Resource-based policy bắt buộc có
Principal. - MFA: Virtual (Authy) · U2F (YubiKey) · Key fob (Gemalto) · GovCloud (SurePassID).
- Access key: Secret chỉ hiện một lần; mất thì tạo cặp mới.
- CLI xây trên boto3 (Python SDK); CloudShell không có ở mọi region.
- Dịch vụ AWS cần quyền → Role. Ngoài AWS → access key.
- Credentials Report = account, credential. Access Advisor = user, quyền đã dùng.
Ba câu tự kiểm tra nhanh trước khi qua file quiz
1. Một user có policy Allow s3:* từ group A, và policy Deny s3:DeleteObject từ group B. User xóa được object không?
2. Ứng dụng chạy trên laptop ở văn phòng cần upload lên S3. Dùng gì?
3. Muốn biết access key của user nào đã 400 ngày chưa xoay. Dùng công cụ nào?
Đáp án: (1) Không — explicit Deny thắng. (2) IAM user + access keys, vì máy nằm ngoài AWS nên không gắn role trực tiếp được. (3) Credentials Report — nó có cột ngày tạo/xoay/dùng lần cuối của access key cho mọi user.