Thiết kế IAM
Tổng quan
Thiết kế AWS IAM cho dịch vụ GMAC MEO. Sử dụng IAM Identity Center (trước đây là AWS SSO) để quản lý người dùng phát triển thông qua lời mời email.
Phương châm
- Quản lý người dùng tập trung bằng IAM Identity Center
- Thêm nhà phát triển qua lời mời email (sử dụng Identity Center Directory)
- Kiểm soát quyền truy cập bằng Permission Set
- Sử dụng IAM User truyền thống cho truy cập chương trình CI/CD
Sơ đồ cấu trúc IAM
IAM Identity Center
Cấu hình
| Mục | Giá trị |
|---|---|
| Nguồn ID | Identity Center Directory |
| Phương thức xác thực | Lời mời email |
| MFA | Bắt buộc (ứng dụng xác thực) |
| Thời gian phiên | 8 giờ |
Quy trình thêm người dùng
- AWS Console → IAM Identity Center → Users → "Add user"
- Nhập email, tên
- Gán vào nhóm
- Email mời được gửi → Người dùng đặt mật khẩu & đăng ký MFA
Nhóm
| Tên nhóm | Permission Set | Mục đích |
|---|---|---|
H2tAdmins | AdministratorAccess | Quản lý hạ tầng, truy cập toàn bộ tài nguyên |
H2tDevelopers | H2tDeveloperAccess | Công việc phát triển & debug |
H2tViewers | H2tReadOnlyAccess | Chỉ xem |
Permission Set
AdministratorAccess
Sử dụng AWS managed policy AdministratorAccess. Dành cho quản trị viên hạ tầng.
H2tDeveloperAccess (Tùy chỉnh)
Dành cho nhà phát triển. Cho phép truy cập các dịch vụ cần thiết cho phát triển như ECS, RDS, S3, CloudWatch.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECSReadDeploy",
"Effect": "Allow",
"Action": [
"ecs:Describe*",
"ecs:List*",
"ecs:ExecuteCommand"
],
"Resource": "*"
},
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::h2t-*",
"arn:aws:s3:::h2t-*/*"
]
},
{
"Sid": "CloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:GetLogEvents",
"logs:FilterLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams"
],
"Resource": "*"
},
{
"Sid": "RDSRead",
"Effect": "Allow",
"Action": [
"rds:Describe*",
"rds:List*"
],
"Resource": "*"
},
{
"Sid": "ECRRead",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer",
"ecr:DescribeRepositories",
"ecr:ListImages"
],
"Resource": "*"
}
]
}H2tReadOnlyAccess
Sử dụng AWS managed policy ReadOnlyAccess. Chỉ đọc.
IAM User (cho dịch vụ)
Tài khoản dịch vụ quản lý bằng IAM User truyền thống (không phải IAM Identity Center). Tất cả chỉ dành cho truy cập chương trình, không có quyền truy cập console.
Danh sách User
| Tên user | Mục đích | Access Key | Policy |
|---|---|---|---|
gitlab-deployer | Deploy từ GitLab CI/CD | Có hiệu lực | H2tDeployPolicy |
h2t-app | Ứng dụng GMAC (Laravel) truy cập AWS | Có hiệu lực | H2tAppPolicy |
h2t-scraper | Chương trình scraping (Python/Django) truy cập AWS | Có hiệu lực | H2tScraperPolicy |
gitlab-deployer
User chuyên dụng cho deploy từ GitLab CI/CD.
| Mục | Giá trị |
|---|---|
| Tên user | gitlab-deployer |
| Truy cập console | Vô hiệu |
| Access Key | Có hiệu lực (đặt trong biến GitLab CI/CD) |
| MFA | Không cần (chỉ truy cập chương trình) |
H2tDeployPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRAuth",
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
},
{
"Sid": "ECRPush",
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload"
],
"Resource": "arn:aws:ecr:ap-northeast-1:*:repository/h2t-*"
},
{
"Sid": "ECSUpdateService",
"Effect": "Allow",
"Action": [
"ecs:UpdateService",
"ecs:DescribeServices",
"ecs:DescribeTaskDefinition",
"ecs:RegisterTaskDefinition"
],
"Resource": "*"
},
{
"Sid": "PassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::*:role/ecsTaskExecutionRole",
"arn:aws:iam::*:role/ecsTaskRole"
]
}
]
}h2t-app
User để ứng dụng GMAC (Laravel) truy cập các dịch vụ AWS như S3, SES. Đặt access key trong .env.
| Mục | Giá trị |
|---|---|
| Tên user | h2t-app |
| Truy cập console | Vô hiệu |
| Access Key | Có hiệu lực (đặt trong Laravel .env) |
| MFA | Không cần (chỉ truy cập chương trình) |
H2tAppPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::h2t-*",
"arn:aws:s3:::h2t-*/*"
]
},
{
"Sid": "SESSendEmail",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "arn:aws:ses:ap-northeast-1:*:identity/*"
}
]
}h2t-scraper
User để chương trình scraping (Python/Django) truy cập S3, Batch.
| Mục | Giá trị |
|---|---|
| Tên user | h2t-scraper |
| Truy cập console | Vô hiệu |
| Access Key | Có hiệu lực (đặt trong biến môi trường scraping server) |
| MFA | Không cần (chỉ truy cập chương trình) |
H2tScraperPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::h2t-*",
"arn:aws:s3:::h2t-*/*"
]
},
{
"Sid": "BatchSubmitJob",
"Effect": "Allow",
"Action": [
"batch:SubmitJob",
"batch:DescribeJobs",
"batch:ListJobs",
"batch:TerminateJob"
],
"Resource": "*"
},
{
"Sid": "LambdaInvoke",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:ap-northeast-1:*:function:h2t-*"
},
{
"Sid": "CloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}User cơ sở dữ liệu RDS
User kết nối MySQL. Tạo và quản lý trên RDS.
| Tên user | Mục đích | Quyền | Nguồn kết nối |
|---|---|---|---|
h2t_admin | Quản lý DB (migration, v.v.) | ALL PRIVILEGES | Máy quản trị |
h2t_app | Ứng dụng GMAC (Laravel) | SELECT, INSERT, UPDATE, DELETE | App server |
h2t_readonly | Chỉ đọc (báo cáo, điều tra) | SELECT | Máy quản trị |
h2t_scraper | Chương trình scraping | SELECT, INSERT, UPDATE | Scraping server |
SQL tạo user
-- User quản trị
CREATE USER 'h2t_admin'@'%' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON h2t.* TO 'h2t_admin'@'%';
-- User ứng dụng
CREATE USER 'h2t_app'@'%' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE, DELETE ON h2t.* TO 'h2t_app'@'%';
-- User chỉ đọc
CREATE USER 'h2t_readonly'@'%' IDENTIFIED BY '<password>';
GRANT SELECT ON h2t.* TO 'h2t_readonly'@'%';
-- User scraping
CREATE USER 'h2t_scraper'@'%' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE ON h2t.* TO 'h2t_scraper'@'%';
FLUSH PRIVILEGES;IAM Role
ecsTaskExecutionRole
Role sử dụng khi ECS khởi động task.
| Mục | Giá trị |
|---|---|
| Tên role | ecsTaskExecutionRole |
| Trust policy | ecs-tasks.amazonaws.com |
| Managed policy | AmazonECSTaskExecutionRolePolicy (AWS managed) |
ecsTaskRole
Role để container ứng dụng truy cập dịch vụ AWS.
| Mục | Giá trị |
|---|---|
| Tên role | ecsTaskRole |
| Trust policy | ecs-tasks.amazonaws.com |
| Custom policy | H2tTaskPolicy |
H2tTaskPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::h2t-*",
"arn:aws:s3:::h2t-*/*"
]
},
{
"Sid": "SESSendEmail",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "arn:aws:ses:ap-northeast-1:*:identity/*"
}
]
}Quy tắc vận hành tài khoản Root
| Quy tắc | Nội dung |
|---|---|
| Cấm sử dụng hàng ngày | Tài khoản root chỉ dùng cho thiết lập ban đầu & trường hợp khẩn cấp |
| MFA bắt buộc | Cài đặt MFA cho tài khoản root |
| Vô hiệu Access Key | Không tạo access key cho root |
Các best practice bảo mật
| Mục | Đối ứng |
|---|---|
| Quyền tối thiểu | Chỉ cấp quyền tối thiểu cần thiết qua permission set & policy |
| MFA bắt buộc | Người dùng Identity Center phải đăng ký MFA |
| Xoay vòng Access Key | Xoay vòng key của gitlab-deployer mỗi 90 ngày |
| CloudTrail | Kích hoạt để ghi lại API call |
| Quản lý phiên | Giới hạn thời gian phiên Identity Center 8 giờ |