【问题标题】:Get AWS IAM policy Access Advisor records from CLI or SDK从 CLI 或 SDK 获取 AWS IAM 策略访问顾问记录
【发布时间】:2017-10-17 16:55:29
【问题描述】:

我正在审查过去 N 天内未使用的 IAM 政策和角色。

在控制台中,我可以在 Access Advisor 下轻松查看最近的使用情况。

我想以自动化的方式获得相同的结果,但我找不到任何有关使用 CLI 或 SDK 获得它的文档。

这可能吗?

【问题讨论】:

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


    【解决方案1】:

    Netflix 有一个名为 Aardvark 的工具,用于从控制台抓取 Access Advisor 数据。你可能想看看那个。

    https://medium.com/netflix-techblog/introducing-aardvark-and-repokid-53b081bf3a7e

    【讨论】:

    • 我不知道这存在。我去看看!
    • 很方便!坦率地说,我也不知道这存在。很高兴终于有一个可以处理这个问题的 api。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      据我所知,没有。您可能会很幸运地找到一种使用 Selenium 来自动化该过程的方法,但这是一个漫长的解决方法。

      使用 CloudTrail 也没有这样的运气。我能找到的最接近的信息是上次更新政策的时间。

      希望亚马逊会考虑到这一点。我已经就此事联系过他们。

      【讨论】:

        【解决方案4】:

        这可以使用 AWS 开发工具包。

        版本:

        • aws-cli/2.0.61

        • go1.15.3 linux/amd64


        让我们在 Golang 中使用正确的导入来做到这一点。

         import (
             "fmt"
             "github.com/aws/aws-sdk-go/aws"
             "context"
             "github.com/aws/aws-sdk-go-v2/config"
             "github.com/aws/aws-sdk-go-v2/service/iam"
        )
        

        首先,您要初始化一个会话和一个客户端:

        cfg, err := config.LoadDefaultConfig() 
        svc := iam.NewFromConfig(cfg)
        

        然后您想要获取角色列表,以遍历所有角色名称。您还可以使用特定的角色名称,因为这是您获取 LastUsedDate 所需的唯一内容:

        roles_iam, err := svc.ListRoles(context.Background(), &iam.ListRolesInput{
        PathPrefix: aws.String("/")})
        if err != nil {
            fmt.Println("Error", err)
            return  
        }
        
        /** For simplicity and less dereferencing: more execution speed **/
        roles_list := roles_iam.Roles    
        

        最后,如果您需要获取所有角色的 LastUsedDate,请遍历一个循环。只需使用正确的 GetRoleInput 参数设置输入,然后调用 svc.GetRole 以获取包含您的信息的结构。

        /** Declare slice 'unused_roles' containing string unused role names **/
        var unused_roles []string 
        
        for i := range roles_list {
            role_name := *roles_list[i].RoleName
            input := &iam.GetRoleInput{
                RoleName: aws.String(*roles_list[i].RoleName),
            }
            role_info, err := svc.GetRole(context.Background(), input)
            if err != nil {
                fmt.Println("Error", err)
            }    
              
        /** Check if role has never been used **/           
            if (role_info.Role.RoleLastUsed.LastUsedDate) == nil {
                fmt.Printf("Role %s has never been used\n", role_name)
                unused_roles = append(unused_roles, role_name)
                continue
            }
            last_used_date := *role_info.Role.RoleLastUsed.LastUsedDate
        }
        

        更多信息:

        https://docs.aws.amazon.com/IAM/latest/APIReference/API_Role.html

        https://docs.aws.amazon.com/IAM/latest/APIReference/API_RoleLastUsed.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-02
          • 2019-11-15
          • 2019-02-04
          • 2016-01-17
          • 2021-08-26
          • 1970-01-01
          • 2020-12-15
          相关资源
          最近更新 更多