AWS Organizations服务控制策略现已全面支持IAM语言,解锁新可能

AWS宣布其Organizations服务控制策略现已全面支持IAM策略语言,包括条件语句、资源ARN和NotAction等元素,使权限管理更精确高效,同时降低了操作复杂性。

解锁新可能:AWS Organizations服务控制策略现已全面支持IAM语言

Amazon Web Service(AWS)最近宣布,AWS Organizations现在为服务控制策略(SCPs)提供了完整的AWS身份和访问管理(IAM)策略语言支持。通过此功能,您可以在Allow语句中使用条件、单个资源Amazon资源名称(ARN)和NotAction元素。此外,您现在可以在Action元素字符串的开头或中间使用通配符,并在SCPs的Allow和Deny语句中实现NotResource元素。此功能现已在AWS商业区和AWS GovCloud(US)区域全面可用。

在这篇博客文章中,我们将介绍一组新支持的SCP语言功能,这些功能简化了权限管理案例。这些增强功能实现了更直观和简洁的策略设计。我们探讨这些功能如何解决过去的限制,以减少操作开销并提高策略可读性。我们还展示了之前的实现方式,并提供了一个示例,说明新功能如何使意图更清晰、实现更简单。

新支持的元素概述

下表列出了支持的SCP语言元素及其用途和适用效果。以粗体显示的元素和效果表示新支持的功能。

元素 用途 支持的效果
Version 指定用于处理策略的语言语法规则 Allow, Deny
Statement 作为策略元素的容器。您可以在一个SCP中有多个语句 Allow, Deny
Statement ID (Sid) (可选)为语句提供友好名称 Allow, Deny
Effect 定义SCP语句是允许还是拒绝账户中IAM用户和角色的访问 Allow, Deny
Action 指定SCP允许或拒绝的AWS服务和操作 Allow, Deny
NotAction 指定豁免于SCP的AWS服务和操作。用于替代Action元素 Allow, Deny
Resource 指定SCP适用的AWS资源 Allow, Deny
NotResource 指定豁免于SCP的AWS资源。用于替代Resource元素 Allow, Deny
Condition 指定语句生效的条件 Allow, Deny

此外,您现在可以在Action或NotAction元素中的任何位置使用通配符*和?。以前,这些通配符只能单独使用或在元素末尾使用。例如,以下所有现在都是有效的:

  • “servicename:action*”
  • “servicename:*action”
  • “servicename:some*action”
  • “servicename:*”

探索新的SCP语言功能

让我们通过一些示例来探讨推荐的策略策略和最佳实践。

使用Deny与NotResource

您可以使用NotResource元素将策略应用于除明确列出的资源之外的所有资源。这对于实施具有范围例外的广泛默认拒绝策略特别有用,可以简化策略结构同时强制执行强边界。

示例1:

此示例的目标是强制执行资源边界,阻止访问组织外部的资源,除非是定义的一组服务拥有的资源。

  • 之前的实现:策略使用基于标签的方法来管理例外。它要求使用dp:exclude:resource:s3=true标记IAM主体,以授予对外部资源的访问权限。这在标签管理中产生了操作开销,并在标签应用不正确时引入了潜在的安全风险。
  • 改进的实现:支持Deny语句中的NotResource后,更新的SCP使用单个合并的Deny语句,拒绝除定义的AWS拥有资源集之外的操作。
不支持NotResource时的策略结构 支持NotResource后的策略结构
json<br/>{<br/> "Version": "2012-10-17",<br/> "Statement": [<br/> {<br/> "Sid": "EnforceResourcePerimeterAWSResourcesS3",<br/> "Effect": "Deny",<br/> "Action": "s3:GetObject",<br/> "Resource": "*",<br/> "Condition": {<br/> "StringNotEqualsIfExists": {<br/> "aws:ResourceOrgID": "<my-org-id>",<br/> "aws:PrincipalTag/dp:exclude:resource:s3": "true"<br/> }<br/> }<br/> }<br/> ]<br/>}<br/> json<br/>{<br/> "Version": "2012-10-17",<br/> "Statement": [<br/> {<br/> "Sid": "EnforceResourcePerimeterAWSResources",<br/> "Effect": "Deny",<br/> "Action": "s3:GetObject",<br/> "NotResource": [<br/> "arn:aws:s3:::service-owned-bucket/*",<br/> "arn:aws:s3:::service-owned-bucket2/*"<br/> ],<br/> "Condition": {<br/> "StringNotEquals": {<br/> "aws:ResourceOrgID": "<org-id>"<br/> } <br/> }<br/> }<br/> ]<br/>}<br/>

示例2:

此示例拒绝访问Amazon Bedrock模型,除了一个特定模型。

  • 在此更改之前:SCP依赖于组织内AWS账户的广泛权限基线,默认允许访问Amazon Bedrock操作,同时明确拒绝调用三个特定模型(例如:Deepseek、Anthropic和meta)。然而,这种方法需要持续的操作开销,以确保策略更新以拒绝访问新添加的模型,避免暴露于可能不需要的模型。
  • 改进的实现:支持Deny语句中的NotResource后,更新的SCP使用单个合并的Deny语句,拒绝除Amazon模型之外的操作。
不支持NotResource时的策略结构 支持NotResource后的策略结构
json<br/>{<br/> "Version": "2012-10-17",<br/> "Statement": [<br/> {<br/> "Effect": "Allow",<br/> "Action": "bedrock:*",<br/> "Resource": "*"<br/> },<br/> {<br/> "Effect": "Deny",<br/> "Action": [<br/> "bedrock:InvokeModel",<br/> "bedrock:InvokeModelWithResponseStream",<br/> "bedrock:PutFoundationModelEntitlement"<br/> ],<br/> "Resource": [<br/> "arn:aws:bedrock:*::foundation-model/deepseek.*",<br/> "arn:aws:bedrock:*::foundation-model/anthropic.*",<br/> "arn:aws:bedrock:*::foundation-model/meta.*"<br/> ]<br/> }<br/> ]<br/>}<br/> json<br/>{<br/> "Version": "2012-10-17",<br/> "Statement": [<br/> {<br/> "Effect": "Allow",<br/> "Action": "bedrock:*",<br/> "Resource": "*"<br/> },<br/> {<br/> "Sid": "Statement1",<br/> "Effect": "Deny",<br/> "Action": [<br/> "bedrock:InvokeModel",<br/> "bedrock:InvokeModelWithResponseStream",<br/> "bedrock:PutFoundationModelEntitlement"<br/> ],<br/> "NotResource": [<br/> "arn:aws:bedrock:*::foundation-model/amazon.*"<br/> ]<br/> }<br/> ]<br/>}<br/>

使用带条件的Allow

通过使用Condition元素,您可以指定策略语句生效的情况。虽然此元素是可选的,但现在在SCPs中的Allow语句中受支持,实现了更精确和可扩展的访问控制。

注意:在大多数情况下,我们建议在编写SCPs时使用显式Deny语句。使用Deny语句有助于确保每个控制独立工作并保持可执行性。仅依赖allow语句和隐式的默认拒绝模型可能导致意外访问,因为更广泛或重叠的Allow语句可能覆盖更严格的语句。

以下示例允许在特定AWS区域中访问特定AWS服务。

  • 在此更改之前:策略在Sid: AllowSpecificServices下使用单个Allow语句。它在Action元素中列出了广泛的服务级别操作(例如,“ec2:"、“s3:“等),并将它们应用于所有资源(“Resource”: “*")。由于AWS SCPs在默认拒绝模型下运行,此设置有效地允许列出的服务中的操作,同时隐式拒绝未包含的其他服务的访问。例如,显式Deny使用区域条件限制在us-east-1、us-west-2和eu-central-1之外的操作。
  • 改进的实现:在更新的示例中,策略允许相同的服务,但仅当它们在特定区域(例如,“us-east-1”、“us-west-2"和"eu-central-1”)中请求时。这是通过在Allow语句中使用aws:RequestedRegion条件键实现的。此增强功能允许组织保留基本的Allow逻辑,同时引入上下文边界——例如按区域、账户或资源标签限制访问——这在以前只能通过Deny条件实现。

注意:我们建议在策略中使用一个广泛的Allow语句和多个有针对性的Deny语句。避免编写可能重叠的额外Allow语句,因为这样做可能导致意外访问。推荐的方法是首先使用广泛的Allow语句,然后使用Deny语句来细化和限制访问。

不支持带条件的Allow时的策略结构 支持带条件的Allow后的策略结构
json<br/>{<br/> "Version":"2012-10-17",<br/> "Statement":[<br/> {<br/> "Sid":"AllowSpecificServices",<br/> "Effect":"Allow",<br/> "Action":[<br/> "ec2:*",<br/> "s3:*",<br/> "rds:*",<br/> "lambda:*",<br/> "cloudformation:*",<br/> "iam:*",<br/> "cloudwatch:*"<br/> ],<br/> "Resource":"*"<br/> },<br/> {<br/> "Sid":"AllowAccessOnlyTo3Regions",<br/> "Effect":"Deny",<br/> "Action":"*",<br/> "Resource":"*",<br/> "Condition":{<br/> "StringNotEquals":{<br/> "aws:RequestedRegion":[<br/> "us-east-1",<br/> "us-west-2",<br/> "eu-central-1"<br/> ]<br/> }<br/> }<br/> }<br/> ]<br/>}<br/> json<br/>{<br/> "Version": "2012-10-17",<br/> "Statement": [<br/> {<br/> "Sid": "AllowServicesBasedOnRegion",<br/> "Effect": "Allow",<br/> "Action": [<br/> "ec2:*",<br/> "s3:*",<br/> "rds:*",<br/> "lambda:*",<br/> "cloudformation:*",<br/> "iam:*",<br/> "cloudwatch:*"<br/> ],<br/> "Resource": "*",<br/> "Condition": {<br/> "StringEquals": {<br/> "aws:RequestedRegion": [<br/> "us-east-1",<br/> "us-west-2",<br/> "eu-central-1"<br/> ]<br/> }<br/> }<br/> }<br/> ]<br/>}<br/>

其他新支持的元素

为了使SCPs完全支持IAM策略语言,现在支持其他元素。虽然技术上有效,但其中一些结构在实践中需要额外的考虑和测试,因为如果管理不当,它们可能导致意外访问。

新支持的功能 重要考虑事项
带通配符(*, ?)的Action 可以帮助缩短策略,但需谨慎使用——AWS添加的新操作将按设计匹配现有的通配符模式,可能授予意外权限。
带通配符(*, ?)的NotAction 我们建议将NotAction与Deny语句一起使用,如果您想拒绝除列出的操作之外的所有操作,这有助于使您的控制面向未来(例如,拒绝Amazon EC2中的所有操作,除了不匹配”vpn“的操作)。
带NotResource的Allow 用例有限。虽然受支持,但带NotResource的Allow默认包含所有资源——可能允许访问后来添加的新资源。请谨慎使用,并尽可能优先使用显式Deny语句。
带NotAction的Allow 用例有限。虽然受支持,但带NotAction的Allow可能无意中允许访问AWS添加的新操作。请谨慎使用,并优先使用显式Deny语句以在服务演进时保持控制。
带除通配符”*“之外的Resource的Allow 当使用特定资源(非”*")的Allow时,请确保您的策略设计避免冲突或重叠的Allow语句。首先使用广泛的Allow,然后使用有针对性的Deny语句来限制访问——这有助于防止重叠Allow语句导致的意外访问。

使用IAM Access Analyzer验证您的策略

您可以使用AWS IAM Access Analyzer在应用SCPs之前验证它们,使用策略验证和自定义策略检查。

IAM Access Analyzer根据IAM策略语法和最佳实践验证您的策略。您可以查看策略验证检查结果,包括安全警告、错误、一般警告和建议。这些发现提供了可操作的建议,帮助您编写既功能齐全又符合安全最佳实践的策略。

自定义策略检查是IAM Access Analyzer的一项功能,安全团队可以使用它来帮助准确、主动地识别其策略中的关键权限。自定义策略检查可以确定新版本的策略是否比以前的版本更宽松。它们使用自动推理——一种静态分析形式——在云中提供更高级别的安全保证。

自定义策略检查可以嵌入到持续集成和持续交付(CI/CD)流水线中,因此可以在不部署策略的情况下检查策略。开发人员还可以从其本地开发环境运行自定义策略检查,并快速收到关于他们编写的策略是否符合组织安全标准的反馈。有关更多信息,请参阅介绍IAM Access Analyzer自定义策略检查。

结论

AWS服务控制策略的最新增强提高了策略的表达能力和精确性,同时减少了操作工作量。通过启用诸如带条件的Allow和特定资源ARN、支持Deny语句中的NotResource以及扩展通配符灵活性等构造,您可以简化策略,并避免分层或复杂的策略来实现目标。这些更新使SCPs与IAM策略功能保持一致,并使组织能够实施更清晰、更直观的访问控制。作为最佳实践,重要的是谨慎使用这些功能——特别是通配符使用——以避免在AWS服务演进时出现意外权限。我们还鼓励实施显式Deny语句作为最佳实践,并在需要时使用Allow语句。

如果您对此帖子有反馈,请在下面的评论部分提交评论。如果您对此帖子有疑问,请联系AWS支持。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计