Ir para o conteúdo

Como faço para exportar uma lista de identidades do Centro de Identidade do IAM e suas atribuições?

6 minuto de leitura
0

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:

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:

Gere um relatório de conjuntos de permissões com entidades principais atribuídas

Conclua as etapas a seguir:

  1. 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.

  2. 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:

  1. 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()
  2. 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 contaNome da contaConjunto de permissõesTipo de entidade principalEntidade principal
123456789012DesenvolvimentoPowerUserAccessGRUPODesenvolvedores
123456789012DesenvolvimentoPowerUserAccessUSUÁRIORoss
123456789012DesenvolvimentoAdministratorAccessUSUÁRIOPhoebe
123456789012DesenvolvimentoSystemAdministratorUSUÁRIOJake
345678901234ProduçãoAdministratorAccessGRUPOAdministradores
345678901234ProduçãoAdministratorAccessGRUPOTeste
901234567890PreparaçãoPowerUserAccessGRUPOTeste
901234567890PreparaçãoAdministratorAccessGRUPOCliente
901234567890PreparaçãoPowerUserAccessUSUÁRIOGina
901234567890PreparaçãoPowerUserAccessGRUPOAdministradores

Observação: Se uma conta não estiver no relatório, então você não proporcionou conjuntos de permissões para a conta.

AWS OFICIALAtualizada há 3 meses