# Aws Iam

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ập** và **phâ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ểm | Mô tả |
| --- | --- |
| **Định danh duy nhất** | Mỗ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ực** | Có thể có password (đăng nhập AWS Console) hoặc access key (truy cập AWS CLI/API) |
| **Không phải user root** | IAM 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/`](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:**

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

**Tạo access key cho user:**

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

**Gán policy** `AdministratorAccess`**:**

```bash
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:**

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

> ⚠️ Lưu lại `AccessKeyId` và `SecretAccessKey` 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 &gt; Chọn Roles &gt; 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

```json
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

```json
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

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

Output mẫu:

```json
{
    "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ống | Role phù hợp |
| --- | --- |
| **EC2 cần truy cập S3 mà không dùng access key** | Gán IAM Role vào EC2 |
| **Lambda cần ghi vào DynamoDB** | Tạ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 Boss** | Tạo Role cho **Another AWS Account** và gán ARN |
| **ECS Task cần truy cập API của Boss** | Gán IAM Role vào ECS Task |
| **Ứng dụng dùng AWS STS để lấy quyền tạm thời** | Dù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

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
```

| Thành phần | Ý nghĩa |
| --- | --- |
| `Version` | Phiên bản ngôn ngữ policy (luôn dùng `"2012-10-17"`) |
| `Effect` | `Allow` hoặc `Deny` |
| `Action` | Hành động được phép (hoặc bị cấm) |
| `Resource` | Tài nguyên áp dụng policy |

### 2.3.3. Các loại IAM Policy

| Loại | Mô tả |
| --- | --- |
| **Managed Policy** | Policy do AWS quản lý (vd: `AmazonS3ReadOnlyAccess`) hoặc do chúng ta tạo |
| **Inline Policy** | Policy gắn trực tiếp vào một user/role/group cụ thể |
| **AWS Managed Policy** | Do AWS tạo sẵn, chỉ việc gán |
| **Customer Managed Policy** | Do 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

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

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

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

c. Ghi log vào CloudWatch

```json
{
  "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

```json
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": "*"` và `"Action": "*"` nếu không thật sự cần.
    
* Dùng [IAM Policy Simulator](https://policysim.aws.amazon.com/) để 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ên | Mô tả |
| --- | --- |
| `AdministratorAccess` | Toàn quyền |
| `AmazonS3ReadOnlyAccess` | Chỉ đọc S3 |
| `AmazonEC2FullAccess` | Toàn quyền EC2 |
| `CloudWatchLogsFullAccess` | Toàn quyền log |
| `AWSLambdaBasicExecutionRole` | Ghi 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 S3 | Gắn policy vào bucket |
| ✅ Amazon SQS | Gắn policy vào queue |
| ✅ Amazon SNS | Gắn policy vào topic |
| ✅ AWS Lambda | Gắn policy vào function |
| ✅ API Gateway | Gắn policy vào API |
| ❌ EC2, RDS, DynamoDB | Không hỗ trợ resource-based policy |

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

```json
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 |
| --- | --- |
| `Effect` | `Allow` hoặc `Deny` |
| `Principal` | Ai được phép truy cập tài nguyên |
| `Action` | Hành động được phép thực hiện |
| `Resource` | Tà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 Policy** | **Resource-based Policy** |
| --- | --- | --- |
| Gán vào đâu? | Gán vào **IAM user, role, group** | Gắ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ên | Xá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ụ AWS | Chỉ 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`:
    

```json
{
  "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**:
    

```json
{
  "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:

```plaintext
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ống | Sử 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 |
