Identity & Access Management
Nội dung
Identity and Access Management (IAM) là dịch vụ cho phép người dùng quản lý việc truy cập những tài nguyên và dịch vụ trên AWS - AWS Resource. Khi bắt đầu với AWS, chúng ta sử dụng IAM để tạo ra các Group và Users mới, cung cấp các quyền hạn - Permission cần thiết đối với việc sử dụng các AWS resource.
Root & IAM User
Khi bắt đầu sử dụng AWS, người dùng đăng nhập thông qua tài khoản và mật khẩu cung cấp trong quá trình đăng kí. Khi hoạt động xác thực - authentication thành công, người dùng có toàn quyền sử dụng các dịch vụ và tài nguyên AWS dưới một user mặc định gọi là Root User.
Chú ý
Do tính bảo mật, AWS không khuyến khích người dùng sử dụng Root User trong các tác vụ thông thường. Thay vào đó, người dùng nên tạo ra những IAM User cho những mục đích khác nhau cùng quyền hạn cần thiết tương ứng. Tham khảo phần thực hành I ví dụ tạo một IAM User với quyền Admin
.
Ví dụ, sử dụng AWS CLI để tạo một IAM User Alex
:
aws iam create-user --user-name Alex
Để xác thực User Alex
với hệ thống AWS qua username / password, thực hiện các bước sau:
- Tạo một login profile cho
Alex
aws iam create-login-profile --user-name Alex --generate-cli-skeleton > create-login-profile.json
Với file JSON create-logic-profile
được tạo ra, chúng ta cần cập nhật giá trị của username và password. Ví dụ
{
"UserName": "Alex",
"Password": "123data456password",
"PasswordResetRequired": false
}
Đăng kí credential của Alex
với hệ thống AWS qua lệnh:
aws iam create-login-profile --cli-input-json file://create-login-profile.json
Kết quả câu lệnh thông báo Login Profile của Alex
đã được tạo ra
{
"LoginProfile": {
"UserName": "Alex",
"CreateDate": "2020-08-08T12:00:33+00:00",
"PasswordResetRequired": false
}
}
Để đăng nhập với IAM User Alex
, chúng ta sử dụng IAM users sign-in link
trong mục IAM -> IAM users sign-in link
Màn hình đăng nhập trên AWS Console
IAM Group
IAM Group là tập hợp những IAM User chia sẻ chung một số quyền hạn. Một User cũng có thể thuộc về nhiều Group khác nhau, và do đó cũng sẽ có quyền khác nhau.
Ví dụ chúng ta có thể tạo ra các group với permission:
Admin
- quản trị mọi dịch vụ và tài nguyên trong hệ thốngDevOps
- thực hiện xây dựng và vận hành các dịch vụ liên quan đến hoạt động CI/CDEngineer
- sử dụng những tài nguyên, dịch vụ cho phát triển ứng dụngFinance
- quản lý và báo cáo chi phí sử dụng các dịch vụ AWS
Ví dụ, sử dụng AWS CLI để tạo các group:
aws iam create-group --group-name Admin
aws iam create-group --group-name Engineer
aws iam create-group --group-name Finance
aws iam create-group --group-name DevOps
Kết quả hiển thị trên AWS Console
Danh sách Groups trên AWS Console
Thêm IAM User hiện có vào một IAM Group
aws iam add-user-to-group --group-name DevOps --user-name Alex
Sử dụng lệnh sau để xác nhận group của user Alex
aws iam list-groups-for-user --user-name Alex
Output câu lệnh
{
"Groups": [
{
"Path": "/",
"GroupName": "DevOps",
"GroupId": "AGPA2TUMMYZVUXRKCKWTY",
"Arn": "arn:aws:iam::729365137003:group/DevOps",
"CreateDate": "2020-08-07T02:56:19+00:00"
}
]
}
Định nghĩa
ARN - giá trị định danh duy nhất cho mỗi tài nguyên trong AWS.
IAM Role
IAM Role có ý nghĩa tương tự với IAM User ở điểm chúng đều là những đối tượng có định danh - AWS Identity, và được gán quyền sử dụng tài nguyên AWS. Tuy vậy:
- IAM Role không bao gồm thông tin credential (username/password hoặc access key) như IAM User
-
IAM Role có thể được sử dụng bởi nhiều đối tượng khác, cho phép chúng có thêm những permission cho một tác vụ cụ thể. Các đối tượng này có thể là:
- Những IAM User trong cùng một AWS Account.
- IAM User trong AWS Account khác
- Những dịch vụ AWS như EC2, ECS
- User xác nhận bởi một Exertnal Identity Provider (IdP)
Định nghĩa
IdP - dịch vụ cung cấp định danh bên ngoài AWS, ví dụ: Facebook, Google. AWS hỗ trợ liên kết với những IdP, cho phép người dùng sau khi xác nhận bởi những IdP có thể truy cập và sử dụng AWS resources.
Để có được một Role, AWS Identity (ví dụ IAM User) cần gửi một STS API request đến dịch vụ AWS Security Token Service (STS). Dựa trên thông tin về credential
của Identity và nội dung của Role, STS sẽ quyết định việc cung cấp một credential tạm thời, cho phép Identity truy cập vào AWS Resource khai báo trong role policy. Chúng ta có thể tham khảo thêm ví dụ trong phần thực hành để hiểu rõ hơn về cách thức này.
Mô hình AWS Security Token Service
Principle
Principle là các thực thể được xác thực bởi AWS, cho phép chúng gửi các yêu cầu đến AWS Resources. Principle có thể là IAM User, AWS Root User, hoặc IAM Role.
Policy
Policy là tập hợp những điều khoản định nghĩa quyền truy cập, sử dụng AWS Resources. AWS cung cấp 6 loại Policy, trong đó phổ biến nhất:
- Identity-based policies - Policy gán cho các IAM Identity (User, Group, Role), cung cấp quyền truy cập cho những Identity này
- Resource-based policies - Policy gán cho các AWS Resources (ví dụ: S3, trust policies), xác định những Principle có quyền hạn sử dụng Resources đó.
Nội dung Policy sử dụng cấu trúc JSON với các phần:
- Thông tin về phiên bản sử dụng
- Tập hợp
statement
khai báo quyền truy cập
Cấu trúc một statement
:
- Sid - statement identity
- Effect - có giá trị
Allow
hoặcDeny
áp dụng lên quyền truy cập - Principal - đối tượng áp dụng của policy, chỉ áp dụng với Resource-based policies.
- Action - danh sánh các hoạt động policy cho phép hoặc từ chối
- Resource - tài nguyên cần truy cập, thường chỉ áp dụng với Identity-based policies
- Conditional - điều kiện policy có tác dụng
Hướng dẫn
Trong bài viết này để ghi nhớ các khái niệm cùng mối quan hệ giữa chúng, chúng ta có thể tạo một biểu đồ Mindmap đơn giản bằng sử dụng công cụ MindNode
Thực hành
IAM Group & User
Bài thực hành này cung cấp những bước để tạo một IAM User mới, và sử dụng User này để thực hiện những câu lệnh AWS CLI trong những bài tập thực hành khác. Với IAM User mới, tên gọi operator
, chúng ta hạn chế việc sử dụng AWS Root Account nhằm mục đích tăng cường tính bảo mật trên hệ thống AWS.
- Đăng nhập hệ thống với IAM Root Account
Đăng nhập với Root Account
- Từ AWS Console, vào mục
IAM -> Groups
, click vào buttonCreate New Group
để tạo một group mớiOperatiorsGroup
Tạo Group mới
- Click vào button
Next Step
, trên màn hìnhAttach Policy
, lựa chọn policyAdministratorAccess
đã được AWS định nghĩa sẵn
Bổ sung Policy với Group được tạo ra
- Click tiếp button
Next Step
, sau đó clickCreate Group
trên màn hìnhReview
Xác nhận cấu hình trước khi tạo Group
- Vào mục
IAM -> Users
, click vàoAdd User
, để tạo IAM User mớioperator
Bổ sung thêm User vào Group
Chú ý : Lựa chọn mục Programmatic Access
để cho phép việc sử dụng user operator
qua Access Key ID và Secret Access Key.
- Trên màn hình
Add User
:- Trong phần
Set permission
, lựa chọnAdd user to group
- Trong phần
Add user to group
, lựa chọnOperatiorsGroup
được tạo ra trước đó
- Trong phần
Sau khi kết thúc lựa chọn, click vào Next: Tags
để sang bước tiếp theo.
Lựa chọn Group bổ sung
Trong màn hình tiếp theo, Add tags (optional)
, lựa chọn Next: Review
để sang màn hình tiếp theo.
- Trên màn hình
Review
, sau khi xác nhận thông tin, click vàoCreate user
Xác nhận cấu hình cho User trước khi tạo mới
- Trên màn hình cuối cùng. Thông điệp
Success
cho chúng ta biết việc tạo IAM User mới đã thành công.
Chú ý : Màn hình này hiển thị 2 hai giá trị của Access key ID và Secret access key. Với ý nghĩa tương tự như username và password, những thông tin này cần phải lưu giữ bảo mật. Ngoài ra, có thể lựa chọn Download .csv
để tải xuống file csv chứa giá trị của Access key ID và Secret access key.
- Tạo mới hoặc cập nhật file credentials cho cấu hình AWS CLI với giá trị Access key ID và Secret access key tạo ra
Khai báo Credential cho AWS CLI
- Mở một Terminal mới và xác nhận kết quả cài đặt thành công với một số câu lệnh đơn giản
Kiểm tra AWS Identity đang được sử dụng từ Terminal
aws sts get-caller-identity
Output trên Terminal
{
"UserId": "AIDA2TUMMYZVSASHJXQCE",
"Account": "729365137003",
"Arn": "arn:aws:iam::729365137003:user/operator"
}
Kiểm tra Identity có khả năng truy cập AWS S3 service
aws s3 ls
Output (sample)
2020-08-08 21:35:18 bucket-1900
2020-08-09 10:30:47 bucket-1901
2020-04-21 19:49:08 it-books-library
2020-07-28 17:55:05 microservice-sample
2020-08-03 16:15:58 reacttdd-sample
Identity-based policy
Trong phần này, chúng ta sẽ tạo ra một AWS Resource - S3 Bucket, sau đó sử dụng một Identity-based policy để kiểm soạt hoạt động truy cập vào các object trong Bucket này.
- Tạo một Bucket với tên
bucket-1900
trong regionus-east-1
với command:
aws s3api create-bucket --bucket bucket-1900 --region us-east-1
Chú ý tên bucket phải là định danh duy nhất, vì vậy hãy chọn một tên khác nếu câu lệnh báo lỗi.
Output của câu lệnh khi thực hiện thành công:
{
"Location": "/bucket-1900"
}
Hiển thị Bucket bucket-1900
trên AWS Console -> S3
Kiểm tra Bucket mới trên AWS Console
Bucket mới hiện để chế độ truy cập Public
với các object bên trong, do đó chúng ta cần giới hạn lại quyền truy cập này với lệnh:
aws s3api put-public-access-block \
--bucket bucket-1900 \
--public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
Khi quyền truy cập trên Bucket được cập nhật:
Thay đổi quyền truy cập với Bucket
- Tạo file
sample.txt
với nội dung ngẫu nhiên và upload lên bucket
echo "Content Sample" > sample.txt
aws s3api put-object --bucket bucket-1900 --key sample --body sample.txt
Câu lệnh trả về giá trị Hash (MD5) được tạo ra từ nội dung file upload
{
"ETag": "\"79ac14661fe3ed096fb51d3ad3c6f0a0\""
}
Xác nhận file được upload thành công lên bucket-1900
Xác nhận file được upload thành công lên Bucket
- Đăng nhập AWS Console sử dụng IAM User
Alex
, được tạo ra trong ví dụ trước. Xác nhậnAlex
không đủ quyền truy cập bucketbucket-1900
trongS3
Lỗi thông báo khi người dùng không có quyền truy cập
- Tạo một file
policy.json
khai báo quyền truy cập vào bucket với nội dung sau:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "2",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::bucket-1900",
"arn:aws:s3:::bucket-1900/*"
]
}
]
}
Đưa policy lên IAM với lệnh
aws iam create-policy --policy-name bucket-1900-policy --policy-document file://policy.json
Output của câu lệnh
{
"Policy": {
"PolicyName": "bucket-1900-policy",
"PolicyId": "ANPA2TUMMYZVUBICM33TK",
"Arn": "arn:aws:iam::729365137003:policy/bucket-1900-policy",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2020-08-08T13:05:46+00:00",
"UpdateDate": "2020-08-08T13:05:46+00:00"
}
}
Output này cho biết policy bucket-1900-policy
được tạo ra thành công với giá trị ARN:
arn:aws:iam::729365137003:policy/bucket-1900-policy
Sử dụng giá trị ARN này trong câu lệnh tiếp theo để attach policy vào IAM Group DevOps
:
aws iam attach-group-policy --group-name DevOps --policy-arn arn:aws:iam::729365137003:policy/bucket-1900-policy
- Đăng nhập AWS Console sử dụng IAM User
Alex
, được tạo ra trong ví dụ trước. Xác nhậnAlex
có đủ quyền truy cập bucketbucket-1900
trongS3
Xác nhận quyền truy cập của Alex trên bucket
bucket-1900
Resource-based Policy
- Tạo một Bucket khác với tên
bucket-1911
trong regionus-east-1
với command:
aws s3api create-bucket --bucket bucket-1901 --region us-east-1
- Tạo file
sample2.txt
với nội dung ngẫu nhiên và upload lên bucket
echo "Content Sample 2" > sample2.txt
aws s3api put-object --bucket bucket-1901 --key sample2 --body sample2.txt
- Đăng nhập AWS Console sử dụng IAM User
Alex
, được tạo ra trong ví dụ trước. Xác nhậnAlex
không đủ quyền truy cập bucketbucket-1901
trongS3
Xác nhận quyền truy cập của Alex trên bucket
bucket-1901
Trên AWS Console, vào mục AWS -> IAM
, User Alex
để xác nhận ARN của cá nhân với giá trị arn:aws:iam::729365137003:user/Alex
Kiểm tra giá trị ARN của User
Alex
- Tạo một Resource-based policy với tên
policy2.json
và gắn vào bucketbucket-1901
Nội dung của policy2.json
:
{
"Id": "Policy1596933034792",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1596932858363",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket-1901",
"Principal": {
"AWS": [
"arn:aws:iam::729365137003:user/Alex"
]
}
}
]
}
Gắn policy2.json
vào bucket bucket-1901
theo lệnh:
aws s3api put-bucket-policy --bucket bucket-1901 --policy file://policy2.json
Trong trường hợp định dạng nôi dụng trong policy2.json
không chính xác, chúng ta có thể gặp lỗi:
An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation:
This policy contains invalid Json
hoặc
An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation:
Statement is missing required element
Cách đơn giản để khắc phục vấn đề này là sử dụng công cụ Policy Generator do AWS cung cấp để tự động sinh ra policy chính xác:
Sử dụng công cụ Policy Generator
Sau khi nhập các thông tin về Policy Type
, Effect
, ARN của Principal
và Resource
, click vào Add Statement, tiếp đó Generate Policy
Policy Document theo định dạng JSON
Copy nội dung Policy được tao ra vào file policy2.json
(xoá toàn bộ nôi dung file trước đây).Thực hiện lại lệnh gắn policy:
aws s3api put-bucket-policy --bucket bucket-1901 --policy file://policy2.json
Kiểm tra nội dung policy đã được gắn thành công bằng câu lệnh:
aws s3api get-bucket-policy --bucket bucket-1901
- Đăng nhập AWS Console sử dụng IAM User
Alex
, được tạo ra trong ví dụ trước. Xác nhậnAlex
có quyền truy cập bucketbucket-1901
trongS3
Xác nhận quyền truy cập của Alex trên bucket
bucket-1901