在 AWS CLI 中使用 IAM 角色 - AWS Command Line Interface

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 AWS CLI 中使用 IAM 角色

AWS Identity and Access Management (IAM) 角色是一種授權工具,可讓使用者獲得額外 (或不同) 的許可,或獲得在不同 AWS 帳戶中執行動作的許可。

必要條件

若要執行 iam 命令,您需要安裝和設定 AWS CLI。如需更多詳細資訊,請參閱 安裝或更新到最新版本的 AWS CLI

使用 IAM 角色概觀

您可以在 ~/.aws/config 檔案中定義角色的描述檔,藉此將 AWS Command Line Interface (AWS CLI) 設定為使用 IAM 角色。

以下範例顯示名為 marketingadmin 的角色描述檔。如果您以 --profile marketingadmin 執行命令 (或以 AWS_PROFILE 環境變數 指定命令),AWS CLI 會使用在個別描述檔 user1 中定義的憑證,以擔任具有 Amazon 資源名稱 (ARN) arn:aws:iam::123456789012:role/marketingadminrole 的角色。您可以執行指派給該角色的許可所允許的任何操作。

[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole source_profile = user1

接著,您就可以指定 source_profile 來指向另一個具名描述檔,其中包含有許可使用此角色的使用者登入資料。在上述範例中,marketingadmin 描述檔使用 user1 描述檔中的憑證。當您將 AWS CLI 命令指定為使用描述檔 marketingadmin 時,AWS CLI 會自動查詢所連結的 user1 描述檔的憑證,並使用這些憑證來針對指定的 IAM 角色請求臨時憑證。CLI 在背景中使用 sts:AssumeRole 操作實現這一點。然後,這些臨時憑證就會用來執行所要求的 AWS CLI 命令。指定的角色必須已連接允許執行所要求 AWS CLI 命令的 IAM 許可政策。

若要在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或 Amazon Elastic Container Service (Amazon ECS) 容器中執行 AWS CLI 命令,您可以使用連接至執行個體描述檔或容器的 IAM 角色。如果您未指定描述檔或未設定環境變數,則會直接使用該角色。這可讓您避免將長時間存留的存取金鑰存放在您的執行個體。您也可以使用這些執行個體或容器角色來僅取得另一個角色的憑證。若要這樣做,請使用 credential_source (而不是 source_profile) 以指定如何尋找憑證。credential_source 屬性支援下列數值:

  • Environment – 從環境變數擷取來源憑證。

  • Ec2InstanceMetadata – 使用連接到 Amazon EC2 執行個體描述檔的 IAM 角色。

  • EcsContainer – 使用連接到 Amazon ECS 容器的 IAM 角色。

以下範例顯示經由參考 Amazon EC2 執行個體描述檔而使用的相同 marketingadminrole 角色。

[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole credential_source = Ec2InstanceMetadata

當您叫用角色時,您會有其他選項可以取得,例如使用多重要素驗證、外部 ID (由第三方公司用來存取其用戶端資源)。您也可以指定唯一工作階段名稱,以便在 AWS CloudTrail 日誌中更輕鬆地稽核。

設定和使用角色

當您使用指定 IAM 角色的描述檔來執行命令時,AWS CLI 會使用來源描述檔的憑證來呼叫 AWS Security Token Service (AWS STS),並針對指定的角色請求臨時憑證。來源描述檔中的使用者必須有許可針對指定的描述檔中的角色呼叫 sts:assume-role。此角色必須有信任關係而允許來源描述檔中的使用者使用該角色。針對角色來擷取並使用臨時憑證的過程就稱為擔任角色

在 IAM 中建立一個角色,並使用您希望使用者按照《AWS Identity and Access Management 使用者指南》中的建立角色以將許可委派給 IAM 使用者下的過程來承擔的許可。如果角色和來源描述檔的 使用者在同一帳戶中,則您可以在設定角色的信任關係時輸入自己的帳戶 ID。

建立角色後,修改信任關係以允許 使用者承擔此角色。

以下範例顯示可連接到角色的信任政策。此政策允許帳戶 (123456789012) 中的任何使用者擔任角色,但前提是該帳戶的管理員明確將 sts:AssumeRole 許可授予使用者。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } ] }

信任政策不會實際授予許可。帳戶的管理員必須連結含有適當許可的政策,才能將擔任角色的許可委派給個別使用者。以下範例顯示可連接到使用者的政策,該政策只允許使用者擔任 marketingadminrole 角色。如需有關授予使用者擔任角色之權限的詳細資訊,請參閱《IAM 使用者指南》中的授予使用者許可以切換角色

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::123456789012:role/marketingadminrole" } ] }

使用者在執行使用角色設定檔的 AWS CLI 命令時,並不需要有其他許可。反之,執行命令所需的許可來自於連接到角色的許可。您可以將許可政策連接到角色,以指定可對哪些 AWS 資源執行哪些動作。如需有關將許可附加至角色 (運作方式與使用者相同) 的詳細資訊,請參閱《IAM 使用者指南》中的變更 IAM 使用者的許可

既然您已正確設定角色描述檔、角色許可、角色信任關係和使用者許可,您可以在命令列叫用 --profile 選項來使用該角色。例如,以下使用本主題開頭範例所定義的 marketingadmin 角色所連接的許可,呼叫 Amazon S3 ls 命令。

$ aws s3 ls --profile marketingadmin

若要使用多個呼叫的角色,可以從命令列為目前工作階段設定 AWS_PROFILE 環境變數。因為已定義環境變數,您不需要在每個命令中指定 --profile 選項。

Linux 或 macOS

$ export AWS_PROFILE=marketingadmin

Windows

C:\> setx AWS_PROFILE marketingadmin

如需有關設定使用者和角色的詳細資訊,請參閱《IAM 使用者指南》中的使用者和群組以及角色

使用多重要素驗證

為了提高安全性,當使用者嘗試使用角色設定檔進行呼叫時,您可以要求使用者提供由多重要素驗證 (MFA) 裝置、U2F 裝置或行動應用程式產生的一次性金鑰。

首先,您可以選擇修改 IAM 角色的信任關係來要求 MFA。這可防止任何人在使用該角色之前未先使用 MFA 進行驗證。相關範例請參閱下列範例中的 Condition 行。此政策可讓名為 anika 的使用者擔任政策連接的角色,前提是使用者已使用 MFA 進行驗證。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/anika" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:multifactorAuthPresent": true } } } ] }

接著,在角色設定檔中新增一行,指定使用者的 MFA 裝置的 ARN。以下範例 config 檔案項目顯示兩個角色設定檔,都使用使用者 anika 的存取金鑰來請求角色 cli-role 的臨時登入資料。使用者 anika 具有擔任角色的許可,由角色的信任政策所授予。

[profile role-without-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile=cli-user [profile role-with-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile = cli-user mfa_serial = arn:aws:iam::128716708097:mfa/cli-user [profile cli-user] region = us-west-2 output = json

mfa_serial 設定可以採取 ARN,如圖所示,或硬體 MFA 字符的序號。

第一個設定檔 role-without-mfa 不需要 MFA。不過,因為連接到該角色的上述範例信任政策要求 MFA,因此使用此設定檔來執行命令的任何嘗試都會失敗。

$ aws iam list-users --profile role-without-mfa An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied

第二個設定檔項目 role-with-mfa 識別要使用的 MFA 裝置。當使用者嘗試使用此描述檔執行 AWS CLI 命令時,AWS CLI 會提示使用者輸入 MFA 裝置提供的一次性密碼 (OTP)。如果 MFA 驗證成功,命令會執行請求操作。OTP 不會顯示在螢幕上。

$ aws iam list-users --profile role-with-mfa Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user: { "Users": [ { ...

跨帳戶角色和外部 ID

您可以藉由將角色設定為跨帳戶角色,使 使用者能夠使用屬於不同帳戶的角色。在角色建立期間,將角色類型設定為 Another AWS account (其他 AWS 帳戶),如建立角色以將許可委派給 IAM 使用者所述。或者,您可以選取 Require MFA (需要 MFA)。如 使用多重要素驗證 中所描述的,Require MFA (需要 MFA) 選項在信任關係中設定適當的條件。

如果您使用外部 ID 以進一步控制誰可使用跨帳戶的角色,則您還必須將 external_id 參數新增至角色描述檔。這通常是在另一個帳戶由公司或組織外的某人控制時才使用。

[profile crossaccountrole] role_arn = arn:aws:iam::234567890123:role/SomeRole source_profile = default mfa_serial = arn:aws:iam::123456789012:mfa/saanvi external_id = 123456

指定角色工作階段名稱以更輕鬆地稽核

當多人共用一個角色時,稽核就更具挑戰。您想要將呼叫的每個操作與呼叫該動作的個人建立關聯。不過,當該個人使用某個角色時,個人擔任的角色會是與呼叫操作不同的動作,因此您必須手動將兩者建立關聯。

您可以在使用者擔任角色時指定唯一的角色工作階段名稱,藉此簡化此操作。您可以將 role_session_name 參數新增至指定角色的 config 檔案中的每個具名描述檔。role_session_name 值會傳遞到 AssumeRole 操作,並成為角色工作階段的 ARN 的一部分。它也包含在所有記錄的操作的 AWS CloudTrail 日誌中。

例如,您可以建立以角色為基礎的設定檔,如下所示。

[profile namedsessionrole] role_arn = arn:aws:iam::234567890123:role/SomeRole source_profile = default role_session_name = Session_Maria_Garcia

這會導致角色工作階段中具有下列 ARN。

arn:aws:iam::234567890123:assumed-role/SomeRole/Session_Maria_Garcia

此外,所有 AWS CloudTrail 日誌會在為每個操作擷取的資訊中包含角色工作階段名稱。

擔任具有 Web 身分的角色

您可以設定描述檔,以指出 AWS CLI 應該使用 Web 聯合身分和 Open ID Connect (OIDC) 來擔任某個角色。當您在描述檔中指定此資訊時,AWS CLI 會自動為您進行對應的 AWS STS AssumeRoleWithWebIdentity 呼叫。

注意

當您指定使用 IAM 角色的描述檔時,AWS CLI 會進行適當的呼叫以擷取臨時憑證。這些憑證會儲存在 ~/.aws/cli/cache 中。指定相同描述檔的後續 AWS CLI 命令會使用快取的臨時憑證,直到它們過期為止。此時,AWS CLI 會自動重新整理憑證。

若要使用 Web 聯合身分擷取並使用臨時憑證,您可以在共用描述檔中指定以下組態值。

role_arn

指定要擔任的角色 ARN。

web_identity_token_file

指定檔案的路徑,該檔案包含由身分提供者提供的 OAuth 2.0 存取字符或 OpenID Connect ID 字符。AWS CLI 會載入此檔案,並傳遞其內容作為 WebIdentityToken 操作的 AssumeRoleWithWebIdentity 引數。

role_session_name

指定套用到此擔任角色工作階段的選用名稱。

下列是擔任具有 Web 身分角色描述檔所需的最少量組態的組態範例。

# In ~/.aws/config [profile web-identity] role_arn=arn:aws:iam:123456789012:role/RoleNameToAssume web_identity_token_file=/path/to/a/token

您也可以使用 環境變數 提供此組態。

AWS_ROLE_ARN

要擔任的角色 ARN。

AWS_WEB_IDENTITY_TOKEN_FILE

Web 身分字符檔案的路徑。

AWS_ROLE_SESSION_NAME

套用到此擔任角色工作階段的名稱。

注意

這些環境變數目前只適用於擔任具有 Web 身分提供者的角色。它們不適用於一般擔任角色供應商組態。

清除快取的憑證

當您使用角色時,AWS CLI 會在本機快取暫時憑證,直到到期為止。下次您嘗試使用它們時,AWS CLI 會嘗試代表您續約。

如果角色的臨時憑證被撤銷,則不會自動續約,而嘗試使用它們會失敗。不過,您可以刪除快取,以強制 AWS CLI 擷取新的憑證。

Linux 或 macOS

$ rm -r ~/.aws/cli/cache

Windows

C:\> del /s /q %UserProfile%\.aws\cli\cache