Link Search Menu Expand Document

Identity & Access Management

Nội dung

  1. Root & IAM User
  2. IAM Group
  3. IAM Role
  4. Principle
  5. Policy
  6. Thực hành
    1. IAM Group & User
    2. Identity-based policy
    3. Resource-based Policy

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 GroupUsers 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

User Sign-in Ouput 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ống
  • DevOps - 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/CD
  • Engineer - sử dụng những tài nguyên, dịch vụ cho phát triển ứng dụng
  • Finance - 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

Group Ouput 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.

STS Ouput 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ặc Deny á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

Mindmap Ouput


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

Root Account Login Đăng nhập với Root Account

  • Từ AWS Console, vào mục IAM -> Groups, click vào button Create New Group để tạo một group mới OperatiorsGroup

Group Create Tạo Group mới

  • Click vào button Next Step, trên màn hình Attach Policy, lựa chọn policy AdministratorAccess đã được AWS định nghĩa sẵn

Policy Attach Bổ sung Policy với Group được tạo ra

  • Click tiếp button Next Step, sau đó click Create Group trên màn hình Review

Review Group Configuration Xác nhận cấu hình trước khi tạo Group

  • Vào mục IAM -> Users, click vào Add User, để tạo IAM User mới operator

User Attach 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ọn Add user to group
    • Trong phần Add user to group, lựa chọn OperatiorsGroup được tạo ra trước đó

Sau khi kết thúc lựa chọn, click vào Next: Tags để sang bước tiếp theo.

User-Group Ouput 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ào Create user

Review 2 Ouput 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

Credentials Configuration 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 region us-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

Public S3 Ouput 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:

Private S3 Ouput 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

Object S3 Ouput 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ận Alex không đủ quyền truy cập bucket bucket-1900 trong S3

Insufficient S3 Ouput 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ận Alex có đủ quyền truy cập bucket bucket-1900 trong S3

Sufficient S3 Ouput 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 region us-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ận Alex không đủ quyền truy cập bucket bucket-1901 trong S3

Insufficient S3 2 Ouput 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

ARN Ouput 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 bucket bucket-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:

Policy Generator Ouput Sử dụng công cụ Policy Generator

Sau khi nhập các thông tin về Policy Type, Effect, ARN của PrincipalResource, click vào Add Statement, tiếp đó Generate Policy

Json Generator Ouput 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ận Alex có quyền truy cập bucket bucket-1901 trong S3

Sufficient 2 Ouput Xác nhận quyền truy cập của Alex trên bucket bucket-1901


Copyright © 2019-2022 Tuan Anh Le.