Skip to main content

Command Palette

Search for a command to run...

Aws Iam

Updated
11 min readView as Markdown

IAM (Identity and Access Management) là một dịch vụ cốt lõi của AWS giúp quản lý truy cậpphân quyền người dùng một cách an toàn và linh hoạt.


1. IAM là gì?

IAM cho phép :

  • Quản lý ai có thể truy cập tài nguyên AWS.

  • Kiểm soát họ có thể làm gì với các tài nguyên đó (EC2, S3, RDS...).

  • Áp dụng nguyên tắc Least Privilege (cấp quyền tối thiểu cần thiết).

IAM miễn phí, chỉ trả tiền cho các tài nguyên mà người dùng sử dụng.

2. Thành phần chính trong IAM

2.1. IAM User (Người dùng)

2.1.1. IAM User là gì?

Là một danh tính đại diện cho con người hoặc ứng dụng cần truy cập AWS.

🔹 Ví dụ:

  • Dev A muốn truy cập S3 và EC2 → Tạo IAM User cho Dev A.

  • App Java cần lấy file từ S3 → Tạo IAM User cho app đó.

🔹 Có thể gắn Username, Password, Access key/Secret key để đăng nhập AWS CLI/SDK/Console.

Các đặc điểm chính:

Đặc điểmMô tả
Định danh duy nhấtMỗi IAM User có tên định danh duy nhất trong tài khoản AWS
Chính sách phân quyền (Policy)Có thể gắn IAM Policy hoặc gắn vào IAM Group để kiểm soát quyền truy cập. Một IAM User có thể được gắn vào nhiều IAM Group.
Thông tin xác thựcCó thể có password (đăng nhập AWS Console) hoặc access key (truy cập AWS CLI/API)
Không phải user rootIAM User khác với tài khoản root, và nên sử dụng thay cho root để bảo mật

2.1.2. Hướng dẫn tạo IAM User bằng Console

Bước 1: Truy cập IAM

  1. Đăng nhập vào AWS Management Console bằng tài khoản root hoặc IAM user có quyền admin

  2. Truy cập dịch vụ IAM (Tìm trong ô search hoặc link trực tiếp: https://console.aws.amazon.com/iam/)


Bước 2: Tạo IAM User

  1. Trong menu bên trái, chọn Users

  2. Nhấn nút "Add users"


Bước 3: Nhập thông tin người dùng

  • User name: Nhập tên người dùng (vd: boss-dev)

  • Access type:

    • ✔️ AWS Management Console access: nếu muốn người dùng đăng nhập Console

    • ✔️ Programmatic access: nếu muốn dùng CLI, SDK, hoặc API

Có thể chọn cả hai nếu cần.


Bước 4: Gán quyền

Có 3 cách gán quyền:

  • Attach policies directly: gắn trực tiếp policy (vd: AdministratorAccess, AmazonS3ReadOnlyAccess)

  • Add user to group: gắn user vào group có sẵn quyền

  • Copy permissions from existing user

Với mục đích học tập, có thể chọn:

Attach policies directly → tích AdministratorAccess để có toàn quyền (chỉ nên dùng với môi trường học tập).


Bước 5: Tags (tuỳ chọn)

  • Có thể thêm các tag như Department: Dev, Project: Learning-AWS để dễ quản lý sau này.

Bước 6: Review và tạo

  • Kiểm tra lại thông tin → nhấn Create user

Bước 7: Lưu thông tin truy cập

  • Tải file .csv chứa:

    • Access Key ID

    • Secret Access Key

    • Console login link (nếu tạo user có quyền đăng nhập Console)

⚠️ nhớ lưu file .csv ngay, sau đó không thể xem lại secret key!

Lưu ý bảo mật

  • Không dùng user root cho các hoạt động thường ngày.

  • Dùng MFA (Multi-Factor Authentication) cho tất cả IAM user.

  • Gắn quyền tối thiểu cần thiết (Principle of Least Privilege)

2.1.3. Tạo IAM User bằng AWS CLI

Điều kiện:

Cần cài sẵn AWS CLI và đã cấu hình bằng lệnh aws configure

Câu lệnh tạo user:

aws iam create-user --user-name boss-dev

Tạo access key cho user:

aws iam create-access-key --user-name boss-dev

Gán policy AdministratorAccess:

aws iam attach-user-policy \
    --user-name boss-dev \
    --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

Output mẫu khi tạo access key:

{
    "AccessKey": {
        "UserName": "boss-dev",
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "Status": "Active",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "CreateDate": "2025-04-04T06:58:34+00:00"
    }
}

⚠️ Lưu lại AccessKeyIdSecretAccessKey vì sẽ không thể xem lại sau!

2.2. IAM Role (Vai trò)

2.2.1. IAM Role là gì?

Role cũng giống như user, nhưng không gắn cố định với một người dùng cụ thể. IAM Role phải được giả lập (assume) trước khi sử dụng.

Dùng trong các tình huống:

  • Các dịch vụ AWS (EC2, Lambda, S3, ECS, API Gateway, v.v.) có quyền truy cập tài nguyên khác mà không cần lưu trữ access key (gán role cho EC2, Lambda).

  • Tài khoản A muốn cho tài khoản B truy cập tài nguyên thông qua cross-account access.

🔹 Role không có password hay access key, chỉ được assume (đảm nhận) bởi user hoặc dịch vụ AWS (thường được tạo và dùng tạm thời).

2.2.2. Tạo IAM Role qua AWS Console

🔹 Bước 1: Vào IAM > Chọn Roles > Nhấn Create Role


🔹 Bước 2: Chọn loại Trusted Entity

  • Chọn AWS Service nếu role dùng cho EC2, Lambda, v.v.

  • Chọn Another AWS Account nếu cấp quyền cho tài khoản AWS khác.


🔹 Bước 3: Chọn service sẽ giả lập role (vd: EC2)

  • Nếu tạo IAM Role cho EC2, chọn EC2.

🔹 Bước 4: Gán policy cho role

  • Nếu muốn EC2 đọc S3, chọn AmazonS3ReadOnlyAccess

  • Nếu muốn EC2 có quyền admin, chọn AdministratorAccess (không khuyến khích trên môi trường thực tế).


🔹 Bước 5: Đặt tên Role và tạo

  • Ví dụ đặt tên EC2-S3-Access-Role

Sau khi tạo xong, Role ARN sẽ hiển thị, có thể dùng ARN này để gán cho EC2 hoặc Lambda.

2.2.3. Tạo IAM Role bằng AWS CLI

Bước 1: Tạo Role

aws iam create-role \
    --role-name EC2-S3-Access-Role \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": { "Service": "ec2.amazonaws.com" },
                "Action": "sts:AssumeRole"
            }
        ]
    }'

Bước 2: Gán policy AmazonS3ReadOnlyAccess cho Role

aws iam attach-role-policy \
    --role-name EC2-S3-Access-Role \
    --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

Bước 3: Lấy ARN của IAM Role

aws iam get-role --role-name EC2-S3-Access-Role

Output mẫu:

{
    "Role": {
        "RoleName": "EC2-S3-Access-Role",
        "Arn": "arn:aws:iam::123456789012:role/EC2-S3-Access-Role"
    }
}

2.2.4. Các tình huống sử dụng IAM Role

Tình huốngRole phù hợp
EC2 cần truy cập S3 mà không dùng access keyGán IAM Role vào EC2
Lambda cần ghi vào DynamoDBTạo IAM Role cho Lambda và gán quyền AmazonDynamoDBFullAccess
Một tài khoản AWS khác cần truy cập S3 của BossTạo Role cho Another AWS Account và gán ARN
ECS Task cần truy cập API của BossGán IAM Role vào ECS Task
Ứng dụng dùng AWS STS để lấy quyền tạm thờiDùng IAM Role với STS

2.3. IAM Policy (Chính sách)

2.3.1. IAM Policy là gì?

IAM Policy là một tập hợp các quy tắc (permissions) được viết bằng JSON, quy định ai được/không được truy cập tài nguyên nào, và được phép làm gì trên AWS.

Hiểu đơn giản:

  • Ai (IAM user, IAM role, IAM group)

  • Được phép làm gì (action như s3:PutObject, ec2:StartInstances)

  • Trên tài nguyên nào (resource như arn:aws:s3:::my-bucket/*)

2.3.2. Cấu trúc cơ bản của một IAM Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
Thành phầnÝ nghĩa
VersionPhiên bản ngôn ngữ policy (luôn dùng "2012-10-17")
EffectAllow hoặc Deny
ActionHành động được phép (hoặc bị cấm)
ResourceTài nguyên áp dụng policy

2.3.3. Các loại IAM Policy

LoạiMô tả
Managed PolicyPolicy do AWS quản lý (vd: AmazonS3ReadOnlyAccess) hoặc do chúng ta tạo
Inline PolicyPolicy gắn trực tiếp vào một user/role/group cụ thể
AWS Managed PolicyDo AWS tạo sẵn, chỉ việc gán
Customer Managed PolicyDo chúng ta tự tạo và quản lý

2.3.4. Ví dụ về các IAM Policy

a. Đọc mọi bucket trong S3

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::*/*"
    }
  ]
}

b. Toàn quyền với EC2

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:*",
      "Resource": "*"
    }
  ]
}

c. Ghi log vào CloudWatch

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

2.3.5. Hướng dẫn tạo IAM Policy bằng Console

🔹 Bước 1: Truy cập IAM → Policies → Create Policy

🔹 Bước 2: Chọn JSON → Dán nội dung policy → Next

🔹 Bước 3: Đặt tên (ví dụ: MyS3ReadOnlyPolicy)

🔹 Bước 4: Tạo và gán cho user/role/group

2.3.6. Tạo Policy bằng AWS CLI

aws iam create-policy \
  --policy-name MyS3ReadOnlyPolicy \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::my-bucket/*"
      }
    ]
  }'

2.3.7. Tips khi làm việc với IAM Policy

  • Luôn theo nguyên tắc "Least Privilege" – chỉ cấp quyền cần thiết.

  • Không nên dùng "Resource": "*""Action": "*" nếu không thật sự cần.

  • Dùng IAM Policy Simulator để kiểm tra policy trước khi áp dụng.

  • Có thể dùng Condition để giới hạn theo IP, thời gian, MFA, tags...

2.3.8. Một số IAM Policy hữu ích (do AWS tạo sẵn)

TênMô tả
AdministratorAccessToàn quyền
AmazonS3ReadOnlyAccessChỉ đọc S3
AmazonEC2FullAccessToàn quyền EC2
CloudWatchLogsFullAccessToàn quyền log
AWSLambdaBasicExecutionRoleGhi log vào CloudWatch từ Lambda

2.4. Resource-based Policy

2.4.1. Resource-based Policy là gì?

Resource-based Policy là một dạng policy được gắn trực tiếp vào tài nguyên AWS, cho phép kiểm soát ai (Principal) có thể thực hiện hành động gì (Action) trên tài nguyên đó.

Khác với IAM Policy:

  • IAM Policy được gắn vào người dùng (user), vai trò (role)

  • Resource-based Policy được gắn vào tài nguyên

2.4.2. Các dịch vụ AWS hỗ trợ Resource-based Policy

Dịch vụGhi chú
✅ Amazon S3Gắn policy vào bucket
✅ Amazon SQSGắn policy vào queue
✅ Amazon SNSGắn policy vào topic
✅ AWS LambdaGắn policy vào function
✅ API GatewayGắn policy vào API
❌ EC2, RDS, DynamoDBKhông hỗ trợ resource-based policy

2.4.3. Thành phần của một Resource-based Policy

jsonSao chépChỉnh sửa{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
TrườngÝ nghĩa
EffectAllow hoặc Deny
PrincipalAi được phép truy cập tài nguyên
ActionHành động được phép thực hiện
ResourceTài nguyên được áp dụng

Principal là ai được cấp quyền, có thể là:

  • Một tài khoản AWS khác

  • Một IAM role cụ thể

  • Một AWS service (ví dụ: Lambda, CloudWatch…)

2.4.4. IAM Policy vs Resource-based Policy – Sự khác biệt chính

Tiêu chíIAM PolicyResource-based Policy
Gán vào đâu?Gán vào IAM user, role, groupGắn trực tiếp lên tài nguyên AWS (vd: S3 bucket, Lambda function, SQS queue)
Xác định ai?Xác định người dùng nào được phép truy cập tài nguyênXác định ai (có thể là tài khoản khác) được phép truy cập tài nguyên
Hỗ trợ cross-account?❌ Không trực tiếp✅ Có thể cấp quyền cho tài khoản AWS khác
Tài nguyên hỗ trợTất cả các dịch vụ AWSChỉ một số tài nguyên: S3, SNS, SQS, Lambda, API Gateway...
Hướng kiểm soát“Người dùng này được làm gì?”“Ai được làm gì với tài nguyên này?”

  • 👉 IAM Policy là cấp quyền từ phía người dùng (user/role)
    → “Tôi (người dùng) được quyền truy cập tài nguyên nào?”

  • 👉 Resource-based Policy là cấp quyền từ phía tài nguyên
    → “Tài nguyên này cho phép ai truy cập nó?”

2.4.5. Ví dụ tình huống sử dụng

🎯 Tình huống 1 – Dùng IAM Policy (nội bộ)

Mục tiêu: Boss muốn cấp quyền cho 1 user (dev-user) trong tài khoản AWS của Boss để truy cập S3 bucket my-private-data.

✅ Cách làm:

  • Tạo IAM Policy gán vào dev-user:
{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::my-private-data/*"
}

👉 Không cần chỉnh gì trên bucket S3. IAM policy đã đủ.


🎯 Tình huống 2 – Dùng Resource-based Policy (cross-account)

Mục tiêu: Một tài khoản AWS khác (tài khoản A) muốn đọc file trong bucket boss-data của Boss (tài khoản B).

✅ Cách làm:

  • Trên S3 bucket của Boss, thêm resource-based policy:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::boss-data/*"
    }
  ]
}

🔑 Giải thích:

  • 123456789012 là ID của tài khoản A được cấp quyền.

  • Principal là người sẽ truy cập tài nguyên.

👉 Tài khoản A sẽ không cần Boss tạo role hoặc user bên A, chỉ cần bên Boss gắn policy lên bucket.

2.4.6. Kết hợp IAM + Resource-based Policy

AWS kiểm tra cả 2 policy khi xử lý một request:

QUYỀN = IAM Policy CHO PHÉP ❗ VÀ Resource-based Policy CHO PHÉP

Nếu một trong hai từ chối (Deny) → request bị từ chối.

2.4.7. Một số use case thực tế

Tình huốngSử dụng Resource-based Policy
Cho phép Lambda invoke từ tài khoản khác✅ Lambda Resource Policy
Cho phép đọc file S3 từ nhiều tài khoản✅ Bucket Policy
Cấp quyền publish SNS topic từ cross-account✅ SNS Policy
Cho phép API Gateway gọi Lambda✅ Lambda + Resource Policy

More from this blog

Engineer log

62 posts