# AWS 02. IAM service

## IAM service?

IAM = Identity Access Management

IAM là một dịch vụ cung cấp khả năng xác thực và phân quyền truy cập cho:

- User (người dùng) có thể truy cập và thao tác trên các resource (tài nguyên) của AWS.
- AWS resource có thể truy cập và thao tác trên các AWS Resource khác.

### 1. User

Có 2 loại user:

- Root user
- IAM user

**Root user**: là tài khoản đăng ký AWS, nó có quyền hạn tối cao cho tài khoản AWS.

Một số lưu ý cho Root user:
- Nên xóa access key của Root user
- Tạo 1 IAM user có quyền là administrator để thao tác với AWS (không nên sử dụng trực tiếp Root user)

**IAM user**: là tài khoản được tạo ra từ Root user (hoặc IAM user có quyền admin). Và thường sử dụng trong việc cung cấp user account cho các thành viên tham gia quản lý, phát triển dự án. Mặc định IAM user sẽ không có bất cứ permission nào.

### 2. Group

**Group** là một nhóm các user kế thừa chung một số permission (trên hệ thống AWS) của group (eg: tạo user mới / upload file lên S3 bucket / ...)

### 3. Policies

Trước khi đi vào tìm hiểu Policies, thì ta nên biết rằng AWS phân các quyền hạn dựa trên các ```action``` (hành động tương tác vào resource) và gọi nó là ```permission```

*ví dụ:* ```"s3:CreateBucket"``` là action cho phép tạo bucket (folder) trên S3 service.

**Policy** là đơn vị nhỏ nhất mà chúng ta (user) có thể tạo ra được để nhằm phân quyền cho **user / group / role**.

Để quản lý các Policy, chúng ta sẽ vào dịch vụ IAM sau đó điều hướng tới  [menu Policy](https://console.aws.amazon.com/iamv2/home#/policies) 

Dưới đây là một ví dụ về một ```Policy```

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:DeleteBucket",
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}
``` 

Chúng ta phân tích 1 chút về ```Policy``` ở ví dụ trên:

- Policy được tạo bằng 2 cách: Sử dụng Visual editor hoặc viết dưới dạng JSON document

![BL_AWS02_2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1627801989466/ZZRjGRhPh.png)


![BL_AWS02_3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1627802001995/cihJVaNCt.png)

- Nội dung trong trường Statement là một mảng các AWS resource permissions
- Trong mỗi một AWS resource permission thì ta quan tâm tới các thành phần: ```Effect``` ```Action``` ```Resource``` ```Condition```
- ```Effect``` (= Allow || Deny) nó thể hiện sự ảnh hưởng của các ```Action``` có được cho phép hay không (từ chối) trong Policy.
- ```Action``` là các hành động được phép thao tác với resource.
- ```Resource``` là tài nguyên được áp dụng các hành động trong ```Action``` field.
- ```Condition``` là điều kiện để tăng tính security cho Policy. (eg: require MFA hoặc source IP)

**Lưu ý:
- Nên đánh tag cho Policy để dễ kiểm soát (eg: đánh tag theo môi trường ```Dev | Staging | Product```)

### 4. Role

**Role** được dùng để ủy quyền truy cập cho user hoặc AWS resources

Role sử dụng các Policies để set permission cho user hoặc AWS resources

Một ứng dụng của việc sử dụng role, đó là thiết lập role cho phép EC2 truy cập vào S3, thay vì chúng ta phải sử dụng cặp access/secret key để implement vào trong code của application chạy trên EC2, sau đó EC2 mới có thể gọi tới S3.

Thì bây giờ chúng ta sẽ set role cho EC2 là có quyền access vào S3, thì nghiễm nhiên application nằm trên EC2 có thể gọi tới S3 mà không cần tới access/secret key



