跳至内容

如何导出 IAM Identity Center 身份列表及其分配?

5 分钟阅读
0

我想导出所有 AWS IAM Identity Center 权限集及其在 AWS Organizations 成员账户中分配的主体的列表。

简短描述

要生成 IAM Identity Center 权限集的报告,请使用 Python 脚本。您可以创建包含权限集及其分配主体的 JSON 报告,或包含账户及其权限集分配的 .csv 文件。

重要事项:

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

先决条件:

生成包含分配主体的权限集报告

完成以下步骤:

  1. 使用 .py 扩展名保存以下 Python 脚本,例如 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()

    **注意:**如果您收到"IndexError: list index out of range"错误,则说明脚本所在的 AWS 区域不是您配置 IAM Identity Center 的区域。

  2. 在终端 (macOS) 或 PowerShell (Windows) 窗口中运行 Python 脚本。

该脚本会创建一个名为 AssignmentsForPermissionSets.json 的 JSON 文件,其中包含您的权限集及其分配的主体。

输出示例:

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

**注意:**如果报告中没有权限集,则您没有为账户预置权限集。

生成包含账户权限集分配的报告

完成以下步骤:

  1. 使用 .py 扩展名保存以下 Python 脚本,例如 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. 在终端 (macOS) 或 PowerShell (Windows) 窗口中运行 Python 脚本。

该脚本会创建一个名为 IdentityStoreReport.csv 的 .csv 文件,其中包含您的账户分配。您的系统将 .csv 文件与权限集报告保存在同一个目录中。

.csv 文件输出示例:

账户 ID账户名称权限集主体类型主体
123456789012开发PowerUserAccessGROUP开发人员
123456789012开发PowerUserAccessUSERRoss
123456789012开发AdministratorAccessUSERPhoebe
123456789012开发SystemAdministratorUSERJake
345678901234生产AdministratorAccessGROUP管理员
345678901234生产AdministratorAccessGROUP测试
901234567890暂存PowerUserAccessGROUP测试
901234567890暂存AdministratorAccessGROUP客户端
901234567890暂存PowerUserAccessUSERGina
901234567890暂存PowerUserAccessGROUP管理员

**注意:**如果某个账户不在报告中,则您没有为该账户预置权限集。

AWS 官方已更新 3 个月前