【问题标题】:AWS assign external role to instanceAWS 将外部角色分配给实例
【发布时间】:2020-02-13 12:25:45
【问题描述】:

我有一个程序会处理许多帐户并进行盘点。现在它正在使用 boto3 和 AWS 密钥。

我想摆脱 aws 键,而是将角色分配给实例并使用该角色切换帐户。

我知道如何为用户分配外部角色,但我不知道如何使用实例角色来执行此操作。

这里的想法是做这样的事情:

  1. 从主要组织帐户获取所有帐户的列表
  2. 为每个帐户承担 ec2(和其他服务)描述角色的角色
  3. 获取库存
  4. 将角色切换到另一个帐户。

任何想法如何做到这一点?

【问题讨论】:

    标签: amazon-web-services boto3 amazon-iam


    【解决方案1】:

    你的方法是正确的。你可以这样做:

    • 在主帐号中创建主要角色
    • 将此角色分配给用于收集清单的 Amazon EC2 实例。
    • 在每个目标账户中创建一个目标 IAM 角色
      • 为每个目标角色分配足够的权限以允许库存(例如Describe* 调用)
      • 编辑每个目标角色的信任策略,以允许主要角色使用目标角色

    然后,您的应用程序可以使用 Main Role(分配给 EC2 实例)在子账户中的每个 Target Roles 上调用 AssumeRole()(根据你的第 2 步)。

    因此,您的流程实际上是:

    1. 从主要组织帐户获取所有帐户的列表
    2. 对于每个帐户:
      • 在目标角色上担任角色
      • 获取库存

    【讨论】:

    • 天哪,我是个白痴!谢谢你!我知道我做错了什么。我需要承担角色,然后使用从中获得的字典作为我的凭证令牌!假设角色实际上并没有切换到该角色。我完全错过了那篇文章。
    【解决方案2】:

    您可以先调用 org API 来列出帐户,这与您可以为具有跨帐户角色的每个帐户调用相同的方式 确保您的 Ec2 角色具有足够的权限来担任子帐户的角色

    def get_accounts():
        sts_role = 'arn:aws:iam::XXX:role/AWSAudit_CrossOrgAccess'  # Org Billing API 
        assumedRoleObject = sts.assume_role(RoleArn=str(sts_role), RoleSessionName="accounts_watcher_lambda" )
        credentials = assumedRoleObject['Credentials']
        conn = boto3.client( 'organizations', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'],)
        list_of_accounts = conn.list_accounts() 
    
        return list_of_accounts```
    
    
    ## Your Ec2 role looks like 
    
    `
    YourServerEc2Profile:
        Type: AWS::IAM::InstanceProfile
        Properties:
          Path: '/'
          Roles:
          - Ref: YourServerEc2Role
    YourServerEc2Role:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Principal:
                Service:
                - ec2.amazonaws.com
              Action:
              - sts:AssumeRole
          Path: "/"
          Policies:
          -
            PolicyName: AuditInstall
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                -
                  Action:
                    - "ssm:*",
                    - "ec2:DescribeImages",
                    - "cloudwatch:PutMetricData",
                    - "ec2:DescribeInstances",
                    - "lambda:InvokeFunction",
                    - "ec2:DescribeTags",
                    - "ec2:DescribeVpcs",
                    - "cloudwatch:GetMetricStatistics",
                    - "ec2:DescribeSubnets",
                    - "ec2:DescribeKeyPairs",
                    - "cloudwatch:ListMetrics",
                    - "ec2:DescribeSecurityGroups"
                  Resource: "*"
                  Effect: "Allow"
    
          ManagedPolicyArns:
            - !Ref YourServerCrossAccount
            - arn:aws:iam::aws:policy/ReadOnlyAccess
      YourServerCrossAccount:
        Type: AWS::IAM::ManagedPolicy
        Properties:
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Action:
              - sts:AssumeRole
              Resource:
              - arn:aws:iam::XXX:role/AWS_CrossAccount
    `
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多