Skip to content

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ụcGiá trị
Nguồn IDIdentity Center Directory
Phương thức xác thựcLời mời email
MFABắt buộc (ứng dụng xác thực)
Thời gian phiên8 giờ

Quy trình thêm người dùng

  1. AWS Console → IAM Identity Center → Users → "Add user"
  2. Nhập email, tên
  3. Gán vào nhóm
  4. Email mời được gửi → Người dùng đặt mật khẩu & đăng ký MFA

Nhóm

Tên nhómPermission SetMục đích
H2tAdminsAdministratorAccessQuản lý hạ tầng, truy cập toàn bộ tài nguyên
H2tDevelopersH2tDeveloperAccessCông việc phát triển & debug
H2tViewersH2tReadOnlyAccessChỉ 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.

json
{
  "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 userMục đíchAccess KeyPolicy
gitlab-deployerDeploy từ GitLab CI/CDCó hiệu lựcH2tDeployPolicy
h2t-appỨng dụng GMAC (Laravel) truy cập AWSCó hiệu lựcH2tAppPolicy
h2t-scraperChương trình scraping (Python/Django) truy cập AWSCó hiệu lựcH2tScraperPolicy

gitlab-deployer

User chuyên dụng cho deploy từ GitLab CI/CD.

MụcGiá trị
Tên usergitlab-deployer
Truy cập consoleVô hiệu
Access KeyCó hiệu lực (đặt trong biến GitLab CI/CD)
MFAKhông cần (chỉ truy cập chương trình)

H2tDeployPolicy

json
{
  "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ụcGiá trị
Tên userh2t-app
Truy cập consoleVô hiệu
Access KeyCó hiệu lực (đặt trong Laravel .env)
MFAKhông cần (chỉ truy cập chương trình)

H2tAppPolicy

json
{
  "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ụcGiá trị
Tên userh2t-scraper
Truy cập consoleVô hiệu
Access KeyCó hiệu lực (đặt trong biến môi trường scraping server)
MFAKhông cần (chỉ truy cập chương trình)

H2tScraperPolicy

json
{
  "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 userMục đíchQuyềnNguồn kết nối
h2t_adminQuản lý DB (migration, v.v.)ALL PRIVILEGESMáy quản trị
h2t_appỨng dụng GMAC (Laravel)SELECT, INSERT, UPDATE, DELETEApp server
h2t_readonlyChỉ đọc (báo cáo, điều tra)SELECTMáy quản trị
h2t_scraperChương trình scrapingSELECT, INSERT, UPDATEScraping server

SQL tạo user

sql
-- 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ụcGiá trị
Tên roleecsTaskExecutionRole
Trust policyecs-tasks.amazonaws.com
Managed policyAmazonECSTaskExecutionRolePolicy (AWS managed)

ecsTaskRole

Role để container ứng dụng truy cập dịch vụ AWS.

MụcGiá trị
Tên roleecsTaskRole
Trust policyecs-tasks.amazonaws.com
Custom policyH2tTaskPolicy

H2tTaskPolicy

json
{
  "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ắcNội dung
Cấm sử dụng hàng ngàyTà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ộcCài đặt MFA cho tài khoản root
Vô hiệu Access KeyKhông tạo access key cho root

Các best practice bảo mật

MụcĐối ứng
Quyền tối thiểuChỉ cấp quyền tối thiểu cần thiết qua permission set & policy
MFA bắt buộcNgười dùng Identity Center phải đăng ký MFA
Xoay vòng Access KeyXoay vòng key của gitlab-deployer mỗi 90 ngày
CloudTrailKích hoạt để ghi lại API call
Quản lý phiênGiới hạn thời gian phiên Identity Center 8 giờ