授與自我管理許可 - AWS CloudFormation

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

授與自我管理許可

本主題說明如何建立 StackSets 所需的 IAM 服務角色,以跨帳戶部署,並AWS 區域具有自我管理許可。需要這些角色,才能在您用來管理 StackSet 的帳戶與堆疊執行個體部署目的地帳戶之間建立信任關係。使用此許可模型,StackSets 可以部署到AWS 帳戶您擁有建立 IAM 角色許可的任何 。

若要使用服務受管許可,請改為參閱 啟用受信任存取

自我管理許可概觀

建立具有自我管理許可的 StackSet 之前,必須在每個帳戶中建立 IAM 服務角色。

基本步驟為:

  1. 決定哪個AWS 帳戶是管理員帳戶

    StackSets 是在此管理員帳戶中建立。您在目標帳戶中建立屬於 StackSet 的個別堆疊。

  2. 決定您要如何建構 StackSet 的許可。

    最簡單 (也是最寬鬆) 的許可組態,是賦予管理員帳戶中所有使用者和群組建立和更新由該帳戶管理之所有 StackSets 的能力。如果您需要更精確的控制,可以設定許可來指定:

    • 哪些使用者和群組可以在哪些目標帳戶中執行 StackSet 操作。

    • 哪些資源使用者和群組可以包含在他們的 StackSets 中。

    • 哪些特定 StackSet 操作的使用者和群組可以執行。

  3. 在您的管理員和目標帳戶中建立必要的 IAM 服務角色以定義您要的許可。

    具體而言,這兩個必要角色為:

    • AWSCloudFormationStackSetAdministrationRole – 此角色已部署至管理員帳戶。

    • AWSCloudFormationStackSetExecutionRole – 此角色已部署至您建立堆疊執行個體的所有帳戶。

為管理員帳戶的所有使用者提供可以在所有目標帳戶中管理堆疊的許可

本節展示如何為管理員帳戶的所有使用者和群組設定可在所有目標帳戶中執行 StackSet 操作的許可。它會引導您在管理員和目標帳戶中建立所需 IAM 服務角色。管理員帳戶中的任何人則可以在任何目標帳戶中建立、更新或刪除任何堆疊。

若以此方式建構許可,使用者在建立或更新 StackSet 時,將不會傳遞管理員角色。

然後,管理員帳戶中的任何使用者均可在設定信任關係後,在目標帳戶中建立任何 StackSet。
Administrator account

在管理員帳戶中,建立名為 AWSCloudFormationStackSetAdministrationRole 的 IAM 角色。

您可以從 CloudFormation 範本建立堆疊以執行此作業,此範本位於 https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml

範例許可政策

上述範本建立的管理角色包含了下列許可政策。

{ "Version":"2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole" ], "Effect": "Allow" } ] }
範例信任政策 1

上述範本也包含了下列信任政策,授予使用管理角色的服務許可,以及連接至角色的許可。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
範例信任政策 2

若要將堆疊執行個體部署到位於預設為停用之區域的目標帳戶中,您也必須包含該區域的區域服務主體。每個預設停用的區域都會有自己的區域服務主體。

下列範例信任政策授予服務許可,以使用亞太區域 (香港) 區域 (ap-east-1) 中的管理角色,該區域預設為停用。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "cloudformation.amazonaws.com", "cloudformation.ap-east-1.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

如需詳細資訊,請參閱在預設停用的 AWS 區域 中準備執行 StackSet 操作。如需區域代碼清單,請參閱《AWS 一般參考 指南》中的區域端點

Target accounts

在每個目標帳戶中,建立信任管理員帳戶且名為 AWSCloudFormationStackSetExecutionRole 的服務角色。此角色必須具有此確切名稱。您可以從下列 CloudFormation 範本建立堆疊以執行此作業,此範本位於 https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetExecutionRole.yml。當您使用此範本時,系統會提示您提供管理員帳戶的帳戶 ID,而且您的目標帳戶必須擁有與此管理員帳戶的信任關係。

重要

請注意,此範本會授予管理員存取。在您使用此範本建立目標帳戶執行角色之後,您必須在政策陳述式中,將許可的範圍限制在您使用 StackSets 所建立的資源類型。

目標帳戶服務角色需要許可,以執行您 CloudFormation 範本中指定的任何操作。例如,如果您的範本是建立 S3 儲存貯體,則您需要為 S3 建立新物件的許可。您的目標帳戶一律需要完整的 CloudFormation 許可,包括用於建立、更新、刪除及描述堆疊的許可。

範例許可政策 1

此範本建立的角色可在目標帳戶中啟用以下政策。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }
範例許可政策 2

以下範例顯示的政策陳述式提供 StackSets 運作時所需的最低許可。若要在目標帳戶中建立使用 CloudFormation 以外服務資源的堆疊,您必須將這些服務動作和資源新增至每個目標帳戶的 AWSCloudFormationStackSetExecutionRole 政策陳述式。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": "*" } ] }
範例信任政策

以下信任關係是由範本所建立的。管理員帳戶的 ID 會顯示為 admin_account_id

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

您可以設定現有目標帳戶執行角色的信任關係,以信任管理員帳戶中的特定角色。如果您刪除管理員帳戶中的該角色,並建立一個新角色來取代它,您必須設定您的目標帳戶與新管理員帳戶角色 (在前述範例中以 admin_account_id 表示) 的信任關係。

設定 StackSet 操作的進階許可

如果您需要對使用者和群組透過單一系統管理員帳戶建立的 StackSets 進行更精細的控制,您可以使用 IAM 角色來指定:

  • 哪些使用者和群組可以在哪些目標帳戶中執行 StackSet 操作。

  • 哪些資源使用者和群組可以包含在他們的 StackSets 中。

  • 哪些特定 StackSet 操作的使用者和群組可以執行。

控制哪些使用者可在特定目標帳戶中執行 StackSet 操作

使用自訂的管理員角色,以控制哪些使用者和群組可執行哪些目標帳戶中的 StackSet 操作。您可能會想要控制管理員帳戶的哪些使用者可執行哪些目標帳戶中的 StackSet 操作。若要這樣做,您要在每個目標帳戶與特定自訂的管理角色之間建立信任關係,而非在管理員帳戶本身建立 AWSCloudFormationStackSetAdministrationRole 服務角色。然後,您讓特定使用者和群組在執行特定目標帳戶中的 StackSet 操作時,使用適當的自訂管理角色。

例如,您可以在管理員帳戶中建立角色 A 和角色 B。您可以提供角色 A 透過帳戶 8 以存取目標帳戶 1 的許可。您可以提供角色 B 透過帳戶 16 以存取目標帳戶 9 的許可。

讓使用者能建立 StackSet 的自訂管理員角色與目標帳戶之間的信任關係。

設定與定義自訂管理員角色相關的必要許可,為目標帳戶建立服務角色,並授予使用者許可,以便在執行 StackSet 操作時傳遞自訂管理員的角色。

一般而言,一旦有了必要的許可,其運作方式為:在建立 StackSet 時,使用者必須指定自訂管理角色。使用者必須具有將該角色傳遞至 CloudFormation 的許可。此外,自訂管理員角色必須擁有與為 StackSet 指定之目標帳戶的信任關係。CloudFormation 建立 StackSet,並建立其與自訂管理員角色的關聯。更新 StackSet 時,使用者必須明確指定自訂管理員角色,即使先前對此 StackSet 使用相同的自訂管理角色也是一樣。CloudFormation 將依據上述要求,使用該角色來更新堆疊。

Administrator account
範例許可政策

對於每個 StackSet,建立自訂管理角色以及擔任目標帳戶中執行角色的許可。

每個目標帳戶中目標帳戶執行角色的名稱必須相同。若角色名稱為 AWSCloudFormationStackSetExecutionRole,則 StackSets 會在建立 StackSet 時自動使用該名稱。若您指定自訂角色名稱,使用者在建立 StackSet 時必須提供執行角色名稱。

使用下列許可政策,以自訂名稱建立 IAM 服務角色。下列範例中,Custom_execution_role 是指目標帳戶中的執行角色。

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

若要在單一陳述式中指定多個帳戶,請用逗號分隔。

"Resource": [ "arn:aws:iam::target_account_id_1:role/custom_execution_role", "arn:aws:iam::target_account_id_2:role/custom_execution_role" ]

您可使用萬用字元 (*) 而不是帳戶 ID 來指定所有目標帳戶。

"Resource": [ "arn:aws:iam::*:role/custom_execution_role" ]
範例信任政策 1

您必須為服務角色提供信任政策,以定義哪些 IAM 主體可擔任該角色。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
範例信任政策 2

若要將堆疊執行個體部署到位於預設為停用之區域的目標帳戶中,您也必須包含該區域的區域服務主體。每個預設停用的區域都會有自己的區域服務主體。

下列範例信任政策授予服務許可,以使用亞太區域 (香港) 區域 (ap-east-1) 中的管理角色,該區域預設為停用。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "cloudformation.amazonaws.com", "cloudformation.ap-east-1.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

如需詳細資訊,請參閱在預設停用的 AWS 區域 中準備執行 StackSet 操作。如需區域代碼清單,請參閱《AWS 一般參考指南》中的區域端點

範例 傳遞角色政策範例

您也需要為您的 IAM 使用者制定 IAM 許可政策,以允許使用者在執行 StackSet 操作時傳遞自訂管理角色。如需詳細資訊,請參閱授予使用者將角色傳遞至 AWS 服務

在以下範例中,customized_admin_role 是指使用者必須傳遞的管理員角色。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::*:role/customized_admin_role" } ] }
Target accounts

在每個目標帳戶中,建立信任您要在此帳戶使用之自訂管理角色的服務角色。

目標帳戶服務角色需要許可,以執行您 CloudFormation 範本中指定的任何操作。例如,如果您的範本是建立 S3 儲存貯體,則您需要在 S3 中建立新物件的許可。您的目標帳戶一律需要完整的 CloudFormation 許可,包括用於建立、更新、刪除及描述堆疊的許可。

每個目標帳戶中目標帳戶角色的名稱必須相同。若角色名稱為 AWSCloudFormationStackSetExecutionRole,則 StackSets 會在建立 StackSet 時自動使用該名稱。若您指定自訂角色名稱,使用者在建立 StackSet 時必須提供執行角色名稱。

範例許可政策

以下範例顯示的政策陳述式提供 StackSets 運作時所需的最低許可。若要在目標帳戶中建立使用 CloudFormation 以外服務資源的堆疊,您必須將這些服務動作和資源新增至許可政策。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": "*" } ] }
範例信任政策

當您建立角色以定義信任關係時,必須提供以下信任政策。

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

控制使用者可以在特定 StackSets 中包含的資源

使用自訂的執行角色來控制哪些資源堆疊使用者和群組可以包含在其 StackSets 中。例如,您可能想要設定一個群組,只包含他們建立的 StackSets 中與 Amazon S3 相關的資源,而另一個團隊只要包含 DynamoDB 資源。若要這樣做,您要在每個群組的自訂管理員角色與每個資源集的自訂執行角色之間建立信任關係。自訂的執行角色定義了 StackSets 中可以包含哪些堆疊資源。自訂的管理員的角色位於管理員帳戶中,而自訂的執行角色位於每個目標帳戶中 (您要在目標帳戶中使用定義的資源建立 StackSets)。然後,您啟用特定使用者和群組,以便在執行 StackSets 操作時使用適當的自訂管理角色。

例如,您可以在管理員帳戶中建立自訂的管理員角色 A、B、C。具有角色 A 使用許可的使用者和群組,可以建立包含自訂執行角色 X 中具體列出的堆疊資源的 StackSets,但不包含角色 Y 或 Z 的堆疊資源或任何執行角色不包含的資源。

讓使用者能建立 StackSet 的自訂管理員角色與目標帳戶中自訂執行角色之間的信任關係。

更新 StackSet 時,使用者必須明確指定自訂管理員角色,即使先前對此 StackSet 使用相同的自訂管理角色也是一樣。CloudFormation 會使用指定的自訂管理員角色來執行更新,只要使用者具有在該 StackSet 上執行操作的許可。

同樣地,使用者也可以指定自訂的執行角色。如果指定自訂執行角色,CloudFormation 將依據上述要求,使用該角色更新堆疊。如果使用者未指定自訂執行角色,CloudFormation 將使用之前與 StackSet 關聯之自訂執行角色執行更新,只要該使用者擁有在該 StackSet 上執行操作的許可。

Administrator account

在您的管理員帳戶中建立自訂的管理角色,如 控制哪些使用者可在特定目標帳戶中執行 StackSet 操作 中所述。加入您要使用的自訂管理角色與自訂執行角色之間的信任關係。

範例許可政策

以下範例會是許可政策,用於您為目標帳戶定義的 AWSCloudFormationStackSetExecutionRole 以及自訂的執行角色。

{ "Version":"2012-10-17", "Statement": [ { "Sid": "Stmt1487980684000", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole", "arn:aws:iam::*:role/custom_execution_role" ] } ] }
Target accounts

在您要建立 StackSets 的目標帳戶中,建立自訂執行角色,用來將許可授予您想讓使用者和群組可以包含在 StackSets 中的服務和資源。

範例許可政策

以下範例提供最低許可給 StackSets,以及建立 Amazon DynamoDB 資料表的許可。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "dynamoDb:createTable" ], "Resource": "*" } ] }
範例信任政策

當您建立角色以定義信任關係時,必須提供以下信任政策。

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

設定特定 StackSet 操作的許可

此外,您可以設定許可來控制哪些使用者和群組可以執行特定 StackSets 操作,例如建立、更新或刪除 StackSets 或堆疊執行個體。如需詳細資訊,請參閱服務授權參考中的 CloudFormation 的動作、資源和條件索引鍵

設定全域索引鍵以減輕混淆代理人問題

混淆代理人問題屬於安全性議題,其中沒有執行動作許可的實體可以強制具有更多許可的實體執行該動作。在 中AWS,跨服務模擬可能會導致混淆代理人問題。在某個服務 (呼叫服務) 呼叫另一個服務 (被呼叫服務) 時,可能會發生跨服務模擬。可以操縱呼叫服務來使用其許可,以其不應有存取許可的方式對其他客戶的資源採取動作。為了避免這種情況, AWS提供工具,協助您保護所有 服務的資料,讓服務主體能夠存取您帳戶中的資源。

我們建議在資源政策中使用 aws:SourceArnaws:SourceAccount全域條件內容索引鍵,以限制CloudFormationStackSets 為資源提供其他服務的許可。如果同時使用全域條件內容金鑰,則在相同政策陳述式中使用 aws:SourceAccount 值和 aws:SourceArn 值中的帳戶時,必須使用相同的帳戶 ID。

防範混淆代理人問題最有效的方法,是使用 aws:SourceArn 全域條件內容金鑰,以及資源的完整 ARN。如果不知道資源的完整 ARN,或者如果您指定了多個資源,請使用 aws:SourceArn 全域條件內容金鑰,同時使用萬用字元 (*) 表示 ARN 的未知部分。例如 arn:aws:cloudformation::123456789012:*。盡可能使用 aws:SourceArn,這更為具體。僅當您無法判斷正確的 ARN 或 ARN 模式時才使用 aws:SourceAccount

當 StackSets 在您的管理員帳戶中擔任管理角色時,StackSets 會填入您的管理員帳戶 ID 和 StackSets Amazon Resource Name (ARN)。因此,您可以定義信任關係中的全域索引鍵 aws:SourceAccountaws:SourceArn,以防止混淆代理人問題。下列範例示範如何使用 StackSets 中的 aws:SourceArnaws:SourceAccount 全域條件內容索引鍵,以預防混淆代理人問題。

Administrator account
範例 aws:SourceAccountaws:SourceArn 全域索引鍵

當使用 StackSets 時,在您的 AWSCloudFormationStackSetAdministrationRole 信任政策中定義 aws:SourceAccountaws:SourceArn 全域索引鍵,以防止混淆代理人問題。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "ArnLike": { "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:stackset/*" } } } ] }
範例 StackSets ARN

指定關聯的 StackSets ARN 以進行更精細的控制。

JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": [ "arn:aws:cloudformation:STACKSETS-REGION:111122223333:stackset/STACK-SET-ID-1", "arn:aws:cloudformation:STACKSETS-REGION:111122223333:stackset/STACK-SET-ID-2" ] } } } ] }