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

时间:2020-08-10 03:45:21

标签: amazon-web-services boto3 amazon-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”:[{“时,此方法才有效。它区分大小写,并且如果以前的策略在Statement周围使用单引号(')而不是双quote(“),则它不起作用。我可以使用” re“模块并在其周围编写多个条件,但是会增加太多的复杂性。

  1. 如果我将策略作为字典并附加值,则会在更新周围添加“”,并且策略看起来像
{
  "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角色信任策略?

1 个答案:

答案 0 :(得分:0)

我不确定为什么要为此进行字符串操作。您只需替换信任策略中的单个组件即可。

例如:

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)

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

相关问题