Amazon EC2 的 IAM 的角色 - Amazon Elastic Compute Cloud

Amazon EC2 的 IAM 的角色

應用程式必須使用 AWS 登入資料簽署其 API 請求。因此,若您是應用程式開發人員,對於在 EC2 執行個體上運作的應用程式,您會需要其登入資料的管理策略。例如,您可安全將 AWS 登入資料分配給執行個體,讓在這些執行個體上運作的應用程式能夠使用此登入資料來簽署請求,同時避免其他使用者取得您的登入資料。然而,安全地將憑證分配給所有執行個體的挑戰重重,尤其是 AWS 代表您建立的執行個體,例如 Spot 執行個體或 Auto Scaling 群組內的執行個體。您亦必須在更換 AWS 登入資料時,能夠更新每個執行個體的登入資料。

注意

對於 Amazon EC2 工作負載,建議您使用下述方法擷取工作階段憑證。這些憑證應該可讓您的工作負載發起 AWS API 請求,而無需使用 sts:AssumeRole 擔任已與執行個體相關聯的相同角色。除非您需要為屬性型存取控制 (ABAC) 傳遞工作階段標籤,或需要傳遞工作階段政策以進一步限制角色許可,否則此類角色擔任呼叫是不必要的,因為它們會建立一組新的相同的臨時角色工作階段憑證。

如果您的工作負載使用角色來擔任它自己,則必須建立信任政策,明確允許該角色擔任它自己。如果您不建立信任政策,會得到 AccessDenied 錯誤。如需詳細資訊,請參閱《IAM 使用者指南》中的修改角色信任政策

我們設計的 IAM 角色,讓您的應用程式能夠從執行個體安全提出 API 請求,您無須管理應用程式使用的安全登入資料。您不用建立並分配 AWS 憑證,而是使用 IAM 角色來委派提出 API 請求的許可,如下所示:

  1. 建立 IAM 角色。

  2. 定義可擔任這個角色的帳戶或 AWS 服務。

  3. 定義應用程式在角色擔任後可使用的 API 動作與資源。

  4. 啟動執行個體時指定該角色,或將該角色連接至現有執行個體。

  5. 讓應用程式擷取一組暫時登入資料並加以使用。

例如,若執行於您執行個體上的應用程式需要使用 Amazon S3 內的儲存貯體,您可使用 IAM 角色為其授予許可。您可建立 JSON 格式的政策,藉此指定 IAM 角色的許可。這些政策類似於您為 IAM 使用者建立的政策。若您變更角色,此變更會傳播至所有執行個體。

雖然您只能將一個 IAM 角色附加到一個執行個體中,但您可以將相同的角色附加到多個執行個體中。如需建立 IAM 角色的詳細資訊,請參閱IAM 使用者指南中的角色

您可將資源層級許可套用至 IAM 政策,藉此控制使用者連接、取代或分離執行個體的 IAM 角色的能力。如需詳細資訊,請參閱 Amazon EC2 API 動作支援的資源層級許可及下列範例:範例:使用 IAM 角色

執行個體描述檔

Amazon EC2 會使用執行個體描述檔做為 IAM 角色的容器。使用 IAM 主控台建立 IAM 角色時,主控台會自動建立執行個體描述檔,並將其命名為與對應角色相同的名稱。若您使用 Amazon EC2 主控台來啟動具備 IAM 角色的執行個體,或使用該主控台將 IAM 角色連接至執行個體,您須根據執行個體描述檔名稱清單來選擇角色。

若您使用 AWS CLI、API 或 AWS 開發套件來建立角色,則建立角色與執行個體描述檔為不同動作,且可以使用不同名稱。若您接著使用 AWS CLI、API 或 AWS 開發套件來啟動具備 IAM 角色的執行個體,或將 IAM 角色連接至執行個體,請指定執行個體設定檔名稱。

執行個體描述檔內僅有一個 IAM 角色。此限制無法提高。

如需詳細資訊,請參閱IAM 使用者指南中的執行個體描述檔

從執行個體中繼資料中擷取安全登入資料

執行個體上的應用程式會從執行個體中繼資料項目 iam/security-credentials/role-name,擷取角色提供的安全登入資料。如此即授予該應用程式許可,能夠執行您在建立角色與安全登入資料的關聯時所定義的角色動作與資源。這些安全登入資料為暫時的,我們會定期更換。舊的登入資料過期前至少五分鐘,我們就會提供新的登入資料。

警告

若您使用的服務會運用具備 IAM 角色的執行個體中繼資料,請確認該服務代您發出 HTTP 呼叫時不會暴露您的登入資料。可能會暴露登入資料的服務類型包括 HTTP 代理、HTML/CSS 驗證器服務和支援納入 XML 的 XML 處理器。

下列命令會擷取名為 s3access 之 IAM 角色的安全登入資料。

IMDSv2
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
IMDSv1
PS C:\> Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access

下列為範例輸出。

{ "Code" : "Success", "LastUpdated" : "2012-04-26T16:39:16Z", "Type" : "AWS-HMAC", "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE", "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "Token" : "token", "Expiration" : "2017-05-17T15:09:54Z" }

針對在執行個體上執行的應用程式 AWS CLI 和 Tools for Windows PowerShell 命令,您無須取得明確的暫時安全憑證 – AWS 開發套件AWS CLI 和 Tools for Windows PowerShell 會自動從 EC2 執行個體中繼資料服務取得憑證並加以使用。欲使用暫時安全登入資料在執行個體外部進行呼叫 (如為了測試 IAM 政策),您必須提供存取金鑰、私有金鑰和工作階段字符。如需詳細資訊,請參閱 IAM 使用者指南中的使用暫時安全登入資料來請求對 AWS 資源的存取

如需執行個體中繼資料的詳細資訊,請參閱執行個體中繼資料與使用者資料。如需執行個體中繼資料 IP 地址的相關資訊,請參閱擷取執行個體中繼資料

授予 IAM 使用者將 IAM 角色傳遞至執行個體的許可

若要讓 IAM 使用者能夠啟動具備 IAM 角色的執行個體,或者連接或取代現有執行個體的 IAM 角色,您必須授予使用者許可才能使用下列 API 動作:

  • iam:PassRole

  • ec2:AssociateIamInstanceProfile

  • ec2:ReplaceIamInstanceProfileAssociation

例如,使用 AWS CLI,下列 IAM 政策授予使用者許可以啟動具備 IAM 角色的執行個體,或讓其能夠連接或取代現有執行個體的 IAM 角色。

注意

如果要政策將 IAM 使用者存取權限授予您所有角色,請在政策中將資源指定為 *。但請考慮將最低權限原則當作最佳實務。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/DevTeam*" } ] }

若要授予使用者許可以啟動具備 IAM 角色的執行個體,或讓其能夠使用 Amazon EC2 主控台為現有執行個體連接或取代 IAM 角色,除了他們可能需要的任何其他許可之外,您還必須授予他們使用 iam:ListInstanceProfilesiam:PassRoleec2:AssociateIamInstanceProfileec2:ReplaceIamInstanceProfileAssociation 的許可。如需取得範例政策,請參閱「在 Amazon EC2 主控台中進行操作的範例政策。」。

使用 IAM 角色

您可建立 IAM 角色,並在啟動期間或之後將其連接至執行個體。您亦可取代或分離執行個體的 IAM 角色。

建立 IAM 角色

您必須建立 IAM 角色,之後才能啟動具備該角色的執行個體,或將該角色連接至執行個體。

使用 IAM 主控台建立 IAM 角色

  1. 在以下網址開啟 IAM 主控台:https://console.aws.amazon.com/iam/

  2. 在導覽窗格中,選擇 Roles (角色)、Create role (建立新角色)。

  3. Select role type (選取角色類型) 頁面上,選擇 EC2EC2 使用案例。選擇 Next: Permissions (下一步:許可)。

  4. Attach permissions policy (連接許可政策) 頁面上,選取授予您執行個體存取所需資源權限的 AWS 受管政策。

  5. Review (檢閱) 頁面上輸入角色的名稱,然後選擇 Create role (建立角色)

或者,您可使用 AWS CLI 來建立 IAM 角色。下列範例利用允許角色使用 Amazon S3 儲存貯體的政策來建立 IAM 角色。

建立 IAM 角色和執行個體設定檔 (AWS CLI)

  1. 建立下列信任政策並將其儲存為名為 ec2-role-trust-policy.json 的文字檔案。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
  2. 建立 s3access 角色,並指定您已使用 create-role 命令建立的信任政策。

    aws iam create-role \ --role-name s3access \ --assume-role-policy-document file://ec2-role-trust-policy.json

    回應範例

    { "Role": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" } } ] }, "RoleId": "AROAIIZKPBKS2LEXAMPLE", "CreateDate": "2013-12-12T23:46:37.247Z", "RoleName": "s3access", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/s3access" } }
  3. 建立存取政策並將其儲存為名為 ec2-role-access-policy.json 的文字檔案。例如,下列政策將 Amazon S3 的管理許可授予執行個體上運作的應用程式。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] }
  4. 使用 put-role-policy 命令將存取政策附加至角色。

    aws iam put-role-policy \ --role-name s3access \ --policy-name S3-Permissions \ --policy-document file://ec2-role-access-policy.json
  5. 使用 create-instance-profile 命令建立名為 s3access-profile 的執行個體描述檔。

    aws iam create-instance-profile --instance-profile-name s3access-profile

    回應範例

    { "InstanceProfile": { "InstanceProfileId": "AIPAJTLBPJLEGREXAMPLE", "Roles": [], "CreateDate": "2013-12-12T23:53:34.093Z", "InstanceProfileName": "s3access-profile", "Path": "/", "Arn": "arn:aws:iam::123456789012:instance-profile/s3access-profile" } }
  6. s3access 角色新增至 s3access-profile 執行個體描述檔。

    aws iam add-role-to-instance-profile \ --instance-profile-name s3access-profile \ --role-name s3access

或者,您也可以使用下列 AWS Tools for Windows PowerShell 命令:

使用 IAM 角色啟動執行個體

建立 IAM 角色後,即可啟動執行個體,並在啟動期間將該角色與執行個體建立關聯。

重要

建立 IAM 角色後,可能需要幾秒鐘的時間來傳播許可。若您第一次嘗試啟動具備角色的執行個體失敗,請等待數秒鐘後再試一次。如需詳細資訊,請參閱《IAM 使用者指南》中的 IAM 角色故障診斷

New console

使用 IAM 角色啟動執行個體 (主控台)

  1. 請遵循該程序來啟動執行個體

  2. 展開 Advanced details (進階詳細資訊),在 IAM instance profile (IAM 執行個體設定檔) 中選取您建立的 IAM 角色。

    注意

    IAM instance profile (IAM 執行個體設定檔) 清單會顯示您在建立 IAM 角色時所建立的執行個體設定檔名稱。若您已使用主控台建立 IAM 角色,則會為您建立執行個體描述檔,且其名稱會與該角色相同。若您已使用 AWS CLI、API 或 AWS 開發套件建立 IAM 角色,您可能已給予執行個體設定檔不同名稱。

  3. 設定執行個體所需的任何其他詳細資訊,或接受預設值,然後選取一個金鑰對。如需有關啟動執行個體精靈中欄位的資訊,請參閱 使用定義的參數啟動執行個體

  4. Summary (摘要) 面板中,檢閱您的執行個體組態,然後選擇 Launch instance (啟動執行個體)。

  5. 若您在應用程式中使用 Amazon EC2 API 動作,請擷取執行個體上可用的 AWS 安全憑證,並用其來簽署請求。AWS 開發套件會為您執行此動作。

    IMDSv2IMDSv1
    IMDSv2
    PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
    PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
    IMDSv1
    PS C:\> Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
Old console

使用 IAM 角色啟動執行個體 (主控台)

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在儀表板上,選擇啟動執行個體

  3. 選取 AMI 和執行個體類型,然後選擇 Next: Configure Instance Details (下一步:設定執行個體詳細資訊)

  4. Configure Instance Details (設定執行個體詳細資訊) 頁面上,針對 IAM role (IAM 角色),請選取您建立的 IAM 角色。

    注意

    IAM role (IAM 角色) 清單會顯示您在建立 IAM 角色時所建立的執行個體描述檔名稱。若您已使用主控台建立 IAM 角色,則會為您建立執行個體描述檔,且其名稱會與該角色相同。若您已使用 AWS CLI、API 或 AWS 開發套件建立 IAM 角色,您可能已給予執行個體設定檔不同名稱。

  5. 設定其他詳細資訊,然後按照指示完成剩下的精靈,或選擇 Review and Launch (檢閱和啟動) 來接受預設設定並直接前往 Review Instance Launch (檢閱執行個體的啟動) 頁面。

  6. 檢閱設定,然後選擇 Launch (啟動),選擇金鑰對並啟動您的執行個體。

  7. 若您在應用程式中使用 Amazon EC2 API 動作,請擷取執行個體上可用的 AWS 安全憑證,並用其來簽署請求。AWS 開發套件會為您執行此動作。

    IMDSv2IMDSv1
    IMDSv2
    PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
    PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
    IMDSv1
    PS C:\> Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name

或者,您可在啟動期間使用 AWS CLI 將角色與執行個體建立關聯。您必須在命令中指定執行個體描述檔。

使用 IAM 角色啟動執行個體 (AWS CLI)

  1. 使用 run-instances 命令來啟動使用執行個體描述檔的執行個體。下列範例說明如何啟動具備執行個體描述檔的執行個體。

    aws ec2 run-instances \ --image-id ami-11aa22bb \ --iam-instance-profile Name="s3access-profile" \ --key-name my-key-pair \ --security-groups my-security-group \ --subnet-id subnet-1a2b3c4d

    或者,請使用 New-EC2Instance Tools for Windows PowerShell 命令。

  2. 若您在應用程式中使用 Amazon EC2 API 動作,請擷取執行個體上可用的 AWS 安全憑證,並用其來簽署請求。AWS 開發套件會為您執行此動作。

    curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name

將 IAM 角色連接至執行個體

若要將 IAM 角色連接至無角色的執行個體,則執行個體可以處於 stoppedrunning 狀態。

New console

將 IAM 角色連接至執行個體 (主控台)

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 動作安全性修改 IAM 角色

  4. 選取要連接至執行個體的 IAM 角色,然後選擇 Save (儲存)

Old console

將 IAM 角色連接至執行個體 (主控台)

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 Actions (動作)Instance Settings (執行個體設定)Attach/Replace IAM role (連接/取代 IAM 角色)

  4. 選取欲連接至執行個體的 IAM 角色,然後選擇 Apply (套用)

將 IAM 角色連接至執行個體 (AWS CLI)

  1. 您可視需要描述執行個體來取得欲連接角色的執行個體 ID。

    aws ec2 describe-instances
  2. 使用 associate-iam-instance-profile 命令,透過指定執行個體描述檔將 IAM 角色連接至執行個體。您可使用執行個體描述檔的 Amazon Resource Name (ARN) 或其名稱。

    aws ec2 associate-iam-instance-profile \ --instance-id i-1234567890abcdef0 \ --iam-instance-profile Name="TestRole-1"

    回應範例

    { "IamInstanceProfileAssociation": { "InstanceId": "i-1234567890abcdef0", "State": "associating", "AssociationId": "iip-assoc-0dbd8529a48294120", "IamInstanceProfile": { "Id": "AIPAJLNLDX3AMYZNWYYAY", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-1" } } }

或者,使用下列 Tools for Windows PowerShell 命令:

取代 IAM 角色

若要取代已擁有連接 IAM 角色之執行個體上的 IAM 角色,則執行個體必須處於 running 狀態。如果您想要變更執行個體上的 IAM 角色,但不中斷現有的角色,您可以這麼做。例如,您可以這麼做確保執行個體上應用程式執行的 API 動作不會中斷。

New console

取代執行個體的 IAM 角色

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 動作安全性修改 IAM 角色

  4. 選取要連接至執行個體的 IAM 角色,然後選擇 Save (儲存)

Old console

取代執行個體的 IAM 角色

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 Actions (動作)Instance Settings (執行個體設定)Attach/Replace IAM role (連接/取代 IAM 角色)

  4. 選取欲連接至執行個體的 IAM 角色,然後選擇 Apply (套用)

取代執行個體的 IAM 角色 (AWS CLI)

  1. 您可視需要描述您的 IAM 執行個體描述檔關聯,以取得 IAM 執行個體描述檔欲取代的關聯 ID。

    aws ec2 describe-iam-instance-profile-associations
  2. 使用 replace-iam-instance-profile-association 命令,指定現有執行個體描述檔的關聯 ID,並指定取代後的執行個體描述檔 ARN 或名稱,藉此取代 IAM 執行個體描述檔。

    aws ec2 replace-iam-instance-profile-association \ --association-id iip-assoc-0044d817db6c0a4ba \ --iam-instance-profile Name="TestRole-2"

    回應範例

    { "IamInstanceProfileAssociation": { "InstanceId": "i-087711ddaf98f9489", "State": "associating", "AssociationId": "iip-assoc-09654be48e33b91e0", "IamInstanceProfile": { "Id": "AIPAJCJEDKX7QYHWYK7GS", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } }

或者,使用下列 Tools for Windows PowerShell 命令:

分離 IAM 角色

您可從運作中或停止的執行個體分離 IAM 角色。

New console

分離 IAM 角色和執行個體

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 動作安全性修改 IAM 角色

  4. 針對 IAM role (IAM 角色),選擇 No IAM Role (無 IAM 角色)。選擇 Save (儲存)。

  5. 在確認對話方塊中,輸入 Detach (分離),然後選擇 Detach (分離)

Old console

分離 IAM 角色和執行個體

  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Instances (執行個體)。

  3. 選取執行個體,選擇 Actions (動作)Instance Settings (執行個體設定)Attach/Replace IAM role (連接/取代 IAM 角色)

  4. 針對 IAM role (IAM 角色),選擇 No Role (無角色)。選擇 Apply (套用)。

  5. 在確認對話方塊中,選擇 Yes, Detach (是,分離)。

分離 IAM 角色和執行個體 (AWS CLI)

  1. 您可視需要使用 describe-iam-instance-profile-associations 來描述您的 IAM 執行個體描述檔關聯,並取得 IAM 執行個體描述檔欲分離的關聯 ID。

    aws ec2 describe-iam-instance-profile-associations

    回應範例

    { "IamInstanceProfileAssociations": [ { "InstanceId": "i-088ce778fbfeb4361", "State": "associated", "AssociationId": "iip-assoc-0044d817db6c0a4ba", "IamInstanceProfile": { "Id": "AIPAJEDNCAA64SSD265D6", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } ] }
  2. 使用 disassociate-iam-instance-profile 命令,透過關聯 ID 分離 IAM 執行個體描述檔。

    aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-0044d817db6c0a4ba

    回應範例

    { "IamInstanceProfileAssociation": { "InstanceId": "i-087711ddaf98f9489", "State": "disassociating", "AssociationId": "iip-assoc-0044d817db6c0a4ba", "IamInstanceProfile": { "Id": "AIPAJEDNCAA64SSD265D6", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } }

或者,使用下列 Tools for Windows PowerShell 命令:

根據存取活動產生 IAM 角色的政策

當您第一次為應用程式建立 IAM 角色時,有時可能會授予超出所需的許可。在生產環境中啟動應用程式之前,您可以根據 IAM 角色的存取活動產生 IAM 政策。IAM Access Analyzer 會審查您的 AWS CloudTrail 日誌並產生政策範本,它包含角色在指定日期範圍內所使用的許可。您可以使用範本建立具有精細許可的受管政策,然後將其連接至 IAM 角色。如此一來,您只會授予角色與特定使用案例的 AWS 資源互動所需的許可。這有助於您符合授予最低權限的最佳實務。若要進一步了解,請參閱 IAM 使用者指南中的根據存取活動產生政策