使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可 - AWS Identity and Access Management

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

使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可

在 Amazon EC2 執行個體上執行的應用程式必須在 AWS API 請求中包含 AWS 憑證。您可以讓開發人員直接在 Amazon EC2 執行個體上存放 AWS 憑證,並允許該執行個體中的應用程式使用這些憑證。不過,開發人員將必須管理憑證,並確實將憑證安全地傳遞給每個執行個體,並在需要更新憑證時更新每個 Amazon EC2 執行個體。這是許多額外的工作。

與其這麼做,您可以 (也應該) 使用 IAM 角色來管理 Amazon EC2 執行個體上所執行應用程式的臨時憑證。使用角色時,您不必將長期憑證 (例如登入憑證或存取金鑰) 分發給 Amazon EC2 執行個體。相反,該角色提供應用程式在呼叫其他 AWS 資源時可以使用的臨時許可。啟動 Amazon EC2 執行個體時,指定要與執行個體相關聯的 IAM 角色。然後,在執行個體上執行的應用程式可以使用角色提供的暫時憑證來簽署 API 請求。

如要透過角色為 Amazon EC2 執行個體上執行的應用程式授予許可,需搭配一些額外的組態。Amazon EC2 執行個體上執行的應用程式會由虛擬化作業系統從 AWS 中抽象化。由於這種額外的區隔,您需經由額外的步驟為 Amazon EC2 執行個體指派 AWS 角色及其相關許可,提供給其應用程式使用。此額外步驟是建立連接到執行個體的執行個體設定檔。執行個體描述檔包含角色,可以將角色的臨時憑證提供給在執行個體上執行的應用程式。然後,可以在應用程式的 API 呼叫中使用這些臨時憑證來存取資源,並限制僅存取角色指定的那些資源。

注意

一次只能指派一個角色給 Amazon EC2 執行個體,執行個體上的所有應用程式會共用相同的角色和許可。當您利用 Amazon ECS 來管理 Amazon EC2 執行個體時,您可以向 Amazon ECS 任務指派角色,這些角色和執行 Amazon EC2 執行個體所使用的角色有所區別。為每項任務指派一個角色的做法符合最低權限存取原則,並且允許對動作和資源進行更精細的控制。

如需詳細資訊,請參閱《Amazon Elastic Container Service 最佳實務指南》中的對 Amazon ECS 任務使用 IAM 角色

以這種方式使用角色有幾個好處。由於角色憑證是臨時的並且是自動更新的,因此您不需要管理憑證,也不必擔心長期的安全風險。此外,如果對多個執行個體使用單一角色,則可以對該角色進行變更,並將變更自動傳播到所有執行個體。

注意

雖然在啟動角色時通常就會將角色指派給 Amazon EC2 執行個體,但角色也可以與目前執行的 Amazon EC2 執行個體連接。若要了解如何將角色連接到正在執行的執行個體,請參閱 Amazon EC2 的 IAM 角色

適用於 Amazon EC2 執行個體的角色如何運作?

下圖中,開發人員在 Amazon EC2 執行個體上執行應用程式,該應用程式需要存取名為 photos 的 S3 儲存貯體。管理員建立 Get-pics 服務角色,並將角色連接到 Amazon EC2 執行個體。該角色包括許可政策,該政策授予對指定的 S3 儲存貯體的唯讀存取許可。角色還包含信任政策,該政策可允許 Amazon EC2 執行個體擔任角色並擷取臨時憑證。當應用程式在執行個體上執行時,它可以使用角色的臨時憑證來存取照片儲存貯體。管理員不必授予開發人員存取照片儲存貯體的許可,開發人員也不必共用或管理憑證。


        在 Amazon EC2 執行個體上存取 AWS 資源的應用程式
  1. 管理員使用 IAM 建立 Get-pics 角色。在角色的信任政策中,管理員指定只有 Amazon EC2 執行個體可以擔任該角色。在角色的許可政策中,管理員為 photos 儲存貯體指定唯讀許可。

  2. 開發人員啟動 Amazon EC2 執行個體,並將 Get-pics 角色指派給該執行個體。

    注意

    如果您使用 IAM 主控台,則會為您管理執行個體描述檔,並且對您來說幾乎是透明的。但是,如果使用 AWS CLI 或 API 來建立及管理角色和 Amazon EC2 執行個體,則必須建立執行個體設定檔,並在單獨的步驟中將角色指派給該執行個體。然後,當您啟動執行個體時,必須指定執行個體設定檔名稱,而不是角色名稱。

  3. 應用程式執行時,會從 Amazon EC2 執行個體中繼資料中取得暫時安全憑證,如從執行個體中繼資料中擷取安全憑證中所述。這些是代表角色的暫時安全憑證,並且在有限的時間段內有效。

    透過一些 AWS 開發套件,開發人員可以使用透明地管理暫時安全憑證的提供者。(個別的 AWS 開發套件的文件描述了該開發套件所支援的用於管理憑證的功能)。

    或者,應用程式可以直接從 Amazon EC2 執行個體的執行個體中繼資料中取得臨時憑證。您可以從中繼資料的 iam/security-credentials/role-name 類別 (在本例中為 iam/security-credentials/Get-pics) 中取得憑證和相關的值。如果應用程式從執行個體中繼資料取得憑證,則可以快取憑證。

  4. 使用擷取到的臨時憑證,應用程式存取照片儲存貯體。基於連接至 Get-pics 角色的政策,應用程式具有唯讀許可。

    在執行個體上提供的臨時安全憑證在到期之前會自動更新,以便有效設定為永久可用。應用程式只需要確保在目前中繼資料到期之前,它從執行個體中繼資料中取得一組新的憑證。您可以使用 AWS 開發套件來管理憑證,因此應用程式不需要包含其他邏輯來重新整理憑證。例如,使用執行個體描述檔憑證提供者建立用戶端。不過,如果應用程式從執行個體中繼資料取得臨時安全憑證並快取它們,則應每小時或在目前設定過期之前至少 15 分鐘取得重新整理的憑證集。過期時間包含在 iam/security-credentials/role-name 類別中所傳回的資訊。

使用 Amazon EC2 角色所需的許可

若要使用角色啟動執行個體,開發人員必須具有啟動 Amazon EC2 執行個體的許可,以及傳遞 IAM 角色的許可。

以下範例政策可讓使用者使用 AWS Management Console 來啟動具有角色的執行個體。此政策包含萬用字元 (*),以允許使用者傳遞任何角色,並執行列出的 Amazon EC2 動作。ListInstanceProfiles 動作讓使用者查看 AWS 帳戶 中可用的所有角色。

範例政策,授予使用者使用 Amazon EC2 主控台啟動具有任何角色的執行個體的許可
{ "Version": "2012-10-17", "Statement": [ { "Sid": "IamPassRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "ec2.amazonaws.com" } } }, { "Sid": "ListEc2AndListInstanceProfiles", "Effect": "Allow", "Action": [ "iam:ListInstanceProfiles", "ec2:Describe*", "ec2:Search*", "ec2:Get*" ], "Resource": "*" } ] }

限制哪些角色可以傳遞給 Amazon EC2 執行個體 (使用 PassRole)

您可以使用 PassRole 許可,限制使用者在啟動執行個體時可以將哪個角色傳遞給 Amazon EC2 執行個體。這有助於防止使用者執行具有比授予使用者更多許可的應用程式,也就是說,能夠獲得更高的許可。例如,假設使用者 Alice 只擁有啟動 Amazon EC2 執行個體以及使用 Amazon S3 儲存貯體的許可,但她傳遞給 Amazon EC2 執行個體的角色具有使用 IAM 和 Amazon DynamoDB 的許可。在這種情況下,Alice 或許可以啟動執行個體、登入執行個體、取得暫時安全憑證,然後執行她未授權的 IAM 或 DynamoDB 動作。

若要限制使用者可以將哪些角色傳遞給 Amazon EC2 執行個體,則要建立允許 PassRole 動作的政策。然後,您需要將政策連接到預計啟動 Amazon EC2 執行個體的使用者 (或使用者所屬的 IAM 群組)。在政策的 Resource 元素中,您需列出允許使用者傳遞給 Amazon EC2 執行個體的角色。當使用者啟動執行個體並將角色與其關聯時,Amazon EC2 檢查是否允許使用者傳送該角色。當然,您也應當確保使用者可以傳遞的角色不包含比使用者應具有的許可更多的許可。

注意

PassRole 不是與RunInstancesListInstanceProfiles 相同的 API 動作。相反,只要角色 ARN 做為參數傳遞給 API (或者主控台代表使用者執行此操作),AWS 就會檢查該許可。它可協助管理員控制哪些使用者可以傳遞哪些角色。在這種情況下,它確保允許使用者將特定角色連接到 Amazon EC2 執行個體。

範例 此範例政策授予使用者許可,使其可以啟動具有特定角色的 Amazon EC2 執行個體

以下範例政策可允許使用者使用 Amazon EC2 API 來啟動具有角色的執行個體。Resource 元素指定角色的 Amazon Resource Name (ARN)。透過指定 ARN,政策授予使用者僅傳遞 Get-pics 角色的許可。如果使用者在啟動執行個體時嘗試指定不同的角色,則動作會失敗。使用者沒有執行任何執行個體的許可,無論其是否有傳遞角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/Get-pics" } ] }

允許執行個體設定檔角色切換到另一個帳戶中的角色

您可以允許在 Amazon EC2 執行個體上執行的應用程式在另一個帳戶中執行命令。若要執行此操作,您必須允許將第一個帳戶中的 Amazon EC2 執行個體角色切換到第二個帳戶中的角色。

假設您使用兩個 AWS 帳戶,且您想允許在 Amazon EC2 執行個體上執行的應用程式在兩個帳戶中執行 AWS CLI 命令。假設 Amazon EC2 執行個體存在於帳戶 111111111111。該執行個體包含 abcd 執行個體描述檔角色,該角色會允許應用程式在相同 111111111111 帳戶中對 my-bucket-1 儲存貯體執行唯讀 Amazon S3 任務。不過,也必須允許應用程式擔任 efgh 跨帳戶角色來在帳戶 222222222222 中存取 my-bucket-2Amazon S3 儲存貯體。

abcd Amazon EC2 執行個體設定檔角色必須具有以下許可政策,以允許應用程式存取 my-bucket-1 Amazon S3 儲存貯體:

帳戶 111111111111 abcd 角色許可政策

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }

abcd 角色必須信任 Amazon EC2 服務擔任該角色。若要執行此操作,abcd 角色必須有以下信任政策:

帳戶 111111111111 abcd 角色信任政策

{ "Version": "2012-10-17", "Statement": [ { "Sid": "abcdTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"Service": "ec2.amazonaws.com"} } ] }

假設 efgh 跨帳戶角色允許在相同 222222222222 帳戶中對 my-bucket-2 儲存貯體的唯讀 Amazon S3 任務。若要執行此操作,efgh 跨帳戶角色必須有以下許可政策:

帳戶 222222222222 efgh 角色許可政策

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

efgh 角色必須信任 abcd 執行個體設定檔角色擔任該角色。若要執行此操作,efgh 角色必須有以下信任政策:

帳戶 222222222222 efgh 角色信任政策

{ "Version": "2012-10-17", "Statement": [ { "Sid": "efghTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"} } ] }

我該如何開始?

若要了解角色如何使用 Amazon EC2 執行個體,您需要使用 IAM 主控台建立角色,啟動使用該角色的 Amazon EC2 執行個體,然後檢查正在執行的執行個體。您可以檢查執行個體中繼資料以查看角色的暫時憑證如何可用於執行個體。您還可以查看在執行個體上執行的應用程式如何使用該角色。使用以下資源以進一步了解。

如需建立角色或為 Amazon EC2 執行個體建立角色的詳細資訊,請參閱以下資訊: