Lab Introduction
- AWS experience: Intermediate
- Time to complete: 15 minutes
- AWS Region: Global
- Cost to complete: Free
- Services used: Amazon IAM
Giới thiệu Service
Vào một ngày đẹp trời, hết thúc kì CHE/KPI cuối năm, sếp thăng chức cho lên vai trò System Admin. Bạn là một người quản lý môi trường AWS của nhiều công ty, và nhiều tài khoản khác nhau. Tuy nhiên, số tài khoản bạn được khách hàng đưa cho có hạn và không thể chia sẻ qua lại giữa nhiều thành viên phát triển khác nhau.
Việc tạo thêm cũng như cung cấp thông tin tài khoản là không cần thiết đối với việc phát triển phần mềm hay đơn giản chỉ là chạy ứng dụng có kết nối với AWS để test một vài module. Bên cạnh đó, việc chia sẻ thông tin Access Key và Security Key cho nhiều người là việc cấm kị trong bảo mật thông tin.
Để khắc phục vấn đề này, AWS cung cấp cho người dùng giải pháp để khắc phục đó là AssumeRole thông qua dịch vụ AWS STS. IAM-Assume Role tính năng yêu cầu AWS STS cung cấp 1 set temporary security credential để có thể access resource mà thông thường ta không có quyền access. Có thể AssumeRole trong cùng account hoặc khác account.
Sử dụng AssumeRole trong các usecase cấp quyền tạm thời mà không muốn tạo nhiều user, quản lý tập trung user thông qua Single-Sign-On thay vì tạo user trên từng account.
Architecture Diagram

Kiến trúc này mô tả cách một người dùng (hoặc ứng dụng) "mượn" quyền từ một vai trò (IAM Role) để tương tác resource trên AWS
- Puppet User gửi yêu cầu muốn dùng quyền của "S3 Manage Role" để xem file trong S3
- AWS STS kiểm tra "Puppet User" có được phép dùng "S3 Manage Role" không
- Nếu có, AWS STS cấp "chìa khóa" có quyền truy cập S3 trong khoảng thời gian nhất định cho "Puppet User". Ngược lại, sẽ trả về lỗi Access Deny
- Puppet User chia sẻ những "chìa khóa tạm thời" (Temporary Credential) này cho đội DEV làm việc với S3.
1. Tạo một IAM user và attach 1 policy cho phép user AssumeRole
- Tạo 1 user không có quyền nào. Truy cập dịch vụ IAM. Chọn User -> Create user -> Nhập tên role: cmp-minhhn28-assumerole-japan -> Nhấn Next -> Nhấn Next ->Review & nhấn nút Create user


- Attach inline policy với action là PassRole (Là quyền để trao (gán) một vai trò cho dịch vụ/tài nguyên khác.)
Chọn tab Permission -> Nhấn create inline policy
Mục Select a service, chọn dịch vụ IAM
Sau khi chọn service IAM, ở mục Actions allowed nhập tìm kiếm là PassRole -> Chọn action là PassRole. Nhấn nút Next
Cuối cùng, đặt tên cho Policy ví dụ: CMP-AWSAssumeRolePolicy và chọn tạo policy

Note: Ghi chú hoặc copy arn của user sử dụng trong bước 3: arn:aws:iam::xxxxxxxxxxx:user/cmp-minhhn28-assumerole-japan
2. Tạo một role AmazonS3ReadOnlyAccess, thiết lập trust policy cho phép user ở trên có thể assume role
Ở mục Access management -> Chọn Role -> Create role -> Trusted entity type chọn mục: Custom trust policy
Phần Principal: nhập thông tin arn của user đã copy bước 1. Nhấn nút Next
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<aws_id>:user/<tên_tài_khoản_nhận_ủy_thác"},
"Action": "sts:AssumeRole"
}
]
}

Khi cần thêm quyền sử dụng những Services khác nhau của AWS, người dùng có thể dễ dàng thêm vào Role, cũng như chỉnh sửa Policy của Role, thông qua việc Add Permissions vào Role.
Tiếp theo, ở bước Add permissions: chọn Permissions policies là AmazonS3ReadOnlyAccess.
Nhấn nút Next.
Cuối cùng, đặt tên cho Role ví dụ: CMP-RoleForAssumeByDeveloper và chọn Create role.
Verify role tạo thành công.
3. Sử dụng Terminal, tạo AWS Temporary Credential thông qua AWS STS
Cài đặt môi trường thực hiện CLI với tài khoản cần nhận Assume Role vừa tạo ra.
Để cài đặt môi trường để thực thi AWS CLI xin tham khảo tại đây.
Thực hiện câu lệnh dưới đây để tạo AWS Temporary Credentials với "Vai trò Ủy thác" - Assume Role
aws sts assume-role --role-arn "arn:aws:iam::<aws_acc_id>:role/<assume-role-name>" --role-session-name <session-name>
- <assume-role-name> : Tên của Assume Role đã tạo. Theo ví dụ là : CMP-RoleForAssumeByDeveloper
- <session-name> : Tên của session sẽ được tạo ra khi sử dụng Assume Role. Ví dụ: Credential tạm thời dùng để truy cập vào S3 nên đặt tên là CertTempS3Access
AWS Temporary Credentials được tạo ra bởi Assume Role có thời hạn hiệu lực trong vòng 3600s (1 tiếng) để kéo dài thời gian này cần dùng thêm options --duration-seconds với giá trị từ 900s (15 phút ) tới 43200s (12 giờ).
aws sts assume-role --role-arn "arn:aws:iam::<aws_acc_id>:role/RoleForAssumeByDeveloper" --role-session-name CertTempS3Access
Sau khi thực hiện câu lệnh Aws Temporary Credentail sẽ được AWS STS trả về với kết quả như sau:
{
"Credentials": {
"AccessKeyId": "<access_key_id>",
"SecretAccessKey": "<secret_access_key",
"SessionToken": "<session_token>",
"Expiration": "<expiration>"
},
"AssumedRoleUser": {
"AssumedRoleId": "<session_role_id>",
"Arn": "arn:aws:sts::<aws_acc_id>:assumed-role/<assume-role-name>/<session-name>"
}
}

Cài đặt lại biến môi trường AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN với thông tin vừa trả về.
Nếu thực hiện cài đặt bằng aws configure cần phải mở file credentials thêm thông tin biến môi trường AWS_SESSION_TOKEN.
File credentials sẽ có thông tin như sau:
[default]
aws_access_key_id = <access_key_id>
aws_secret_access_key = <secret_access_key>
Mình sẽ thêm 1 profile là minhhn28-assume-user, cấu hình AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN lấy ở trên

4. Thực hiện kiểm tra cài đặt
Theo ví dụ trong bài, Developer không có quyền gì khi mới được tạo. Tuy nhiên, sau khi thực hiện cấp Assume Role tài khoản Developer có thêm quyền chỉ đọc file trong S3.
Do đó, để thực hiện kiểm tra cài đặt đã đúng, hãy thực hiện câu lệnh dưới đây
aws s3 ls --profile minhhn28-assume-user

Để tìm hiểu sâu hơn về câu lệnh - command của Assume Role tại đây
Clean up resources