Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Hướng dẫn triển khai thực tế AWS IAM

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

  1. Developers Group: Cho lập trình viên ứng dụng
  2. DevOps Group: Cho quản trị hạ tầng
  3. 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

  1. Tạo user có programmatic access
  2. Gán user vào group phù hợp
  3. Thiết lập MFA cho truy cập console
  4. 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).