【问题标题】:How to update IAM Policy using Boto3 Python如何使用 Boto3 Python 更新 IAM 策略
【发布时间】:2018-11-28 20:12:43
【问题描述】:

我有一个 S3 存储桶读取策略:

   {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Effect":"Allow",
          "Action":["s3:GetObject"],
          "Resource":["arn:aws:s3:::examplebucket/*"]
        }
      ]
    }

根据创建新存储桶时的云跟踪日志,我正在创建一个将调用 Lambda 函数的事件。

能够读取策略的 json 并将新资源(存储桶)添加到同一策略。是否有要调用的直接 python API 将使用新资源更新现有 IAM 策略?

【问题讨论】:

  • 不,您需要更换政策。当然,您可以通过将当前策略加载到某种 JSON 感知代码中,插入当前缺少的内容,将更新后的策略作为字符串发出,然后用它更新 S3 策略。顺便说一下,这是您展示的 S3 策略,而不是 IAM 策略 - 它们看起来相似但不同(它有一个 Principal)。
  • 另一种方法是使用存储桶命名方案(例如foo-24)并授予Lambda 函数访问foo-* 的权限。这样您就不必每次都修改权限。或者,由于您总是为每个新存储桶添加权限,因此只需首先授予它对每个存储桶的访问权限,您就不必修改策略。
  • @jarmod ,感谢您指出现在已更改为 IAM 政策

标签: amazon-web-services amazon-s3 aws-lambda amazon-iam


【解决方案1】:

我找到了正确的做法:

您必须为现有策略创建一个策略版本(包括您的策略更改)并将其标记为默认值。因此,新版本将取代现有政策。

获取您现有的政策:

policy = iam.Policy('arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME)

从此策略获取 JSON:

policyJson = policy.default_version.document

随心所欲地改变它:

policyJson['Statement'].append({  
'Action': '*',
'Resource': 'arn:aws:ec2:::*/*',
'Effect': 'Allow'
})

使用新 JSON 和选项 SetAsDefault 为 True

创建策略版本
response = client.create_policy_version(
    PolicyArn= 'arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME,
    PolicyDocument= json.dumps(policyJson),
    SetAsDefault= True
)

删除以前的版本(可选但建议最多 5 个版本):

response = client.delete_policy_version(
    PolicyArn= 'arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME,
    VersionId= version.version_id
    ) 

你可以走了!

托马斯。

参考:IAM DOC

【讨论】:

    【解决方案2】:

    您必须获取 IAM 策略,然后删除,最后使用修改后的 JSON 重新创建它,就像之前建议的那样。

    代码片段

    import boto3, json
    
    # Create IAM client
    iam = boto3.resource('iam')
    
    policy = iam.Policy('arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy')
    version = policy.default_version
    policyJson = version.document
    policyJson['Statement'][0]['Resource'].append('arn:aws:s3:::anotherbucket/*')
    
    print(policyJson)
    
    client = boto3.client('iam')
    response = client.delete_policy(
        PolicyArn='arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy'
    )
    print(response)
    
    response = client.create_policy(
      PolicyName='CustomS3Policy',
      PolicyDocument=json.dumps(policyJson)
    )
    print(response)
    

    参考文献

    http://boto3.readthedocs.io/en/latest/guide/iam-example-policies.html https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Client.delete_policy https://gist.github.com/alexcasalboni/07414d62290828ea03a14b4bf2157fd1

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2020-10-28
      • 2017-12-24
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      相关资源
      最近更新 更多