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ờ