Mục tiêu bạn sẽ đạt được
- Thiết kế mô hình quyền theo nhóm (group-based access) cho team phát triển.
- Viết và gắn custom policy theo nguyên tắc Least Privilege.
- Tạo IAM User cho nhu cầu console/programmatic access an toàn (với MFA).
- Tạo IAM Role cho EC2 và gắn Instance Profile để truy cập S3 không cần access key.
Yêu cầu chuẩn bị (Prerequisites)
- Tài khoản AWS có quyền tạo IAM resources (tối thiểu các quyền: iam:CreateUser, iam:CreateGroup, iam:AttachGroupPolicy, iam:CreatePolicy, iam:CreateRole, iam:PassRole, iam:CreateInstanceProfile, iam:AddRoleToInstanceProfile).
- Chọn Region làm việc thống nhất trong team (ví dụ: ap-southeast-1 hoặc ap-southeast-2).
- Áp dụng nguyên tắc Least Privilege và tiêu chuẩn đặt tên thống nhất (ví dụ: WebApp-Developers, WebApp-DevOps, WebApp-ReadOnly).
Thiết lập cấu hình IAM đầu tiên
Cùng đi qua một setup IAM tiêu biểu cho team phát triển:
Bước 1: Tạo Groups
- Developers Group: Cho lập trình viên ứng dụng
- DevOps Group: Cho quản trị hạ tầng
- ReadOnly Group: Cho analysts và stakeholders cần quyền đọc
Gợi ý tốt nhất:
- Đặt tên group rõ ràng theo project + chức năng, ví dụ: WebApp-Developers, WebApp-DevOps, WebApp-ReadOnly.
- Sử dụng Tag (Owner, Project, Environment) để dễ audit/chi phí.
- Với ReadOnly, có thể gắn AWS Managed Policy: ReadOnlyAccess để bắt đầu nhanh (sau đó tinh chỉnh).
Bước 2: Tạo Custom Policies
Ví dụ policy cho developers làm việc với S3 và Lambda:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::dev-*",
"arn:aws:s3:::dev-*/*"
]
},
{
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:UpdateFunctionCode",
"lambda:InvokeFunction",
"lambda:GetFunction",
"lambda:ListFunctions"
],
"Resource": "arn:aws:lambda:*:*:function:dev-*"
}
]
}
Lưu ý khi viết policy:
- Scope tài nguyên theo tiền tố dự án/môi trường (ví dụ dev-, staging-, prod-*).
- Thêm Condition khi có thể (IpAddress, aws:PrincipalTag, s3:prefix, aws:RequestedRegion…) để giảm rủi ro.
- Tách policy theo domain (S3Policy, LambdaPolicy) để dễ quản trị và tái sử dụng.
Bước 3: Tạo và cấu hình Users
- Tạo user có programmatic access
- Gán user vào group phù hợp
- Thiết lập MFA cho truy cập console
- Sinh và phân phối access key một cách an toàn
Khuyến nghị thêm:
- Yêu cầu đổi mật khẩu ở lần đăng nhập đầu tiên, áp dụng Password Policy đủ mạnh.
- Ưu tiên dùng Access Key cho automation; hạn chế Console access nếu không cần.
- Lưu trữ credentials an toàn (AWS Secrets Manager, 1Password, Bitwarden). Tránh commit vào VCS.
Làm việc với IAM Roles
Role là chìa khóa cho giao tiếp service-to-service an toàn. Ví dụ tạo role cho EC2 truy cập S3:
Ví dụ: EC2 Role cho quyền truy cập S3
Trust Policy (Ai có thể assume role này):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Permission Policy (Role này được làm gì):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-app-bucket/*"
}
]
}
Gắn Role vào EC2 qua Instance Profile:
- Tạo Instance Profile và add Role vào đó, sau đó chọn Instance Profile khi khởi tạo EC2 (hoặc attach sau).
- Tránh đưa Access Key vào EC2. Hãy dùng role để nhận temporary credentials.
Kiểm tra nhanh trên EC2 (sau khi gắn Role):
# Liệt kê object trong bucket
aws s3 ls s3://my-app-bucket/
# Upload thử một file (cần quyền PutObject)
aws s3 cp local.txt s3://my-app-bucket/local.txt
Lưu ý bảo mật nhanh:
- Không cấp wildcard "*" cho Action/Resource nếu không thật sự cần.
- Dùng Permission Boundary cho user cần sandbox.
- Bật CloudTrail và CloudWatch Alarms để giám sát hành vi bất thường.
Ví dụ triển khai thực tế
Giả sử một ứng dụng web với yêu cầu:
- Frontend developers cần truy cập S3 cho static assets
- Backend developers cần quyền với Lambda và DynamoDB
- DevOps cần quyền hạ tầng rộng hơn
- Tất cả truy cập cần audit và giới hạn theo IP văn phòng
Infrastructure as Code (IaC) với CloudFormation
AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Setup for Web Application'
Resources:
# Developer Group
DevelopersGroup:
Type: AWS::IAM::Group
Properties:
GroupName: WebApp-Developers
Policies:
- PolicyName: DeveloperAccess
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
- lambda:InvokeFunction
- dynamodb:GetItem
- dynamodb:PutItem
Resource:
- !Sub 'arn:aws:s3:::${ProjectName}-*'
- !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${ProjectName}-*'
- !Sub 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${ProjectName}-*'
Condition:
IpAddress:
aws:SourceIp:
- '203.0.113.0/24'
Parameters:
ProjectName:
Type: String
Default: 'webapp'
Mẹo tùy chỉnh:
- Thêm Outputs để in ra GroupName/Policy ARN phục vụ automation tiếp theo.
- Có thể tách Policies thành AWS::IAM::ManagedPolicy để tái sử dụng giữa nhiều Group/Role.
- Gắn Conditions nâng cao (aws:RequestedRegion, aws:PrincipalTag) để hạn chế phạm vi sử dụng.
Dọn dẹp (Cleanup)
- Xóa user/role/group/policy và bucket thử nghiệm sau khi hoàn tất lab để tránh phát sinh chi phí.
- Gỡ Instance Profile khỏi EC2 trước khi xóa role.
Kết luận
Qua bài triển khai này, bạn đã:
- Thiết kế mô hình group-based access và viết custom policy theo nguyên tắc Least Privilege.
- Tạo IAM User an toàn với MFA và quản lý credentials đúng cách.
- Tạo IAM Role cho EC2, gắn Instance Profile để dùng temporary credentials thay cho Access Key.
- Kiểm thử quyền bằng AWS CLI và tham khảo mẫu CloudFormation để chuẩn hóa IaC.
Checklist nhanh:
- Groups/Policies được đặt tên, gắn Tag nhất quán (Project, Env, Owner).
- Users bật MFA, Password Policy đủ mạnh, hạn chế inline policy.
- Roles có Trust Policy/Permission Policy tối thiểu; EC2 dùng Instance Profile.
- Bật CloudTrail, CloudWatch Alarms; dùng IAM Access Analyzer để rà soát chia sẻ ngoài ý muốn.
Next steps:
- Thiết lập Permission Boundary và, nếu multi-account, áp dụng SCP qua AWS Organizations.
- Chuẩn hóa quản trị quyền với IAM Identity Center (SSO) và định danh tập trung.
- Tách ManagedPolicy riêng, đẩy toàn bộ cấu hình IAM vào IaC, thêm kiểm tra CI (policy lint/simulator).
- Dùng Access Analyzer để generate policy từ hoạt động thực tế, rồi thu hẹp dần (policy refinement).
Pitfalls thường gặp:
- Gắn AdministratorAccess tràn lan; dùng wildcard "*" cho Action/Resource.
- Đưa Access Key vào EC2/container thay vì dùng Role.
- Thiếu quyền iam:PassRole khi dịch vụ cần assume role.
- Thiếu s3:ListBucket hoặc Resource ARN sai (thiếu /*) dẫn đến AccessDenied.
- Trust Policy Principal sai dịch vụ (ví dụ EC2 vs Lambda).