使用 控制 CloudFormation 存取 AWS Identity and Access Management - AWS CloudFormation

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

使用 控制 CloudFormation 存取 AWS Identity and Access Management

使用 AWS Identity and Access Management (IAM),您可以建立IAM使用者來控制誰可以存取 中的哪些資源 AWS 帳戶。您可以使用 IAM 搭配 AWS CloudFormation 來控制使用者可以使用 執行的動作 CloudFormation,例如他們是否可以檢視堆疊範本、建立堆疊或刪除堆疊。

除了 CloudFormation 動作之外,您還可以管理每個使用者可用的 AWS 服務和資源。如此一來,您就可以控制使用者在使用 時可存取的資源 CloudFormation。例如,您可以指定哪些使用者可以建立 Amazon EC2執行個體、終止資料庫執行個體或更新 VPCs。這些相同的許可會在他們 CloudFormation 用來執行這些動作時套用。

如需有關您可以控制存取的所有 服務的詳細資訊,請參閱 IAM 使用者指南 中的AWS 支援 的服務IAM

CloudFormation 動作

當您在 中建立群組或使用者時 AWS 帳戶,您可以將IAM政策與該群組或使用者建立關聯,以指定您要授予的許可。例如,假設您有一群項目層級的開發人員。您可以建立包含所有入門層級開發人員的初級應用程式開發人員群組。然後,您將政策與該群組建立關聯,讓使用者只能檢視 CloudFormation 堆疊。在此情況下,您可能有類似以下範例的政策:

範例 授予檢視堆疊許可的範例政策
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources" ], "Resource":"*" }] }

此政策會授予許可給 Action元素中列出的所有DescribeStackAPI動作。

重要

如果您不在陳述式中指定堆疊名稱或 ID,您也必須在 * 元素中使用 Resource 萬用字元,授予此許可使用動作的所有資源。

除了 CloudFormation 動作之外,建立或刪除堆疊的使用者還需要其他取決於堆疊範本的許可。例如,如果您有描述 Amazon SQS 佇列的範本,則使用者必須具有對應的許可,Amazon SQS動作才能成功建立堆疊,如下列範例政策所示:

範例 授予建立和檢視堆疊動作和所有 Amazon SQS動作的範例政策
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "sqs:*", "cloudformation:CreateStack", "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResources", "cloudformation:GetTemplate", "cloudformation:ValidateTemplate" ], "Resource":"*" }] }

如需您可以允許或拒絕的所有 CloudFormation 動作清單,請參閱AWS CloudFormation API參考

CloudFormation 主控台特定動作

使用 CloudFormation 主控台的使用者需要額外許可,而使用 AWS Command Line Interface 或 不需要這些許可 CloudFormation APIs。與 AWS CLI 和 相比API, 主控台提供需要額外許可的其他功能,例如範本上傳到 Amazon S3 儲存貯體和 AWS特定參數類型的下拉式清單。

針對下列所有動作授予所有資源的許可,不限制特定堆疊或儲存貯體的動作。

下列必要動作僅供 CloudFormation 主控台使用,不會記錄在API參考中。此動作允許使用者將範本上傳至 Amazon S3 儲存貯體。

cloudformation:CreateUploadBucket

當使用者上傳範本時,他們需要下列 Amazon S3 許可:

s3:PutObject s3:ListBucket s3:GetObject s3:CreateBucket

對於具有 AWS特定參數類型的範本,使用者需要許可才能進行對應的描述API呼叫。例如,如果範本包含AWS::EC2::KeyPair::KeyName參數類型,使用者需要呼叫EC2DescribeKeyPairs動作的許可 (這是主控台取得參數下拉式清單值的方式)。以下範例是使用者需要用於其他參數類型的動作:

ec2:DescribeSecurityGroups (for the AWS::EC2::SecurityGroup::Id parameter type) ec2:DescribeSubnets (for the Subnet::Id parameter type) ec2:DescribeVpcs (for the AWS::EC2::VPC::Id parameter type)

CloudFormation 資源

CloudFormation 支援資源層級許可,因此您可以指定特定堆疊的動作,如下列政策所示:

範例 拒絕刪除和更新 堆疊動作的範例政策 MyProductionStack
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Deny", "Action":[ "cloudformation:DeleteStack", "cloudformation:UpdateStack" ], "Resource":"arn:aws:cloudformation:us-east-1:123456789012:stack/MyProductionStack/*" }] }

上例中的政策在堆疊名稱結尾處使用萬用字元,所以完整的堆疊 ID (例如 arn:aws:cloudformation:us-east-1:123456789012:stack/MyProductionStack/abc9dbf0-43c2-11e3-a6e8-50fa526be49c) 和堆疊名稱 (例如 MyProductionStack) 會拒絕刪除堆疊和更新堆疊。

若要讓 AWS::Serverless 轉換建立變更集,政策應該包含 arn:aws:cloudformation:<region>:aws:transform/Serverless-2016-10-31 資源層級許可,如下列政策所示:

範例 允許針對轉換建立變更集動作的範例政策
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "cloudformation:CreateChangeSet" ], "Resource": "arn:aws:cloudformation:us-west-2:aws:transform/Serverless-2016-10-31" }] }

授與服務受管堆疊集許可的政策範例

以下是將服務受管堆疊集許可授予主體實體 (使用者、角色或群組) 的範例IAM政策。只有當堆疊集的範本包含 Amazon S3 資源類型 (AWS::S3::*) 或 AWS::SES::ConfigurationSet 資源類型時,具有此政策的使用者才能在堆疊集上執行操作。如果使用 ID 登入組織管理帳戶123456789012,使用者也只能對以 ID 為目標的 OU 堆疊集執行操作 ou-1fsfsrsdsfrewr、 和 只能對 ID 為 stack-set-id的堆疊集執行操作 AWS 帳戶 987654321012.

如果堆疊集範本包含政策中指定資源類型以外的其他資源類型,或者部署目標為 OU 或政策中指定用於對應管理帳戶和堆疊集的帳戶IDs以外的帳戶,則堆疊集操作會失敗。

只有在堆疊集操作以 us-east-1us-west-2eu-west-2 AWS 區域為目標時,才會套用這些政策限制。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": [ "arn:aws:cloudformation:*:*:stackset/*", "arn:aws:cloudformation:*:*:type/resource/AWS-S3-*", "arn:aws:cloudformation:us-west-2::type/resource/AWS-SES-ConfigurationSet", "arn:aws:cloudformation:*:123456789012:stackset-target/*/ou-1fsfsrsdsfrewr", "arn:aws:cloudformation:*:123456789012:stackset-target/stack-set-id/987654321012" ], "Condition": { "ForAllValues:StringEqualsIgnoreCase": { "cloudformation:TargetRegion": [ "us-east-1", "us-west-2", "eu-west-1" ] } } } ] }

CloudFormation 條件

在IAM政策中,您可以選擇指定條件,以控制政策何時生效。例如,您可以定義 政策,允許使用者僅在指定特定範本 時建立堆疊URL。您可以定義 CloudFormation特定條件和 AWS全局條件,例如 DateLessThan,指定政策何時停止生效。如需詳細資訊和 AWS全 條件清單,請參閱 IAM 使用者指南 中的IAM政策元素參考中的條件。

注意

請勿使用 aws:SourceIp AWS-wide condition. CloudFormation provisions 資源,方法是使用自己的 IP 地址,而不是原始請求的 IP 地址。例如,當您建立堆疊時, 會從其 IP 地址 CloudFormation 發出請求,以啟動 Amazon EC2執行個體或建立 Amazon S3 儲存貯體,而不是從CreateStack呼叫或create-stack命令的 IP 地址。

下列清單說明 CloudFormation特定的條件。這些條件只適用於使用者建立或更新堆疊時:

cloudformation:ChangeSetName

您要與政策建立關聯的 CloudFormation 變更集名稱。使用此條件控制 使用者可以執行或刪除的變更集。

cloudformation:ImportResourceTypes

您希望與政策建立關聯的範本資源類型,例如 AWS::EC2::Instance。使用此條件來控制 使用者在將資源匯入堆疊時,能夠使用的資源類型。此條件會針對使用者在 ResourcesToImport 參數中宣告的資源類型進行檢查,目前僅支援 AWS CLI 和 API請求。使用此參數時,您必須指定您希望使用者在匯入操作期間控制的所有資源類型。如需 ResourcesToImport 參數的詳細資訊,請參閱 CreateChangeSet AWS CloudFormation API參考 中的 動作。

如需可能的 清單ResourcesToImport,請參閱 資源類型支援

使用三段式資源命名慣例,以指定使用者可使用的資源類型,範圍大至整個組織的所有資源,小至個別的資源類型。

organization::*

指定給定組織的所有資源類型。

organization::service_name::*

指定給定組織內特定服務的所有資源類型。

organization::service_name::resource_type

指定特定的資源類型。

例如:

AWS::*

指定所有支援 AWS 的資源類型。

AWS::service_name::*

指定特定 AWS 服務的所有支援資源。

AWS::service_name::resource_type

指定特定 AWS 資源類型,例如 AWS::EC2::Instance(所有EC2執行個體)。

cloudformation:ResourceTypes

您希望與政策建立關聯的範本資源類型,例如 AWS::EC2::Instance。使用此條件控制 使用者在建立或更新堆疊時可以使用的資源類型。此條件會針對使用者在 ResourceTypes 參數中宣告的資源類型進行檢查,目前僅支援 AWS CLI 和 API請求。使用此參數時,使用者必須指定其範本中的所有資源類型。如需 ResourceTypes 參數的詳細資訊,請參閱 CreateStack AWS CloudFormation API參考 中的 動作。

如需資源類型的清單,請參閱 AWS 資源和屬性類型參考

使用三段式資源命名慣例,以指定使用者可使用的資源類型,範圍大至整個組織的所有資源,小至個別的資源類型。

organization::*

指定給定組織的所有資源類型。

organization::service_name::*

指定給定組織內特定服務的所有資源類型。

organization::service_name::resource_type

指定特定的資源類型。

例如:

AWS::*

指定所有支援 AWS 的資源類型。

AWS::service_name::*

指定特定 AWS 服務的所有支援資源。

AWS::service_name::resource_type

指定特定 AWS 資源類型,例如 AWS::EC2::Instance(所有EC2執行個體)。

Alexa::ASK::*

指定 Alexa Skill Kit 中的所有資源類型。

Alexa::ASK::Skill

指定個別 Alexa::ASK:Skill 資源類型。

Custom::*

指定所有自訂資源。

如需詳細資訊,請參閱使用自訂資源建立自訂佈建邏輯

Custom::resource_type

指定特定自訂資源類型。

如需詳細資訊,請參閱使用自訂資源建立自訂佈建邏輯

cloudformation:RoleARN

您要與政策建立關聯的IAM服務角色的 Amazon Resource Name (ARN)。使用此條件控制 使用者在使用堆疊或變更集時可以使用的服務角色。

cloudformation:StackPolicyUrl

URL 您要與政策建立關聯的 Amazon S3 堆疊政策。使用此條件控制 使用者可在建立或更新堆疊動作期間,與堆疊建立關聯的堆疊政策。如需堆疊政策的詳細資訊,請參閱避免更新堆疊資源

注意

為了確保使用者只能使用您上傳的堆疊政策建立或更新堆疊,請將 S3 儲存貯體設定為僅供這些使用者讀取。

cloudformation:TemplateUrl

您要與政策建立關聯的 URL Amazon S3 範本。使用此條件控制 使用者在建立或更新堆疊時可以使用的範本。

注意

為了確保使用者只能使用您上傳的範本建立或更新堆疊,請將 S3 儲存貯體設定為僅供這些使用者讀取。

注意

下列 CloudFormation特定條件適用於相同名稱的API參數:

  • cloudformation:ChangeSetName

  • cloudformation:RoleARN

  • cloudformation:StackPolicyUrl

  • cloudformation:TemplateUrl

例如, cloudformation:TemplateUrl僅適用於 CreateStackUpdateStackCreateChangeSetTemplateUrl 參數APIs。

範例

下列範例政策允許使用者僅使用 https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template 範本URL來建立或更新堆疊。

範例 範本URL條件
{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack", "cloudformation:UpdateStack" ], "Resource" : "*", "Condition" : { "StringEquals" : { "cloudformation:TemplateUrl" : [ "https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template" ] } } } ] }

下列範例政策允許使用者完成匯入 CloudFormation 操作以外的所有操作。

範例 匯入資源類型條件
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllStackOperations", "Effect": "Allow", "Action": "cloudformation:*", "Resource": "*" }, { "Sid": "DenyImport", "Effect": "Deny", "Action": "cloudformation:*", "Resource": "*", "Condition": { "ForAnyValue:StringLike": { "cloudformation:ImportResourceTypes": [ "*" ] } } } ] }

以下範例政策允許所有堆疊操作,以及僅限指定資源上的匯入操作 (在此範例中為 AWS::S3::Bucket)。

範例 匯入資源類型條件
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowImport", "Effect": "Allow", "Action": "cloudformation:*", "Resource": "*" "Condition": { "ForAllValues:StringEqualsIgnoreCase": { "cloudformation:ImportResourceTypes": [ "AWS::S3::Bucket" ] } } } ] }

下列範例政策允許使用者建立堆疊,但如果堆疊的範本包含來自 IAM服務的任何資源,則會拒絕請求。此政策也要求使用者指定 參數,該ResourceTypes參數僅適用於 AWS CLI 和 API請求。此政策使用明確拒絕陳述式,因此,如有其他政策授予額外許可,此政策一律有效 (明確拒絕陳述式一律覆寫明確允許陳述式)。

範例 資源類型條件
{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*" }, { "Effect" : "Deny", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*", "Condition" : { "ForAnyValue:StringLikeIfExists" : { "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ] } } }, { "Effect": "Deny", "Action" : [ "cloudformation:CreateStack" ], "Resource": "*", "Condition": { "Null": { "cloudformation:ResourceTypes": "true" } } } ] }

以下範例政策類似前述範例。此政策允許使用者建立堆疊,除非堆疊的範本包含來自 IAM服務的任何資源。它還要求使用者指定 參數,該ResourceTypes參數僅適用於 AWS CLI 和 API請求。此政策更為簡單,但不使用明確拒絕陳述式。授予額外許可的其他政策,可以覆寫此政策。

範例 資源類型條件
{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*", "Condition" : { "ForAllValues:StringNotLikeIfExists" : { "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ] }, "Null":{ "cloudformation:ResourceTypes": "false" } } } ] }

認可 CloudFormation 範本中的 IAM 資源

在建立堆疊之前, 會 CloudFormation 驗證您的範本。在驗證期間, 會 CloudFormation 檢查您的範本是否有可能建立IAM的資源。IAM 資源,例如具有完整存取權的使用者,可以存取和修改 中的任何資源 AWS 帳戶。因此,我們建議您先檢閱與每個IAM資源相關聯的許可,然後再繼續,以免無意中建立具有升級許可的資源。若要確保您已完成,您必須確認範本包含這些資源,並在建立堆疊之前提供 CloudFormation 指定的功能。

您可以使用 主控台、 AWS Command Line Interface (AWS CLI) 或 來 CloudFormation確認 CloudFormation 範本的功能API:

  • 在 CloudFormation 主控台的建立堆疊或更新堆疊精靈的設定堆疊選項頁面上,選擇我確認此範本可能會建立IAM資源

  • 在 中 AWS CLI,當您使用 create-stackupdate-stack 命令,指定 --capabilities選項的 CAPABILITY_IAMCAPABILITY_NAMED_IAM值。如果您的範本包含 IAM 資源,您可以指定任一功能。如果您的範本包含 IAM 資源的自訂名稱,您必須指定 CAPABILITY_NAMED_IAM

  • 在 中API,當您使用 CreateStackUpdateStack 動作,指定 Capabilities.member.1=CAPABILITY_IAMCapabilities.member.1=CAPABILITY_NAMED_IAM。如果您的範本包含 IAM 資源,您可以指定任一功能。如果您的範本包含 IAM 資源的自訂名稱,您必須指定 CAPABILITY_NAMED_IAM

重要

如果您的範本包含自訂具名IAM資源,請勿重複使用相同的範本建立多個堆疊。IAM 資源在您的帳戶中必須是全域唯一的。如果您使用相同的範本在不同區域中建立多個堆疊,您的堆疊可能會共用相同的IAM資源,而不是每個資源都有唯一的資源。在堆疊中共享資源可能會產生各種無法恢復的意外結果。例如,如果您刪除或更新某個堆疊中的共用IAM資源,您將無意中修改其他堆疊的資源。

管理在 Amazon EC2執行個體上執行之應用程式的憑證

如果您有應用程式在 Amazon EC2執行個體上執行,且需要向 Amazon S3 儲存貯體或 DynamoDB 資料表等 AWS 資源提出請求,則應用程式需要 AWS 安全憑證。不過,在每個您啟動的執行個體中分發和內嵌長期的安全憑證,是一項挑戰,同時可能有安全風險。我們建議您建立與執行個體啟動EC2時相關聯的IAM角色,而不是使用長期憑證,例如IAM使用者憑證。然後,應用程式可以從 Amazon EC2執行個體取得臨時安全憑證。您不必在執行個體上內嵌長期的憑證。此外,為了更輕鬆地管理憑證,您可以為多個 Amazon EC2執行個體指定單一角色;您不需要為每個執行個體建立唯一的憑證。

如需示範如何使用角色啟動執行個體的範本程式碼片段,請參閱 IAM角色範本範例

注意

使用臨時安全憑證的執行個體上的應用程式可以呼叫任何 CloudFormation 動作。但是,由於 與許多其他服務 CloudFormation AWS 互動,您必須驗證您要使用的所有服務是否支援臨時安全憑證。如需接受臨時安全憑證的服務清單,請參閱 IAM 使用者指南 中的AWS 使用 的服務IAM

授予暫時存取 (聯合身分存取)

在某些情況下,您可能想要授予沒有 AWS 憑證的使用者暫時存取您的 AWS 帳戶。使用 AWS Security Token Service (),而不是在您想要授予暫時存取權時建立和刪除長期憑證AWS STS。例如,您可以使用IAM角色。您可以從一個IAM角色以程式設計方式建立並分發許多臨時安全憑證 (包括存取金鑰、秘密存取金鑰和安全性權杖)。這些憑證的壽命有限,因此在過期 AWS 帳戶 後,就無法用來存取您的 。您也可以建立多個IAM角色,以授予個別使用者不同層級的許可。IAM 角色適用於聯合身分和單一登入等案例。

聯合身分是可以跨多個系統使用的獨特身分。對於具有已建立內部部署身分系統 (例如 LDAP或 Active Directory) 的企業使用者,您可以使用內部部署身分系統來處理所有身分驗證。使用者經過身分驗證後,您可以從適當的IAM使用者或角色提供臨時安全憑證。例如,您可以建立管理員角色和開發人員角色,其中管理員可以完整存取 AWS 帳戶,而開發人員可以只使用 CloudFormation 堆疊。管理員經過身分驗證後,管理員有權從管理員角色取得臨時安全憑證。不過,對於開發人員,他們只能從開發人員角色取得臨時安全憑證。

您也可以授予聯合使用者對 的存取權 AWS Management Console。使用者使用內部部署身分系統進行身分驗證後,您可以以程式設計方式建構暫時URL,以直接存取 AWS Management Console。當使用者使用臨時 時URL,他們不需要登入 , AWS 因為他們已經通過身分驗證 (單一登入)。此外,由於 URL是由使用者的臨時安全憑證所建置,因此這些憑證可用的許可會決定使用者在 中擁有的許可 AWS Management Console。

您可以使用數種不同的 AWS STS APIs 來產生臨時安全憑證。如需API使用哪些憑證的詳細資訊,請參閱 IAM 使用者指南 中的比較 AWS STS 憑證

重要

當您使用從 產生的臨時安全憑證IAM時,無法使用 GetFederationToken API。相反地,如果您需要使用 IAM,請使用角色的臨時安全憑證。

CloudFormation 會與許多 AWS 其他服務互動。當您將臨時安全憑證與 搭配使用時 CloudFormation,請確認您要使用的所有服務都支援臨時安全憑證。如需接受臨時安全憑證的服務清單,請參閱 IAM 使用者指南 中的AWS 使用 的服務IAM

如需詳細資訊,請參閱 IAM 使用者指南 中的下列相關資源: