使用boto3编辑现有IAM角色信任策略



我需要使用boto3用Deny语句更新/附加IAM角色信任策略。如果我使用update_assume_role_policy,它将覆盖以前的策略,而不是附加新的更改。因此,我尝试使用get_role读取现有策略,然后将我的声明附加到其中,但遇到以下挑战

  1. 如果我进行字符串替换-我的代码示例
policy = '"Statement" : [ {"Sid": "Test","Effect": "Deny","Principal":{"AWS": "123456"},"Action": "*","Resource": "*"},{'        
response = iam.get_role(RoleName= ResourceName)
current_policy=str(response['Role']['AssumeRolePolicyDocument'])
updated_policy = current_policy.replace('"Statement" : [ {', policy)

这仅在策略字符串与"匹配时有效;声明":[{'。它区分大小写,如果以前的策略在Statement周围有单引号('(而不是双引号("(,它就不起作用。我可以使用"re"模块并围绕它写多个条件,但它增加了太多的复杂性。

  • 如果我将策略作为字典并附加值,它会添加一个"quot;关于我的更新和it政策
  • {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::123456:root"
    },
    "Action": "sts:AssumeRole",
    "Condition": {}
    },
    "{
    "Effect": "Deny",
    "Principal": {
    "AWS": "arn:aws:iam::890123:root"
    },
    "Action": "sts:AssumeRole",
    "Condition": {}
    }"
    ]
    }
    

    是否有更好、更简单的方法来更新IAM角色信任策略?

    我不知道为什么需要字符串操作。您只需更换信任策略的单个组件即可。

    例如:

    import boto3
    iam = boto3.client('iam')
    response = iam.get_role(RoleName='<role-name>') 
    trust_policy = response['Role']['AssumeRolePolicyDocument']
    print(trust_policy)
    # change effect to `Deny`
    trust_policy['Statement'][0]['Effect'] = 'Deny'
    # change principle to '123456'
    trust_policy['Statement'][0]['Principal']['AWS'] = '123456'
    print(trust_policy)
    

    您可以对其他组件执行同样的操作。

    最新更新