Получите записи консультанта по доступу к политике AWS IAM из CLI или SDK

Я рассматриваю политики и роли IAM, которые не использовались в течение последних N дней.

В консоли я могу легко просмотреть недавнее использование в Access Advisor.

Я хотел бы получить то же самое в автоматическом режиме, но я не могу найти документацию по получению этого с помощью CLI или SDK.

Это возможно?

4 ответа

Решение

Netflix имеет инструмент под названием Aardvark для очистки данных Access Advisor с консоли. Вы можете взглянуть на это.

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

Теперь доступно, проверьте ссылку ниже

https://aws.amazon.com/about-aws/whats-new/2018/12/iam_access_advisor_apis/

Насколько я знаю, нет. Возможно, вам повезет найти способ обойти Selenium для автоматизации процесса, но это длительный обходной путь.

Не повезло и с CloudTrail. Самая близкая вещь, которую я мог найти, была, когда политики были последний раз обновлены.

Надеюсь, Amazon примет это во внимание. Я связался с ними по этому поводу.

Это возможно с помощью AWS SDK.

Версии:

  • aws-cli/2.0.61

  • go1.15.3 линукс/амд64


Давайте сделаем это в 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

Другие вопросы по тегам