1. Giới thiệu

Ngày nay, có nhiều công ty chuyển sang sử dụng cloud nhiều hơn và AWS là lựa chọn hàng đầu của họ. Khi dịch vụ, hệ thống của công ty càng lớn, đòi hỏi công ty cần một bên thứ ba giúp họ cải thiện hệ thống cũng như kiểm tra, xem xét các vấn đề bảo mật trong hệ thống của mình.

Để bên thứ ba có thể khảo sát được hệ thống của mình, các công ty sẽ phải làm cách nào đó cấp quyền cho bên thứ ba truy cập vào tài nguyên của mình. Công ty có thể tạo ra một tài khoản cùng với mật khẩu và trao cho bên thứ ba để họ truy cập vào AWS của mình, nhưng làm cách đó có rủi ro bảo mật rất cao. Thay vào việc tạo một tài khoản cùng mật khẩu để cung cấp cho bên thứ ba thì cross-account IAM Role là một lựa chọn tốt.

Cross-account IAM role là một quyền mà công ty tạo ra và cung cấp nó cho bên thứ ba, bên thứ ba này sẽ dựa vào quyền đó mà truy cập vào tài nguyên của công ty. Role này không đòi hỏi mật khẩu và nó quản lý được 2 thứ sau:

  • Tài khoản nào của bên thứ ba được cho phép để truy cập vào tài nguyên.
  • Loại tài nguyên nào mà bên thứ ba có thể truy cập được.

 

Giả sử công ty sử dụng AWS là công ty A và bên thứ ba mà công ty A muốn thuê để kiểm tra cloud cho là công ty B.

2. Vấn đề

Khi công ty A tạo Cross-account IAM role bình thường và đưa link đăng nhập cho công ty B sử dụng thì vấn đề confused deputy có thể xảy ra.

Nghĩa là, khi công ty B cũng làm việc với công ty C và công ty B yêu cầu công ty C đưa cho mình link để truy cập AWS như công ty A đã làm, thì lúc này công ty C có thể đoán hay bằng cách nào đó biết link của công ty A đã tạo và đưa link đó cho công ty B sử dụng.

Bằng cách làm như thế, công ty C đã lừa công ty B rằng link họ đưa là AWS của mình nhưng thực chất lại là của công ty A, công ty B không biết mình đã bị lừa và làm việc bình thường với AWS của công ty A.

Ở ví dụ trên, công ty C sẽ không chiếm được quyền truy cập vào AWS của công ty A nhưng lại khiến công ty B truy cập một cách không mong muốn vào công ty A. Việc công ty B truy cập vào AWS của công ty A là hợp lệ khi nhìn từ phía công ty A nên vấn đề này được gọi là confused deputy:

confused deputy trong cross-account IAM role

Ở hình trên thì bên trái là công ty A, ở giữa là công ty B và bên phải là công ty C.

Để giải quyết vấn đề trên, khi tạo cross-account IAM role, bạn nên sử dụng External ID

Chú ý là khi sử dụng External ID, công ty B chỉ có thể sử dụng AWS của công ty A thông qua CLI hoặc SDK chứ không thể sử dụng switch role trên AWS console như thông thường.

 

3. Tạo cross-account IAM role một cách bảo mật

External ID là một string hay một dãy số mà công ty B sử dụng để định danh các role mà mình sẽ dùng. 

Khi công ty Acông ty C tạo role cho công ty B sử dụng, thì công ty A và C phải yêu cầu công ty B trao cho một external ID để định danh cho từng role.

Công ty B phải hiểu rõ được rằng external ID này là unique đối với từng role của từng công ty, mỗi khi công ty A hay C đưa role để công ty B sử dụng, công ty B phải xác định external ID cho role đó. Bằng cách làm như thế, dù công ty C có cố tình đưa role của công ty A cho công ty B đi chăng nữa, B vẫn nắm được rằng mình đang làm việc với C nên sẽ dùng external ID đã trao đổi trước với C, dẫn tới kết quả là thất bại vì role mà C cố tình đưa đã không khớp với external ID mà B cung cấp.

 

Các bước thực hiện như sau:

  • Công ty A lúc tạo cross-account role sẽ nhập Account ID của công ty B và External ID đã trao đổi trước đó với công ty B:

tạo cross-account IAM role với external ID

  • Công ty A tạo role xong sẽ cung cấp role ARN cho công ty B sử dụng:

tạo cross-account role với external ID

 

  • Công ty B sau khi nhận được role trên từ A, sẽ thực thi câu lệnh để có thể sử dụng role đó. Chú ý là khi role có external ID, công ty B sẽ không thể sử dụng AWS console để truy cập vào tài nguyên của A mà phải sử dụng CLI hoặc SDK:
// assume role không có external ID sẽ báo lỗi
$ aws sts assume-role --role-arn arn:aws:iam::222222222222:role/hungdv-CA --role-session-name tmp

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::111111111111:user/accountB is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::222222222222:role/hungdv-CA


// assume role có external ID sẽ thành công
$ aws sts assume-role --role-arn arn:aws:iam::222222222222:role/hungdv-CA --external-id 123456789 --role-session-name tmp
{
    "Credentials": {
        "AccessKeyId": "ASIASP...",
        "SecretAccessKey": "tWJcc0IoW3S...",
        "SessionToken": "abcxyz...",
        "Expiration": "2021-03-17T18:07:04+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROASPQBOKCITOPP2PJOM:tmp",
        "Arn": "arn:aws:sts::222222222222:assumed-role/hungdv-CA/tmp"
    }
}

 

Link tham khảo:

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html