IAM là gì?
AWS Identity and Access Management (IAM) là dịch vụ quản lý danh tính và quyền truy cập của AWS. IAM cho phép bạn kiểm soát ai (authentication) được phép làm gì (authorization) trên tài nguyên nào trong tài khoản AWS của bạn. Đây là dịch vụ Global — không thuộc bất kỳ Region nào và hoàn toàn miễn phí.
Root Account vs IAM User
Khi tạo tài khoản AWS, bạn có một root account với email và password. Root account có quyền tuyệt đối — không bị giới hạn bởi bất kỳ policy nào. Đây là lý do bạn không bao giờ nên dùng root account cho công việc hàng ngày.
| Tiêu chí | Root Account | IAM User |
|---|---|---|
| Quyền hạn | Toàn quyền, không thể bị giới hạn | Chỉ có quyền được gán qua policies |
| Đăng nhập | Email + Password | Account ID + Username + Password |
| MFA | Bắt buộc nên bật | Nên bật cho tất cả users |
| Access Keys | Không nên tạo | Tạo cho programmatic access |
| Billing | Mặc định có quyền xem billing | Cần bật IAM access to billing |
| Khi nào dùng | Thay đổi account settings, đóng account, restore permissions | Mọi công việc hàng ngày |
Các thành phần chính của IAM
IAM Users & Groups
IAM User đại diện cho một người hoặc ứng dụng cần tương tác với AWS. Mỗi user có credentials riêng và có thể được gán vào một hoặc nhiều Groups để quản lý quyền dễ dàng hơn.
IAM Users
- Mỗi user đại diện cho một người hoặc một ứng dụng trong tổ chức
- Mỗi account tối đa 5,000 IAM users
- User có thể thuộc tối đa 10 groups
- Console access: Username + Password (đăng nhập AWS Management Console)
- Programmatic access: Access Key ID + Secret Access Key (CLI, SDK, API)
- Mỗi user tối đa 2 access keys (để hỗ trợ key rotation)
Tạo IAM User qua Console
- Vào IAM Console → Users → Create user
- Nhập username, chọn loại access (Console và/hoặc Programmatic)
- Nếu Console access: đặt password hoặc auto-generate, chọn yêu cầu đổi password lần đầu
- Gán permissions: thêm vào group, copy từ user khác, hoặc attach policy trực tiếp
- Thêm tags (optional) → Review → Create user
# Tạo user mới aws iam create-user --user-name nguyenvana # Tạo login profile (Console access) aws iam create-login-profile \ --user-name nguyenvana \ --password "MyStr0ng!Pass" \ --password-reset-required # Tạo access key (Programmatic access) aws iam create-access-key --user-name nguyenvana # Liệt kê tất cả users aws iam list-users # Thêm tags cho user aws iam tag-user \ --user-name nguyenvana \ --tags Key=Department,Value=Engineering Key=Team,Value=Backend
IAM Groups
- Group là tập hợp các IAM users — không thể chứa group khác (không nested)
- Mỗi account tối đa 300 groups (có thể request tăng)
- User không bắt buộc phải thuộc group nào (nhưng nên có)
- Policies gán cho group sẽ áp dụng cho tất cả members trong group
- Đây là cách best practice để quản lý permissions — gán policy cho group thay vì từng user
# Tạo group aws iam create-group --group-name Developers # Thêm user vào group aws iam add-user-to-group --user-name nguyenvana --group-name Developers # Gán policy cho group aws iam attach-group-policy \ --group-name Developers \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess # Liệt kê members trong group aws iam get-group --group-name Developers # Liệt kê policies của group aws iam list-attached-group-policies --group-name Developers
Mô hình tổ chức điển hình
IAM Policies
IAM Policy là tài liệu JSON định nghĩa permissions — cho phép hoặc từ chối các hành động trên tài nguyên AWS. Policies là trung tâm của hệ thống phân quyền IAM.
Cấu trúc JSON Policy
Mỗi policy gồm một hoặc nhiều Statement, mỗi statement định nghĩa một permission cụ thể:
{
"Version": "2012-10-17",
"Id": "S3-Account-Permissions",
"Statement": [
{
"Sid": "AllowS3ReadAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/nguyenvana"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}
| Thành phần | Bắt buộc | Mô tả |
|---|---|---|
| Version | Có | Luôn dùng "2012-10-17" — phiên bản mới nhất hỗ trợ policy variables |
| Id | Không | Định danh tùy chọn cho policy |
| Statement | Có | Mảng các permission statements |
| Sid | Không | Statement ID — định danh cho từng statement |
| Effect | Có | Allow hoặc Deny |
| Principal | Tùy | Ai được áp dụng (bắt buộc trong resource-based policy, không dùng trong identity-based) |
| Action | Có | Danh sách API actions (ví dụ: s3:GetObject, ec2:StartInstances) |
| Resource | Có | ARN của tài nguyên áp dụng (dùng * cho tất cả) |
| Condition | Không | Điều kiện bổ sung (IP, thời gian, MFA, tags, v.v.) |
Ba loại IAM Policies
arn:aws:iam::aws:policy/. Ví dụ: AdministratorAccess, AmazonS3ReadOnlyAccess. Tự động cập nhật khi AWS thêm service mới.Ví dụ Policies thực tế
Policy cho phép đọc S3 bucket cụ thể
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::production-data/*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::production-data"
}
]
}
Policy từ chối xóa với điều kiện MFA
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyDeleteWithoutMFA",
"Effect": "Deny",
"Action": [
"s3:DeleteObject",
"s3:DeleteBucket"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
}
]
}
Policy Evaluation Logic (Luồng đánh giá quyền)
AWS đánh giá policies theo thứ tự ưu tiên rõ ràng. Hiểu luồng này là chìa khóa để debug permission issues:
- Mặc định: Implicit Deny — nếu không có Allow nào, request bị từ chối
- Explicit Deny luôn thắng — dù có bao nhiêu Allow, một Deny sẽ override tất cả
- Policies được đánh giá đồng thời, không theo thứ tự
NotAction+Allow≠Deny— cẩn thận khi dùng NotAction