如何匯出 IAM Identity Center 身分及其指派的清單?
我想匯出所有AWS Organizations 中所有成員帳戶的 AWS IAM Identity Center 權限集,及其指派的主體清單。
簡短描述
若要產生 IAM Identity Center 權限集的報告,請使用 Python 指令碼。您可以建立包含其指派主體的權限集 JSON 報告,或包含其權限集指派的帳戶 .csv 檔案。
重要:
- IAM Identity Center API 的最大集體限流為每秒 20 筆交易 (TPS)。
**注意:**如果您收到 RequestLimitExceeded 和 ThrottlingException 錯誤,請參閱管理和監控工作負載中的 API 限流。 - 指令碼中包含的帳戶越多,產生報告所需的時間就越長。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
先決條件:
- 安裝或更新AWS SDK for Python (Boto3)。
- 使用下列其中一種方法之一,透過適當的憑證設定 AWS CLI 和適用於 Python 的 AWS SDK:
執行 configure AWS CLI 命令。如需詳細資訊,請參閱使用 AWS CLI 命令進行設定。
使用臨時安全憑證。 - 使用具有以下權限的 IAM 主體憑證,為 AWS CLI 設定設定檔:
允許存取 Organizations 管理帳戶或 IAM Identity Center 的委派管理員帳戶。
附加 AWSSSOReadOnly 和 AWSSSODirectoryReadOnly AWS 受管政策。
產生具有指派主體的權限集報告
請完成下列步驟:
-
將下列 Python 指令碼儲存為 .py 副檔名的檔案,例如 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 的區域。
-
在終端 (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" ] } }
**注意:**如果報告中沒有某個權限集,表示您尚未為帳戶佈建該權限集。
產生包含帳戶權限集指派的報告
請完成下列步驟:
-
將下列 Python 指令碼儲存為 .py 副檔名的檔案,例如 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() -
在終端 (macOS) 或 PowerShell (Windows) 視窗中執行 Python 指令碼。
該指令碼會建立一個名為 IdentityStoreReport.csv 的 .csv 檔案,其中包含您的帳戶指派。 您的系統會將 CSV 檔案儲存在與權限集報告相同的目錄中。
.csv 檔案輸出範例:
| 帳戶 ID | 帳戶名稱 | 權限集 | 主體類型 | 主體 |
| 123456789012 | 開發 | PowerUserAccess | 群組 | Developers |
| 123456789012 | 開發 | PowerUserAccess | 使用者 | Ross |
| 123456789012 | 開發 | AdministratorAccess | 使用者 | Phoebe |
| 123456789012 | 開發 | SystemAdministrator | 使用者 | Jake |
| 345678901234 | 正式環境 | AdministratorAccess | 群組 | 管理員 |
| 345678901234 | 正式環境 | AdministratorAccess | 群組 | 測試 |
| 901234567890 | 預備環境 | PowerUserAccess | 群組 | 測試 |
| 901234567890 | 預備環境 | AdministratorAccess | 群組 | 用戶端 |
| 901234567890 | 預備環境 | PowerUserAccess | 使用者 | Gina |
| 901234567890 | 預備環境 | PowerUserAccess | 群組 | 管理員 |
**注意:**如果報告中沒有某個帳戶,表示您尚未為該帳戶佈建權限集。
- 語言
- 中文 (繁體)

相關內容
已提問 1 年前
AWS 官方已更新 1 年前