Получите записи консультанта по доступу к политике 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