AWS新工具自动建议移除未使用的访问权限

New AWS tool recommends removal of unused permissions

某中心Web服务(AWS)身份和访问管理(IAM)策略为客户提供了在云环境中精细控制谁可以访问哪些资源的能力。这种控制通过仅授予执行特定任务所需的权限,帮助客户实施最小权限原则。然而在实践中,编写能够强制执行最小权限的IAM策略要求客户了解其应用程序运行需要哪些权限,这在应用程序规模增长时会变得具有挑战性。

为了帮助客户了解哪些权限是不必要的,在2023年的re:Invent大会上,某中心推出了IAM访问分析器未使用访问发现功能。IAM访问分析器会分析您的AWS账户以识别未使用的访问,并创建一个集中式仪表板来报告其发现。这些发现会突出显示未使用的角色以及IAM用户的未使用访问密钥和密码。对于活跃的IAM角色和用户,该功能提供了对未使用的服务和操作的可见性。

为了进一步推进这项服务,某中心于2024年6月发布了访问分析器中关于优化未使用权限的建议功能。此功能建议对客户的原始IAM策略进行优化,在保留策略结构的同时移除未使用的权限。这些建议不仅简化了未使用权限的移除过程,还帮助客户对精细权限实施了最小权限原则。

本文讨论了访问分析器策略建议如何基于未使用权限来建议策略优化,从而完成了从监控过于宽松的权限到优化它们的闭环。

策略建议实践

让我们通过一个示例来看看策略建议是如何工作的。假设您有一个附加到名为MyRole的IAM角色的以下IAM策略:

{
  "Version": "2012-10-17",
  "Statement": [
   {
      "Effect": "Allow",
      "Action": [
        "lambda:AddPermission",
        "lambda:GetFunctionConfiguration",
        "lambda:UpdateFunctionConfiguration",
        "lambda:UpdateFunctionCode",
        "lambda:CreateFunction",
        "lambda:DeleteFunction",
        "lambda:ListVersionsByFunction",
        "lambda:GetFunction",
        "lambda:Invoke*"
      ],
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-lambda"
   },
  {
    "Effect" : "Allow",
    "Action" : [
      "s3:Get*",
      "s3:List*"
    ],
    "Resource" : "*"
  }
 ]
}

上述策略包含两条策略声明:

  • 第一条声明允许对AWS Lambda(一项提供函数执行服务的AWS产品)中的某个函数执行操作。允许的操作通过列出单个操作以及通配符字符串 lambda:Invoke* 来指定,该通配符允许AWS Lambda中所有以Invoke开头的操作,例如 lambda:InvokeFunction
  • 第二条声明允许对任何Amazon Simple Storage Service (S3) 存储桶执行操作。操作通过两个通配符字符串指定,表示该声明允许Amazon S3中以Get或List开头的操作。

启用访问分析器的未使用发现功能将为您提供一份发现列表,每条发现详细说明了特定角色在操作级别未使用的权限。例如,对于附加了上述策略的角色,如果访问分析器发现任何被允许但未使用的AWS Lambda或Amazon S3操作,它将会把它们显示为未使用权限。

未使用权限定义了一个被IAM策略允许但该角色未使用的操作列表。这些操作特定于一个命名空间,这是一组聚集在一起并与其它命名空间隔离的资源,以提高安全性。以下是一个JSON格式的示例,显示了为我们之前附加的策略对应的MyRole发现的未使用权限:

[
 {
    "serviceNamespace": "lambda",
    "actions": [
      "UpdateFunctionCode",
      "GetFunction",
      "ListVersionsByFunction",
      "UpdateFunctionConfiguration",
      "CreateFunction",
      "DeleteFunction",
      "GetFunctionConfiguration",
      "AddPermission"
    ]
  },
  {
    "serviceNamespace": "s3",
    "actions": [
        "GetBucketLocation",
        "GetBucketWebsite",
        "GetBucketPolicyStatus",
        "GetAccelerateConfiguration",
        "GetBucketPolicy",
        "GetBucketRequestPayment",
        "GetReplicationConfiguration",
        "GetBucketLogging",
        "GetBucketObjectLockConfiguration",
        "GetBucketNotification",
        "GetLifecycleConfiguration",
        "GetAnalyticsConfiguration",
        "GetBucketCORS",
        "GetInventoryConfiguration",
        "GetBucketPublicAccessBlock",
        "GetEncryptionConfiguration",
        "GetBucketAcl",
        "GetBucketVersioning",
        "GetBucketOwnershipControls",
        "GetBucketTagging",
        "GetIntelligentTieringConfiguration",
        "GetMetricsConfiguration"
    ]
  }
]

这个示例显示了在AWS Lambda和Amazon S3中未使用但被我们之前指定的策略允许的操作。

您如何优化原始策略以移除未使用的权限并实现最小权限?一种选择是手动分析。您可能会想象以下过程:

  1. 找到允许未使用权限的声明;
  2. 通过参考未使用权限从这些声明中移除单个操作。

然而,在处理大型策略和冗长的未使用权限列表时,这个过程可能容易出错。此外,当策略中包含通配符字符串时,从它们中移除未使用权限需要仔细研究应该用哪些操作来替换这些通配符字符串。

策略建议功能会自动为客户完成这种优化!
以下是访问分析器在从上述策略中移除未使用操作后建议的策略(下图也显示了原始策略和修订后策略之间的差异):

{
  "Version": "2012-10-17",
  "Statement" : [
   {
      "Effect" : "Allow",
      "Action" : [
-       "lambda:AddPermission",
-       "lambda:GetFunctionConfiguration",
-       "lambda:UpdateFunctionConfiguration",
-       "lambda:UpdateFunctionCode",
-       "lambda:CreateFunction",
-       "lambda:DeleteFunction",
-       "lambda:ListVersionsByFunction",
-       "lambda:GetFunction",
        "lambda:Invoke*"
      ],
      "Resource" : "arn:aws:lambda:us-east-1:123456789012:function:my-lambda"
    },
    {
     "Effect" : "Allow",
     "Action" : [
-      "s3:Get*",
+      "s3:GetAccess*",
+      "s3:GetAccountPublicAccessBlock",
+      "s3:GetDataAccess",
+      "s3:GetJobTagging",
+      "s3:GetMulti*",
+      "s3:GetObject*",
+      "s3:GetStorage*",
       "s3:List*"
     ],
     "Resource" : "*"
   }
  ]
}

让我们看看每条策略声明发生了什么变化。

  • 对于第一条声明,策略建议移除了所有单独列出的操作(例如 lambda:AddPermission),因为它们出现在未使用权限中。由于没有任何未使用权限以 lambda:Invoke 开头,所以建议保留 lambda:Invoke* 不变。
  • 对于第二条声明,让我们重点关注原始策略中出现的通配符 s3:Get*。许多操作都可以以 s3:Get 开头,但只有一部分显示在未使用权限中。因此,不能简单地将 s3:Get* 从策略中移除。相反,建议的策略将 s3:Get* 替换为七个以 s3:Get 开头但未被报告为未使用的操作。

其中一些操作(例如 s3:GetJobTagging)是单个操作,而另一些则包含通配符(例如 s3:GetAccess*s3:GetObject*)。手动替换修订后策略中的 s3:Get* 的一种方法是列出所有以 s3:Get 开头的操作,除了未使用的那些。然而,这将导致策略变得冗长,因为以 s3:Get 开头的操作超过50个。

相反,策略建议会找到使用通配符来合并多个操作的方法,输出诸如 s3:GetAccess*s3:GetMulti* 这样的操作。得益于这些通配符,建议的策略既简洁,又仍然允许所有未被报告为未使用的以 s3:Get 开头的操作。

深入探讨:操作如何被通配符化

策略建议遵循“最不一般泛化”的数学原则——即找到建议策略的最不宽松的修改,该修改仍然允许原始策略允许的所有操作。这种基于定理的方法保证了修改后的策略仍然允许原始策略授予的、且未被报告为未使用的所有且仅有的权限。

为了实现针对未使用权限的最不一般泛化,我们构建了一种称为字典树(Trie)的数据结构。字典树是一种树形结构,其中每个节点都扩展了一个与通过树的路径相对应的令牌序列。在我们的案例中,节点代表操作之间共享的前缀,并有一个特殊的标记用于表示在未使用权限中报告的操作。通过遍历字典树,我们找到不包含未使用操作的最短前缀字符串。

下图展示了一个简化的字典树,描述了可以替换原始策略中S3 Get*通配符的操作(为清晰起见,我们省略了一些操作):

从高层次看,该字典树代表了某些可能以 s3:Get 开头的操作所共享的前缀。其根节点代表前缀 Get;根节点的子节点将它们的后缀附加到 Get 上。例如,名为 Multi 的节点代表所有以 GetMulti 开头的操作。

我们说一个节点是安全的(在图中用绿色表示),如果没有未使用操作以该节点对应的前缀开头;否则,它就是不安全的(用橙色表示)。例如,节点 s3:GetBucket 是不安全的,因为操作 s3:GetBucketPolicy 是未使用的。同样,节点 GetAccess 是安全的,因为没有未使用权限以 GetAccess 开头。

我们希望最终策略只包含对应于安全节点的通配符操作,并且我们希望包含足够多的安全节点以允许所有已使用的操作。我们通过选择对应于最短安全前缀的节点来实现这一点——即那些节点本身是安全的,但其父节点不安全的节点。因此,建议的策略将 s3:Get* 替换为不包含未使用权限的最短前缀,例如 s3:GetAccess*s3:GetMulti*s3:GetJobTagging

这些最短的安全前缀共同构成了一项新策略,虽然句法上与原始策略相似,但它是移除未使用操作后产生的最不一般泛化。换句话说,我们并没有移除超出必要范围的操作。

您可以在访问分析器中找到如何开始使用未使用访问的
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2026-01-07 18:00  CodeShare  阅读(8)  评论(0)    收藏  举报