標記資源的 SCP 範例 - AWS Organizations

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

標記資源的 SCP 範例

需要在建立的指定資源上使用標籤

如果請求未包含指定的標籤,下列 SCP 可防止受影響帳戶中的 IAM 使用者和角色建立某些資源類型。

重要

請記得透過您在環境中使用的服務來測試拒絕型政策。下列範例是建立未標記機密或執行未標記 Amazon EC2 執行個體的簡單區塊,且不包含任何例外狀況。

以下範例政策與 AWS CloudFormation 不相容,因為該服務會建立一個機密,然後將其標記為兩個單獨的步驟。此範例政策會有效阻止 AWS CloudFormation 建立機密作為堆疊的一部分,因為這樣的動作會導致未根據需要標記的機密。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCreateSecretWithNoProjectTag", "Effect": "Deny", "Action": "secretsmanager:CreateSecret", "Resource": "*", "Condition": { "Null": { "aws:RequestTag/Project": "true" } } }, { "Sid": "DenyRunInstanceWithNoProjectTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Null": { "aws:RequestTag/Project": "true" } } }, { "Sid": "DenyCreateSecretWithNoCostCenterTag", "Effect": "Deny", "Action": "secretsmanager:CreateSecret", "Resource": "*", "Condition": { "Null": { "aws:RequestTag/CostCenter": "true" } } }, { "Sid": "DenyRunInstanceWithNoCostCenterTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Null": { "aws:RequestTag/CostCenter": "true" } } } ] }

如需所有服務的清單,及其在 AWS Organizations SCP 和 IAM 許可政策中支援的動作,請參閱 IAM 使用者指南中的AWS 服務的動作、資源和條件索引鍵

防止標籤被授權委託人以外的人員修改

下列 SCP 顯示政策如何僅允許授權委託人修改連接至您資源的標籤。這是使用以屬性為基礎的存取控制 (ABAC) 作為 AWS 雲端安全策略的重要部分。該政策允許呼叫者僅修改以下資源上的標籤︰其授權標籤 (在本例中為 access-project) 與連接至發出請求的使用者或角色的相同授權標籤完全相符。該政策也會防止授權使用者變更用於授權的標籤。呼叫委託人必須具有授權標籤,才能完全進行任何變更。

該政策只會阻止未經授權的使用者變更標記。未被此政策封鎖的授權使用者仍必須具有單獨的 IAM 政策,明確授予相關標記 API 上的 Allow 許可。舉例來說,如果您的使用者具有Allow */*的管理員政策 (允許所有服務和所有操作),則組合會導致允許管理員使用者變更以下標籤︰具有與連接至使用者委託人的授權標籤值相符的授權標籤值。這是因為該政策中的明確Deny會覆寫管理員政策中的明確Allow

重要

這並非完整的政策解決方案,不得如下所示使用。此範例僅用於說明 ABAC 策略的一部分,且需要針對生產環境進行自訂與測試。

如需完整的政策及其運作方式的詳細分析,請參閱AWS Organizations中的使用服務控制政策來保護用於授權的資源標籤

請記得透過您在環境中使用的服務來測試拒絕型政策。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyModifyTagsIfResAuthzTagAndPrinTagDontMatch", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "ec2:ResourceTag/access-project": "${aws:PrincipalTag/access-project}", "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "Null": { "ec2:ResourceTag/access-project": false } } }, { "Sid": "DenyModifyResAuthzTagIfPrinTagDontMatch", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestTag/access-project": "${aws:PrincipalTag/access-project}", "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "ForAnyValue:StringEquals": { "aws:TagKeys": [ "access-project" ] } } }, { "Sid": "DenyModifyTagsIfPrinTagNotExists", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "Null": { "aws:PrincipalTag/access-project": true } } } ] }