AWS Organizations服务控制策略全面支持IAM语言,解锁权限管理新可能

AWS宣布服务控制策略(SCP)现已全面支持IAM策略语言,新增条件语句、NotResource元素和通配符等功能。本文通过具体策略示例展示如何简化权限管理,提高策略可读性,并介绍使用IAM Access Analyzer验证策略的最佳实践。

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

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

在本博文中,我们将介绍一系列新支持的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: 此示例的目标是强制执行资源边界,阻止访问组织外部的资源,但已定义的一组服务拥有资源除外。

之前的实现: 策略使用基于标签的方法来管理例外。它要求为IAM主体标记dp:exclude:resource:s3=true以授予对外部资源的访问权限。这给标签管理带来了操作开销,并且如果标签应用不正确,可能会引入安全风险。

改进的实现: 通过支持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通过默认允许访问Amazon Bedrock操作,同时明确拒绝调用三个特定模型(例如:Deepseek、Anthropic和meta),为组织内的AWS账户提供了广泛的权限基线。然而,这种方法需要持续的操作开销,以确保策略更新以拒绝访问新添加的模型,避免暴露于可能不需要的模型。

改进的实现: 通过支持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 设计