Direkt zum Inhalt

Wie exportiere ich eine Liste der IAM Identity Center-Identitäten und ihrer Zuweisungen?

Lesedauer: 6 Minute
0

Ich möchte eine Liste aller AWS IAM Identity Center-Berechtigungssätze und der ihnen zugewiesenen Prinzipale für alle Mitgliedskonten in AWS Organizations exportieren.

Kurzbeschreibung

Verwende Python-Skripts, um Berichte über IAM Identity Center-Berechtigungssätze zu generieren. Du kannst entweder einen JSON-Bericht der Berechtigungssätze mit den ihnen zugewiesenen Hauptbenutzern oder eine CSV-Datei mit Konten mit ihren Berechtigungssatzzuweisungen erstellen.

Wichtig:

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Voraussetzungen:

Generiere einen Bericht über Berechtigungssätze mit zugewiesenen Hauptbenutzern

Führe die folgenden Schritte aus:

  1. Speichere das folgende Python-Skript mit einer .py-Erweiterung, z. B. 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()

    Hinweis: Wenn du die Fehlermeldung "IndexError: list index out of range" erhältst, befindet sich das Skript in einer AWS-Region, die nicht die Region ist, in der du IAM Identity Center konfiguriert hast.

  2. Führe das Python-Skript in einem Terminal- (macOS) oder PowerShell-Fenster (Windows) aus.

Das Skript erstellt eine JSON-Datei mit dem Namen AssignmentsForPermissionSets.json, die deine Berechtigungssätze und die ihnen zugewiesenen Prinzipale enthält.

Beispielausgabe:

{  "AdministratorAccess": {    "Users": [
      "Charlie",
      "Ted"
    ],
    "Groups": [
      "Admins",
      "Developers"
    ]
  },
  "PowerUserAccess": {
    "Users": [
      "Chandler",
      "Joey"
    ],
    "Groups": [
      "Developers",
      "Testers"
    ]
  },
  "SystemAdministrator": {
    "Users": [
      "Sherlock"
    ],
    "Groups": [
      "DevOps"
    ]
  }
}

Hinweis: Wenn der Bericht keinen Berechtigungssatz enthält, hast du keinen Berechtigungssatz für die Konten bereitgestellt.

Generiere einen Bericht mit den Berechtigungssatzzuweisungen von Konten

Führe die folgenden Schritte aus:

  1. Speichere das folgende Python-Skript mit einer .py-Erweiterung, z. B. 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. Führe das Python-Skript in einem Terminal- (macOS) oder PowerShell-Fenster (Windows) aus.

Das Skript erstellt eine CSV-Datei mit dem Namen IdentityStoreReport.csv, die deine Kontozuweisungen enthält.Dein System speichert die CSV-Datei im selben Verzeichnis wie der Berechtigungssatzbericht.

Beispiel für eine .csv-Dateiausgabe:

Konto-IDKontonameBerechtigungssatzPrinzipaltypPrinzipal
123456789012EntwicklungPowerUserAccessGRUPPEEntwickler
123456789012EntwicklungPowerUserAccessBENUTZERRoss
123456789012EntwicklungAdministratorAccessBENUTZERPhoebe
123456789012EntwicklungSystemAdministratorBENUTZERJake
345678901234ProduktionAdministratorAccessGRUPPEAdmins
345678901234ProduktionAdministratorAccessGRUPPETesten
901234567890StagingPowerUserAccessGRUPPETesten
901234567890StagingAdministratorAccessGRUPPEClient
901234567890StagingPowerUserAccessBENUTZERGina
901234567890StagingPowerUserAccessGRUPPEAdmins

Hinweis: Wenn ein Konto nicht im Bericht enthalten ist, hast du keine Berechtigungssätze für das Konto bereitgestellt.

AWS OFFICIALAktualisiert vor 3 Monaten