Como faço para exportar uma lista de identidades do Centro de Identidade do IAM e suas atribuições?
Quero exportar uma lista de todos os conjuntos de permissões do Centro de Identidade do AWS IAM e suas entidades principais atribuídas nas contas de membros nas AWS Organizations.
Breve descrição
Para gerar relatórios dos conjuntos de permissões do Centro de Identidade do IAM, use scripts em Python. É possível criar um relatório JSON de conjuntos de permissões com suas entidades principais atribuídas ou um arquivo .csv de contas com suas atribuições de conjunto de permissões.
Importante:
- As APIs do Centro de Identidade do IAM têm um controle coletivo máximo de 20 transações por segundo (TPS).
Observação: Se você receber os erros RequestLimitExceeded e ThrottlingException, consulte Managing and monitoring API throttling in your workloads [Gerenciamento e monitoramento do controle de utilização de APIs em suas cargas de trabalho]. - Quanto mais contas você incluir em seu script, mais tempo levará para gerar o relatório.
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Pré-requisitos:
- Instale ou atualize o AWS SDK para Python (Boto3).
- Use um dos métodos a seguir para configurar a AWS CLI e o AWS SDK para Python com as credenciais adequadas:
Execute o comando configure da AWS CLI. Para obter mais informações, consulte Configurar usando comandos da AWS CLI.
Uso de credenciais de segurança temporárias. - Configure um perfil para a AWS CLI com credenciais para uma entidade principal do IAM que tenha as seguintes permissões:
Permita o acesso à conta gerencial da Organizations ou à conta de administrador delegado do Centro de Identidade do IAM.
Anexe as políticas gerenciadas AWS AWSSSOReadOnly e AWSSSODirectoryReadOnly.
Gere um relatório de conjuntos de permissões com entidades principais atribuídas
Conclua as etapas a seguir:
-
Salve o seguinte script Python com uma extensão .py, como permission_sets_report.py:
import boto3, json idstoreclient = boto3.client('identitystore') ssoadminclient = boto3.client('sso-admin') orgsclient= boto3.client('organizations') users={} groups={} permissionSets={} Accounts=[] Instances= (ssoadminclient.list_instances()).get('Instances') InstanceARN=Instances[0].get('InstanceArn') IdentityStoreId=Instances[0].get('IdentityStoreId') #Dictionary mapping User IDs to usernames def mapUserIDs(): ListUsers=idstoreclient.list_users(IdentityStoreId=IdentityStoreId) ListOfUsers=ListUsers['Users'] while 'NextToken' in ListUsers.keys(): ListUsers=idstoreclient.list_users(IdentityStoreId=IdentityStoreId,NextToken=ListUsers['NextToken']) ListOfUsers.extend(ListUsers['Users']) for eachUser in ListOfUsers: users.update({eachUser.get('UserId'):eachUser.get('UserName')}) mapUserIDs() #Dictionary mapping Group IDs to display names def mapGroupIDs(): ListGroups=idstoreclient.list_groups(IdentityStoreId=IdentityStoreId) ListOfGroups=ListGroups['Groups'] while 'NextToken' in ListGroups.keys(): ListGroups=idstoreclient.list_groups(IdentityStoreId=IdentityStoreId,NextToken=ListGroups['NextToken']) ListOfGroups.extend(ListGroups['Groups']) for eachGroup in ListOfGroups: groups.update({eachGroup.get('GroupId'):eachGroup.get('DisplayName')}) mapGroupIDs() #Dictionary mapping permission set ARNs to permission set names def mapPermissionSetIDs(): ListPermissionSets=ssoadminclient.list_permission_sets(InstanceArn=InstanceARN) ListOfPermissionSets=ListPermissionSets['PermissionSets'] while 'NextToken' in ListPermissionSets.keys(): ListPermissionSets=ssoadminclient.list_permission_sets(InstanceArn=InstanceARN,NextToken=ListPermissionSets['NextToken']) ListOfPermissionSets.extend(ListPermissionSets['PermissionSets']) for eachPermissionSet in ListOfPermissionSets: permissionSetDescription=ssoadminclient.describe_permission_set(InstanceArn=InstanceARN,PermissionSetArn=eachPermissionSet) permissionSetDetails=permissionSetDescription.get('PermissionSet') permissionSets.update({permissionSetDetails.get('PermissionSetArn'):permissionSetDetails.get('Name')}) mapPermissionSetIDs() #Listing Permissionsets provisioned to an account def GetPermissionSetsProvisionedToAccount(AccountID): ListOfPermissionSetsProvisionedToAccount=[] PermissionSetsProvisionedToAccount=ssoadminclient.list_permission_sets_provisioned_to_account(InstanceArn=InstanceARN,AccountId=AccountID) try: ListOfPermissionSetsProvisionedToAccount = PermissionSetsProvisionedToAccount['PermissionSets'] while 'NextToken' in PermissionSetsProvisionedToAccount.keys(): PermissionSetsProvisionedToAccount=ssoadminclient.list_permission_sets_provisioned_to_account(InstanceArn=InstanceARN,AccountId=AccountID,NextToken=PermissionSetsProvisionedToAccount['NextToken']) ListOfPermissionSetsProvisionedToAccount.extend(PermissionSetsProvisionedToAccount['PermissionSets']) return(ListOfPermissionSetsProvisionedToAccount) except: return(ListOfPermissionSetsProvisionedToAccount) #To retrieve the assignment of each permissionset/user/group/account assignment def ListAccountAssignments(AccountID): PermissionSetsList=GetPermissionSetsProvisionedToAccount(AccountID) Assignments=[] for permissionSet in PermissionSetsList: AccountAssignments=ssoadminclient.list_account_assignments(InstanceArn=InstanceARN,AccountId=AccountID,PermissionSetArn=permissionSet) Assignments.extend(AccountAssignments['AccountAssignments']) while 'NextToken' in AccountAssignments.keys(): AccountAssignments=ssoadminclient.list_aaccount_assignments(InstanceArn=InstanceARN,AccountId=AccountID,PermissionSetArn=permissionSet,NextToken=AccountAssignments['NextToken']) Assignments.extend(AccountAssignments['AccountAssignments']) return(Assignments) #To list all the accounts in the organization def ListAccountsInOrganization(): AccountsList=orgsclient.list_accounts() ListOfAccounts=AccountsList['Accounts'] while 'NextToken' in AccountsList.keys(): AccountsList=orgsclient.list_accounts(NextToken=AccountsList['NextToken']) ListOfAccounts.extend(AccountsList['Accounts']) for eachAccount in ListOfAccounts: Accounts.append(str(eachAccount.get('Id'))) return(Accounts) #To translate set datatype to json class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj) def GetListOfAssignmentsForPermissionSets(): ListOfAccountIDs=ListAccountsInOrganization() entries=[] PermissionSetListForAssignments={} for eachAccountID in ListOfAccountIDs: GetAccountAssignments=ListAccountAssignments(eachAccountID) for eachAssignment in GetAccountAssignments: if(permissionSets.get(eachAssignment.get('PermissionSetArn'))) not in PermissionSetListForAssignments.keys(): SetOfUsersandGroups={'Users':set(),'Groups':set()} PermissionSetListForAssignments[permissionSets.get(eachAssignment.get('PermissionSetArn'))]=SetOfUsersandGroups SetOfUsersandGroups=PermissionSetListForAssignments.get(permissionSets.get(eachAssignment.get('PermissionSetArn'))) if(eachAssignment.get('PrincipalType')=='GROUP'): setOfGroups=SetOfUsersandGroups.get('Groups') setOfGroups.add(groups.get(eachAssignment.get('PrincipalId'))) SetOfUsersandGroups.update({'Groups':setOfGroups}) PermissionSetListForAssignments.update({permissionSets.get(eachAssignment.get('PermissionSetArn')):SetOfUsersandGroups}) else: setOfUsers=SetOfUsersandGroups.get('Users') setOfUsers.add(users.get(eachAssignment.get('PrincipalId'))) SetOfUsersandGroups.update({'Users':setOfUsers}) PermissionSetListForAssignments.update({permissionSets.get(eachAssignment.get('PermissionSetArn')):SetOfUsersandGroups}) with open("AssignmentsForPermissionSets.json", "w") as outfile: json.dump(PermissionSetListForAssignments, outfile, cls=SetEncoder) print("Done!AssignmentsForPermissionSets.json generated successfully!") GetListOfAssignmentsForPermissionSets()Observação: Se você receber o erro "IndexError: list index out of range", então o script está em uma região da AWS que não é a região em que você configurou o Centro de Identidade do IAM.
-
Execute o script Python em uma janela Terminal (macOS) ou PowerShell (Windows).
O script cria um arquivo JSON chamado AssignmentsForPermissionSets.json que contém seus conjuntos de permissões e suas entidades principais atribuídas.
Exemplo de saída:
{ "AdministratorAccess": { "Users": [ "Charlie", "Ted" ], "Groups": [ "Admins", "Developers" ] }, "PowerUserAccess": { "Users": [ "Chandler", "Joey" ], "Groups": [ "Developers", "Testers" ] }, "SystemAdministrator": { "Users": [ "Sherlock" ], "Groups": [ "DevOps" ] } }
Observação: Se um conjunto de permissões não estiver no relatório, então você não proporcionou um conjunto de permissões para as contas.
Gere um relatório com as atribuições de contas do conjunto de permissões
Conclua as etapas a seguir:
-
Salve o seguinte script Python com uma extensão .py, como account_assignments_report.py:
import boto3, csv idstoreclient = boto3.client('identitystore') ssoadminclient = boto3.client('sso-admin') orgsclient= boto3.client('organizations') users={} groups={} permissionSets={} Accounts={} Instances= (ssoadminclient.list_instances()).get('Instances') InstanceARN=Instances[0].get('InstanceArn') IdentityStoreId=Instances[0].get('IdentityStoreId') #Dictionary mapping User IDs to usernames def mapUserIDs(): ListUsers=idstoreclient.list_users(IdentityStoreId=IdentityStoreId) ListOfUsers=ListUsers['Users'] while 'NextToken' in ListUsers.keys(): ListUsers=idstoreclient.list_users(IdentityStoreId=IdentityStoreId,NextToken=ListUsers['NextToken']) ListOfUsers.extend(ListUsers['Users']) for eachUser in ListOfUsers: users.update({eachUser.get('UserId'):eachUser.get('UserName')}) mapUserIDs() #Dictionary mapping Group IDs to display names def mapGroupIDs(): ListGroups=idstoreclient.list_groups(IdentityStoreId=IdentityStoreId) ListOfGroups=ListGroups['Groups'] while 'NextToken' in ListGroups.keys(): ListGroups=idstoreclient.list_groups(IdentityStoreId=IdentityStoreId,NextToken=ListGroups['NextToken']) ListOfGroups.extend(ListGroups['Groups']) for eachGroup in ListOfGroups: groups.update({eachGroup.get('GroupId'):eachGroup.get('DisplayName')}) mapGroupIDs() #Dictionary mapping permission set ARNs to permission set names def mapPermissionSetIDs(): ListPermissionSets=ssoadminclient.list_permission_sets(InstanceArn=InstanceARN) ListOfPermissionSets=ListPermissionSets['PermissionSets'] while 'NextToken' in ListPermissionSets.keys(): ListPermissionSets=ssoadminclient.list_permission_sets(InstanceArn=InstanceARN,NextToken=ListPermissionSets['NextToken']) ListOfPermissionSets.extend(ListPermissionSets['PermissionSets']) for eachPermissionSet in ListOfPermissionSets: permissionSetDescription=ssoadminclient.describe_permission_set(InstanceArn=InstanceARN,PermissionSetArn=eachPermissionSet) permissionSetDetails=permissionSetDescription.get('PermissionSet') permissionSets.update({permissionSetDetails.get('PermissionSetArn'):permissionSetDetails.get('Name')}) mapPermissionSetIDs() #Listing Permissionsets provisioned to an account def GetPermissionSetsProvisionedToAccount(AccountID): PermissionSetsProvisionedToAccount=ssoadminclient.list_permission_sets_provisioned_to_account(InstanceArn=InstanceARN,AccountId=AccountID) ListOfPermissionSetsProvisionedToAccount = PermissionSetsProvisionedToAccount['PermissionSets'] while 'NextToken' in PermissionSetsProvisionedToAccount.keys(): PermissionSetsProvisionedToAccount=ssoadminclient.list_permission_sets_provisioned_to_account(InstanceArn=InstanceARN,AccountId=AccountID,NextToken=PermissionSetsProvisionedToAccount['NextToken']) ListOfPermissionSetsProvisionedToAccount.extend(PermissionSetsProvisionedToAccount['PermissionSets']) return(ListOfPermissionSetsProvisionedToAccount) #To retrieve the assignment of each permissionset/user/group/account assignment def ListAccountAssignments(AccountID): PermissionSetsList=GetPermissionSetsProvisionedToAccount(AccountID) Assignments=[] for permissionSet in PermissionSetsList: AccountAssignments=ssoadminclient.list_account_assignments(InstanceArn=InstanceARN,AccountId=AccountID,PermissionSetArn=permissionSet) Assignments.extend(AccountAssignments['AccountAssignments']) while 'NextToken' in AccountAssignments.keys(): AccountAssignments=ssoadminclient.list_aaccount_assignments(InstanceArn=InstanceARN,AccountId=AccountID,PermissionSetArn=permissionSet,NextToken=AccountAssignments['NextToken']) Assignments.extend(AccountAssignments['AccountAssignments']) return(Assignments) #To list all the accounts in the organization def ListAccountsInOrganization(): AccountsList=orgsclient.list_accounts() ListOfAccounts=AccountsList['Accounts'] while 'NextToken' in AccountsList.keys(): AccountsList=orgsclient.list_accounts(NextToken=AccountsList['NextToken']) ListOfAccounts.extend(AccountsList['Accounts']) for eachAccount in ListOfAccounts: Accounts.update({eachAccount.get('Id'):eachAccount.get('Name')}) return(Accounts) def WriteToExcel(): Accounts=ListAccountsInOrganization() ListOfAccountIDs=list(Accounts.keys()) entries=[] for eachAccountID in ListOfAccountIDs: try: GetAccountAssignments=ListAccountAssignments(eachAccountID) for eachAssignment in GetAccountAssignments: entry=[] entry.append(eachAssignment.get('AccountId')) entry.append(Accounts.get(eachAssignment.get('AccountId'))) entry.append(permissionSets.get(eachAssignment.get('PermissionSetArn'))) entry.append(eachAssignment.get('PrincipalType')) if(eachAssignment.get('PrincipalType')=='GROUP'): entry.append(groups.get(eachAssignment.get('PrincipalId'))) else: entry.append(users.get(eachAssignment.get('PrincipalId'))) entries.append(entry) except: continue filename = "IdentityStoreReport.csv" headers=['Account ID', 'Account Name', 'Permission Set','Principal Type', 'Principal'] with open(filename, 'w') as report: csvwriter = csv.writer(report) csvwriter.writerow(headers) csvwriter.writerows(entries) print("Done! 'IdentityStoreReport.csv' report is generated successfully!") WriteToExcel() -
Execute o script Python em uma janela Terminal (macOS) ou PowerShell (Windows).
O script cria um arquivo .csv chamado IdentityStoreReport.csv que contém as atribuições da sua conta. Seu sistema salva o arquivo .csv no mesmo diretório do relatório de conjunto de permissões.
Exemplo de saída de arquivo .csv:
| ID da conta | Nome da conta | Conjunto de permissões | Tipo de entidade principal | Entidade principal |
| 123456789012 | Desenvolvimento | PowerUserAccess | GRUPO | Desenvolvedores |
| 123456789012 | Desenvolvimento | PowerUserAccess | USUÁRIO | Ross |
| 123456789012 | Desenvolvimento | AdministratorAccess | USUÁRIO | Phoebe |
| 123456789012 | Desenvolvimento | SystemAdministrator | USUÁRIO | Jake |
| 345678901234 | Produção | AdministratorAccess | GRUPO | Administradores |
| 345678901234 | Produção | AdministratorAccess | GRUPO | Teste |
| 901234567890 | Preparação | PowerUserAccess | GRUPO | Teste |
| 901234567890 | Preparação | AdministratorAccess | GRUPO | Cliente |
| 901234567890 | Preparação | PowerUserAccess | USUÁRIO | Gina |
| 901234567890 | Preparação | PowerUserAccess | GRUPO | Administradores |
Observação: Se uma conta não estiver no relatório, então você não proporcionou conjuntos de permissões para a conta.
- Idioma
- Português

Conteúdo relevante
- feita há 9 meses
- feita há 4 meses
- Resposta aceitafeita há 10 meses