Deep dive · Chương ra thi nặng đầu tiên

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ễ.

{ "Section": "04 — Identity and Access Management", "Scope": "Global (không thuộc region nào)", "ExamWeight": "Cao — xuất hiện xuyên suốt mọi domain", "MustKnow": [ "Policy JSON: Effect · Principal · Action · Resource", "EC2 truy cập AWS → luôn dùng IAM Role", "Credentials Report vs Access Advisor", "4 loại thiết bị MFA" ] }
4.1

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.

Deny

Đừ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 đó.

Allow

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.)

4.2

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 / SaiGiải thích
Group chứa group khácSAIGroup chỉ chứa user. Không có group lồng group.
User thuộc nhiều groupĐÚNGBob vừa Developer vừa Operations là hợp lệ — quyền cộng dồn.
User không thuộc group nàoĐÚNGHợp lệ nhưng không khuyến khích — nên dùng group cho gọn.
Bẫy đề

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.

Ví dụ thực tế

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.

4.3

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"}
      }
    }
  ]
}
Thi hay hỏi

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ạiGắn vào đâuVí dụ
Identity-basedUser, Group, Role"Alice được đọc S3"
Resource-basedChính tài nguyênS3 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 ManagedAWS 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 Managedbạ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.
InlineDá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ó.

Ví dụ thực tế

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.

4.4

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ự:

  1. Mặc định là Deny (implicit deny) — không ai có quyền gì cả.
  2. Tìm thấy Allow tường minh ở bất kỳ policy nào → cho phép.
  3. 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.
Quy tắc vàng

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.

4.5

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.

Allow

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ạiThiết bị / HãngĐiểm nhận diện trong đề
Virtual MFA deviceGoogle Authenticator, AuthyChạ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 KeyYubiKey (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 MFAGemaltoCục nhỏ hiện dãy số 6 chữ số.
Key Fob cho AWS GovCloud (US)SurePassIDChỉ xuất hiện khi đề nhắc GovCloud.
Mẹo nhớ

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.

Ví dụ thực tế

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.

4.6

Console, CLI, SDK & CloudShell

Có đúng ba cách truy cập AWS, mỗi cách dùng credential khác nhau:

CáchDùng gì để xác thựcDành cho
Management ConsoleUsername + password (+ MFA)Con người, thao tác tay
CLIAccess keysCon người gõ lệnh / script trong terminal
SDKAccess keysCode 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
Deny

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ì bạn trong mắt AWS.

Lưu ý vận hành

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 CLIAWS SDK
Bản chấtCông cụ dòng lệnh, mã nguồn mởThư viện nhúng vào code
Chạy ở đâuTerminal / shell scriptBên trong ứng dụng của bạn
Xây trênPython 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.
Ví dụ thực tế

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ả.

4.7

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).

Allow

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.

Bẫy kinh điển

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ờitự độ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

RoleDùng khi
EC2 Instance RoleỨng dụng trên EC2 gọi S3, DynamoDB, SSM…
Lambda Execution RoleHàm Lambda ghi log CloudWatch, đọc DynamoDB…
CloudFormation Service RoleCloudFormation tạo tài nguyên thay mặt bạn
Cross-account RoleCho account khác truy cập tài nguyên của mình (sẽ đào sâu ở phần IAM nâng cao)
Ngoại lệ

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ỳ.

Ví dụ thực tế

Ứ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:PutObjectdynamodb: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.

4.8

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 ReportIAM Access Advisor
Phạm viAccount-level — toàn bộ tài khoảnUser-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àoUser đó đượ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ạngFile CSV tải vềTab trong màn hình chi tiết user
Mẹo nhớ

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.

Ví dụ thực tế

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.

4.9

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ệmBạn chịu trách nhiệm
Hạ tầng, bảo vệ trung tâm dữ liệuTạo & quản lý user, group, role, policy
Phân tích cấu hình, khuyến nghị bảo mậtBật MFA cho mọi tài khoản
Validation & compliance của dịch vụ IAMXoay vòng (rotate) access key thường xuyên
Vận hành hạ tầng xác thựcReview permission bằng Report / Access Advisor
4.10

IAM Best Practices

  1. Không dùng root account trừ lúc setup ban đầu.
  2. Một user vật lý = một IAM user. Không dùng chung tài khoản.
  3. Gán quyền qua group, không rải trực tiếp lên user.
  4. Đặt password policy mạnh.
  5. Bật MFA — root và mọi user quan trọng.
  6. Ứng dụng chạy trên AWS → IAM Role, tuyệt đối không access key.
  7. Cần dùng access key (ngoài AWS) → cấp quyền hẹp, xoay vòng định kỳ.
  8. Kiểm tra định kỳ bằng Credentials ReportAccess Advisor.
  9. Least privilege là mặc định trong mọi quyết định.
  10. Không chia sẻ IAM user hay access key với bất kỳ ai.
Cách đọc đề

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.

4.11

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
4.12

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.