Aws Iam
IAM (Identity and Access Management) là một dịch vụ cốt lõi của AWS giúp quản lý truy cập và phân quyền người dùng một cách an toàn và linh hoạt.
1. IAM là gì?
IAM cho phép :
Quản lý ai có thể truy cập tài nguyên AWS.
Kiểm soát họ có thể làm gì với các tài nguyên đó (EC2, S3, RDS...).
Áp dụng nguyên tắc Least Privilege (cấp quyền tối thiểu cần thiết).
IAM miễn phí, chỉ trả tiền cho các tài nguyên mà người dùng sử dụng.
2. Thành phần chính trong IAM
2.1. IAM User (Người dùng)
2.1.1. IAM User là gì?
Là một danh tính đại diện cho con người hoặc ứng dụng cần truy cập AWS.
🔹 Ví dụ:
Dev A muốn truy cập S3 và EC2 → Tạo IAM User cho Dev A.
App Java cần lấy file từ S3 → Tạo IAM User cho app đó.
🔹 Có thể gắn Username, Password, Access key/Secret key để đăng nhập AWS CLI/SDK/Console.
Các đặc điểm chính:
| Đặc điểm | Mô tả |
| Định danh duy nhất | Mỗi IAM User có tên định danh duy nhất trong tài khoản AWS |
| Chính sách phân quyền (Policy) | Có thể gắn IAM Policy hoặc gắn vào IAM Group để kiểm soát quyền truy cập. Một IAM User có thể được gắn vào nhiều IAM Group. |
| Thông tin xác thực | Có thể có password (đăng nhập AWS Console) hoặc access key (truy cập AWS CLI/API) |
| Không phải user root | IAM User khác với tài khoản root, và nên sử dụng thay cho root để bảo mật |
2.1.2. Hướng dẫn tạo IAM User bằng Console
Bước 1: Truy cập IAM
Đăng nhập vào AWS Management Console bằng tài khoản root hoặc IAM user có quyền admin
Truy cập dịch vụ IAM (Tìm trong ô search hoặc link trực tiếp:
https://console.aws.amazon.com/iam/)
Bước 2: Tạo IAM User
Trong menu bên trái, chọn Users
Nhấn nút "Add users"
Bước 3: Nhập thông tin người dùng
User name: Nhập tên người dùng (vd:
boss-dev)Access type:
✔️ AWS Management Console access: nếu muốn người dùng đăng nhập Console
✔️ Programmatic access: nếu muốn dùng CLI, SDK, hoặc API
Có thể chọn cả hai nếu cần.
Bước 4: Gán quyền
Có 3 cách gán quyền:
Attach policies directly: gắn trực tiếp policy (vd:
AdministratorAccess,AmazonS3ReadOnlyAccess)Add user to group: gắn user vào group có sẵn quyền
Copy permissions from existing user
Với mục đích học tập, có thể chọn:
Attach policies directly→ tíchAdministratorAccessđể có toàn quyền (chỉ nên dùng với môi trường học tập).
Bước 5: Tags (tuỳ chọn)
- Có thể thêm các tag như
Department: Dev,Project: Learning-AWSđể dễ quản lý sau này.
Bước 6: Review và tạo
- Kiểm tra lại thông tin → nhấn Create user
Bước 7: Lưu thông tin truy cập
Tải file
.csvchứa:Access Key ID
Secret Access Key
Console login link (nếu tạo user có quyền đăng nhập Console)
⚠️ nhớ lưu file .csv ngay, sau đó không thể xem lại secret key!
Lưu ý bảo mật
Không dùng user root cho các hoạt động thường ngày.
Dùng MFA (Multi-Factor Authentication) cho tất cả IAM user.
Gắn quyền tối thiểu cần thiết (Principle of Least Privilege)
2.1.3. Tạo IAM User bằng AWS CLI
Điều kiện:
Cần cài sẵn AWS CLI và đã cấu hình bằng lệnh aws configure
Câu lệnh tạo user:
aws iam create-user --user-name boss-dev
Tạo access key cho user:
aws iam create-access-key --user-name boss-dev
Gán policy AdministratorAccess:
aws iam attach-user-policy \
--user-name boss-dev \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess
Output mẫu khi tạo access key:
{
"AccessKey": {
"UserName": "boss-dev",
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"Status": "Active",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"CreateDate": "2025-04-04T06:58:34+00:00"
}
}
⚠️ Lưu lại
AccessKeyIdvàSecretAccessKeyvì sẽ không thể xem lại sau!
2.2. IAM Role (Vai trò)
2.2.1. IAM Role là gì?
Role cũng giống như user, nhưng không gắn cố định với một người dùng cụ thể. IAM Role phải được giả lập (assume) trước khi sử dụng.
Dùng trong các tình huống:
Các dịch vụ AWS (EC2, Lambda, S3, ECS, API Gateway, v.v.) có quyền truy cập tài nguyên khác mà không cần lưu trữ access key (gán role cho EC2, Lambda).
Tài khoản A muốn cho tài khoản B truy cập tài nguyên thông qua cross-account access.
🔹 Role không có password hay access key, chỉ được assume (đảm nhận) bởi user hoặc dịch vụ AWS (thường được tạo và dùng tạm thời).
2.2.2. Tạo IAM Role qua AWS Console
🔹 Bước 1: Vào IAM > Chọn Roles > Nhấn Create Role
🔹 Bước 2: Chọn loại Trusted Entity
Chọn AWS Service nếu role dùng cho EC2, Lambda, v.v.
Chọn Another AWS Account nếu cấp quyền cho tài khoản AWS khác.
🔹 Bước 3: Chọn service sẽ giả lập role (vd: EC2)
- Nếu tạo IAM Role cho EC2, chọn EC2.
🔹 Bước 4: Gán policy cho role
Nếu muốn EC2 đọc S3, chọn AmazonS3ReadOnlyAccess
Nếu muốn EC2 có quyền admin, chọn AdministratorAccess (không khuyến khích trên môi trường thực tế).
🔹 Bước 5: Đặt tên Role và tạo
- Ví dụ đặt tên
EC2-S3-Access-Role
Sau khi tạo xong, Role ARN sẽ hiển thị, có thể dùng ARN này để gán cho EC2 hoặc Lambda.
2.2.3. Tạo IAM Role bằng AWS CLI
Bước 1: Tạo Role
aws iam create-role \
--role-name EC2-S3-Access-Role \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}'
Bước 2: Gán policy AmazonS3ReadOnlyAccess cho Role
aws iam attach-role-policy \
--role-name EC2-S3-Access-Role \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
Bước 3: Lấy ARN của IAM Role
aws iam get-role --role-name EC2-S3-Access-Role
Output mẫu:
{
"Role": {
"RoleName": "EC2-S3-Access-Role",
"Arn": "arn:aws:iam::123456789012:role/EC2-S3-Access-Role"
}
}
2.2.4. Các tình huống sử dụng IAM Role
| Tình huống | Role phù hợp |
| EC2 cần truy cập S3 mà không dùng access key | Gán IAM Role vào EC2 |
| Lambda cần ghi vào DynamoDB | Tạo IAM Role cho Lambda và gán quyền AmazonDynamoDBFullAccess |
| Một tài khoản AWS khác cần truy cập S3 của Boss | Tạo Role cho Another AWS Account và gán ARN |
| ECS Task cần truy cập API của Boss | Gán IAM Role vào ECS Task |
| Ứng dụng dùng AWS STS để lấy quyền tạm thời | Dùng IAM Role với STS |
2.3. IAM Policy (Chính sách)
2.3.1. IAM Policy là gì?
IAM Policy là một tập hợp các quy tắc (permissions) được viết bằng JSON, quy định ai được/không được truy cập tài nguyên nào, và được phép làm gì trên AWS.
Hiểu đơn giản:
Ai (IAM user, IAM role, IAM group)
Được phép làm gì (action như
s3:PutObject,ec2:StartInstances)Trên tài nguyên nào (resource như
arn:aws:s3:::my-bucket/*)
2.3.2. Cấu trúc cơ bản của một IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
| Thành phần | Ý nghĩa |
Version | Phiên bản ngôn ngữ policy (luôn dùng "2012-10-17") |
Effect | Allow hoặc Deny |
Action | Hành động được phép (hoặc bị cấm) |
Resource | Tài nguyên áp dụng policy |
2.3.3. Các loại IAM Policy
| Loại | Mô tả |
| Managed Policy | Policy do AWS quản lý (vd: AmazonS3ReadOnlyAccess) hoặc do chúng ta tạo |
| Inline Policy | Policy gắn trực tiếp vào một user/role/group cụ thể |
| AWS Managed Policy | Do AWS tạo sẵn, chỉ việc gán |
| Customer Managed Policy | Do chúng ta tự tạo và quản lý |
2.3.4. Ví dụ về các IAM Policy
a. Đọc mọi bucket trong S3
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::*/*"
}
]
}
b. Toàn quyền với EC2
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
}
]
}
c. Ghi log vào CloudWatch
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
2.3.5. Hướng dẫn tạo IAM Policy bằng Console
🔹 Bước 1: Truy cập IAM → Policies → Create Policy
🔹 Bước 2: Chọn JSON → Dán nội dung policy → Next
🔹 Bước 3: Đặt tên (ví dụ: MyS3ReadOnlyPolicy)
🔹 Bước 4: Tạo và gán cho user/role/group
2.3.6. Tạo Policy bằng AWS CLI
aws iam create-policy \
--policy-name MyS3ReadOnlyPolicy \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}'
2.3.7. Tips khi làm việc với IAM Policy
Luôn theo nguyên tắc "Least Privilege" – chỉ cấp quyền cần thiết.
Không nên dùng
"Resource": "*"và"Action": "*"nếu không thật sự cần.Dùng IAM Policy Simulator để kiểm tra policy trước khi áp dụng.
Có thể dùng Condition để giới hạn theo IP, thời gian, MFA, tags...
2.3.8. Một số IAM Policy hữu ích (do AWS tạo sẵn)
| Tên | Mô tả |
AdministratorAccess | Toàn quyền |
AmazonS3ReadOnlyAccess | Chỉ đọc S3 |
AmazonEC2FullAccess | Toàn quyền EC2 |
CloudWatchLogsFullAccess | Toàn quyền log |
AWSLambdaBasicExecutionRole | Ghi log vào CloudWatch từ Lambda |
2.4. Resource-based Policy
2.4.1. Resource-based Policy là gì?
Resource-based Policy là một dạng policy được gắn trực tiếp vào tài nguyên AWS, cho phép kiểm soát ai (Principal) có thể thực hiện hành động gì (Action) trên tài nguyên đó.
Khác với IAM Policy:
IAM Policy được gắn vào người dùng (user), vai trò (role)
Resource-based Policy được gắn vào tài nguyên
2.4.2. Các dịch vụ AWS hỗ trợ Resource-based Policy
| Dịch vụ | Ghi chú |
| ✅ Amazon S3 | Gắn policy vào bucket |
| ✅ Amazon SQS | Gắn policy vào queue |
| ✅ Amazon SNS | Gắn policy vào topic |
| ✅ AWS Lambda | Gắn policy vào function |
| ✅ API Gateway | Gắn policy vào API |
| ❌ EC2, RDS, DynamoDB | Không hỗ trợ resource-based policy |
2.4.3. Thành phần của một Resource-based Policy
jsonSao chépChỉnh sửa{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789012:root" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
| Trường | Ý nghĩa |
Effect | Allow hoặc Deny |
Principal | Ai được phép truy cập tài nguyên |
Action | Hành động được phép thực hiện |
Resource | Tài nguyên được áp dụng |
Principal là ai được cấp quyền, có thể là:
Một tài khoản AWS khác
Một IAM role cụ thể
Một AWS service (ví dụ: Lambda, CloudWatch…)
2.4.4. IAM Policy vs Resource-based Policy – Sự khác biệt chính
| Tiêu chí | IAM Policy | Resource-based Policy |
| Gán vào đâu? | Gán vào IAM user, role, group | Gắn trực tiếp lên tài nguyên AWS (vd: S3 bucket, Lambda function, SQS queue) |
| Xác định ai? | Xác định người dùng nào được phép truy cập tài nguyên | Xác định ai (có thể là tài khoản khác) được phép truy cập tài nguyên |
| Hỗ trợ cross-account? | ❌ Không trực tiếp | ✅ Có thể cấp quyền cho tài khoản AWS khác |
| Tài nguyên hỗ trợ | Tất cả các dịch vụ AWS | Chỉ một số tài nguyên: S3, SNS, SQS, Lambda, API Gateway... |
| Hướng kiểm soát | “Người dùng này được làm gì?” | “Ai được làm gì với tài nguyên này?” |
👉 IAM Policy là cấp quyền từ phía người dùng (user/role)
→ “Tôi (người dùng) được quyền truy cập tài nguyên nào?”👉 Resource-based Policy là cấp quyền từ phía tài nguyên
→ “Tài nguyên này cho phép ai truy cập nó?”
2.4.5. Ví dụ tình huống sử dụng
🎯 Tình huống 1 – Dùng IAM Policy (nội bộ)
Mục tiêu: Boss muốn cấp quyền cho 1 user (dev-user) trong tài khoản AWS của Boss để truy cập S3 bucket my-private-data.
✅ Cách làm:
- Tạo IAM Policy gán vào
dev-user:
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-private-data/*"
}
👉 Không cần chỉnh gì trên bucket S3. IAM policy đã đủ.
🎯 Tình huống 2 – Dùng Resource-based Policy (cross-account)
Mục tiêu: Một tài khoản AWS khác (tài khoản A) muốn đọc file trong bucket boss-data của Boss (tài khoản B).
✅ Cách làm:
- Trên S3 bucket của Boss, thêm resource-based policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789012:root" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::boss-data/*"
}
]
}
🔑 Giải thích:
123456789012là ID của tài khoản A được cấp quyền.Principallà người sẽ truy cập tài nguyên.
👉 Tài khoản A sẽ không cần Boss tạo role hoặc user bên A, chỉ cần bên Boss gắn policy lên bucket.
2.4.6. Kết hợp IAM + Resource-based Policy
AWS kiểm tra cả 2 policy khi xử lý một request:
QUYỀN = IAM Policy CHO PHÉP ❗ VÀ Resource-based Policy CHO PHÉP
Nếu một trong hai từ chối (Deny) → request bị từ chối.
2.4.7. Một số use case thực tế
| Tình huống | Sử dụng Resource-based Policy |
| Cho phép Lambda invoke từ tài khoản khác | ✅ Lambda Resource Policy |
| Cho phép đọc file S3 từ nhiều tài khoản | ✅ Bucket Policy |
| Cấp quyền publish SNS topic từ cross-account | ✅ SNS Policy |
| Cho phép API Gateway gọi Lambda | ✅ Lambda + Resource Policy |