本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 匯出 AWS IAM Identity Center 身分及其指派的報告 PowerShell
建立者:Jorge Pava (AWS)、Chard Miles ()AWS、Frank Allotta (AWS) 和 Manideep Reddy Gillela (AWS)
Summary
當您使用 AWS IAM Identity Center (AWS單一登入的後繼者) 來集中管理所有 Amazon Web Services (SSO) 帳戶和雲端應用程式的單一登入 (AWS) 存取時,透過 AWS管理主控台報告和稽核這些指派可能很繁瑣且耗時。如果您報告十幾或數百AWS個帳戶的使用者或群組的許可,尤其如此。
對於許多使用者而言,檢視此資訊的理想工具會位於試算表應用程式中,例如 Microsoft Excel。這可協助您篩選、搜尋和視覺化整個組織的資料,並由 AWS Organizations 管理。
此模式說明如何使用適用於 AWS的工具, PowerShell 在 SSO Identity Center 中產生IAM身分組態的報告。報告會格式化為 CSV 檔案,其中包含身分名稱 (主體)、身分類型 (使用者或群組)、身分可存取的帳戶,以及許可集。產生此報告後,您可以在偏好的應用程式中開啟報告,以搜尋、篩選和視需要稽核資料。下圖顯示試算表應用程式中的範例資料。

重要由於此報告包含敏感資訊,強烈建議您安全地存放它,並僅根據基礎 need-to-know進行共用。 |
先決條件和限制
先決條件
IAM Identity Center 和 AWS Organizations,已設定並啟用。
PowerShell,已安裝並設定。如需詳細資訊,請參閱安裝 PowerShell
(Microsoft 文件)。 AWS 適用於 PowerShell、已安裝和設定的工具。基於效能考量,強烈建議您安裝 AWS工具的模組化版本 PowerShell,稱為
AWS.Tools
。每個AWS服務都由其個別的小型模組支援。在 PowerShell Shell 中,輸入下列命令來安裝此模式所需的模組:AWS.Tools.Installer
、SSOAdmin
、Organizations
和IdentityStore
。Install-Module AWS.Tools.Installer Install-AWSToolsModule -Name Organizations, SSOAdmin, IdentityStore
如需詳細資訊,請參閱在 Windows 上安裝 AWS.Tools 或在 Linux 或 macOS 上安裝 AWS.Tools (AWS PowerShell 文件工具)。如果您在安裝模組時收到錯誤,請參閱此模式的故障診斷一節。
AWS 命令列界面 (AWS CLI) 或 先前AWSSDK必須使用工作登入資料設定,方法為執行下列其中一項:
如需AWSCLI
aws configure
詳細資訊,請參閱快速組態 (AWS CLI 文件)。設定 AWSCLI或 AWS 雲端開發套件 (AWSCDK),透過 AWS Identity and Access Management (IAM) 角色取得臨時存取權。如需詳細資訊,請參閱取得CLI存取IAM的角色登入資料 (IAM 身分中心文件)。
的具名設定檔AWSCLI,其已儲存 IAM委託人的登入資料:
可以存取 AWS Organizations 管理帳戶或 IAM Identity Center 的委派管理員帳戶
AWSSSOReadOnly
和AWSSSODirectoryReadOnly
AWS受管政策是否已套用
限制
目標AWS帳戶必須以 AWS Organizations 中的組織形式進行管理。
產品版本
對於所有作業系統,建議您使用 PowerShell 7.0 版
或更新版本。
架構
目標架構

使用者在 PowerShell 命令列中執行指令碼。
指令碼會假設 AWS 的具名設定檔CLI。這會授予 IAM Identity Center 的存取權。
指令碼會從 SSO Identity Center 擷取IAM身分組態。
指令碼會在儲存指令碼的本機工作站上的相同目錄中產生CSV檔案。
工具
AWS 服務
AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 shell 中的命令與 AWS服務互動。
AWS IAM Identity Center 可協助您集中管理所有AWS帳戶和雲端應用程式的單一登入 (SSO) 存取。
AWS 適用於 的工具 PowerShell是一組 PowerShell 模組,可協助您從 PowerShell 命令列編寫AWS資源操作的指令碼。
其他工具
PowerShell
是在 Windows、Linux 和 macOS 上執行的 Microsoft 自動化和組態管理程式。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
準備指令碼。 | 雲端管理員 | |
執行指令碼。 | 建議您使用下列命令在 PowerShell shell 中執行自訂指令碼。
或者,您也可以輸入下列命令,從另一個 shell 執行指令碼。
指令碼會在與指令碼CSV檔案相同的目錄中產生檔案。 | 雲端管理員 |
分析報告資料。 | 輸出CSV檔案具有標頭 AccountName、PermissionSet、主體和類型。在偏好的試算表應用程式中開啟此檔案。您可以建立資料表來篩選和排序輸出。 | 雲端管理員 |
故障診斷
問題 | 解決方案 |
---|---|
| AWS PowerShell 或其模組的工具未安裝。在 PowerShell shell 中,輸入下列命令來安裝適用於 AWS的工具, PowerShell 以及此模式所需的模組:
|
| 在史詩區段的準備指令碼中,確認您已正確輸入 |
| 將 |
| 當指定具名AWSCLI設定檔、AWSCLI設定為使用 IAM Identity Center 驗證使用者,並AWSCLI設定為自動擷取重新整理的身分驗證字符時,可能會發生此錯誤。若要解決此錯誤,請執行下列動作:
|
相關資源
組態設定存放在何處?(AWS CLI 文件)
設定 AWS CLI 以使用 AWS IAM Identity Center (AWS CLI 文件)
使用具名設定檔 (AWS CLI 文件)
其他資訊
在下列指令碼中,判斷您是否需要更新下列參數的值:
如果您在 中使用具名設定檔AWSCLI來存取已設定 IAM Identity Center 的帳戶,請更新
$ProfileName
值。如果 IAM Identity Center 部署在與 AWSCLI或 AWSSDK組態的預設區域不同的AWS區域中,請更新
$Region
值以使用 IAM Identity Center 部署的區域。如果這兩種情況都不適用,則不需要更新指令碼。
param ( # The name of the output CSV file [String] $OutputFile = "SSO-Assignments.csv", # The AWS CLI named profile [String] $ProfileName = "", # The AWS Region in which IAM Identity Center is configured [String] $Region = "" ) $Start = Get-Date; $OrgParams = @{} If ($Region){ $OrgParams.Region = $Region} if ($ProfileName){$OrgParams.ProfileName = $ProfileName} $SSOParams = $OrgParams.Clone(); $IdsParams = $OrgParams.Clone() $AccountList = Get-ORGAccountList @OrgParams | Select-Object Id, Name $SSOinstance = Get-SSOADMNInstanceList @OrgParams $SSOParams['InstanceArn'] = $SSOinstance.InstanceArn $IdsParams['IdentityStoreId'] = $SSOinstance.IdentityStoreId $PSsets = @{}; $Principals = @{} $Assignments = @(); $AccountCount = 1; Write-Host "" foreach ($Account in $AccountList) { $Duration = New-Timespan -Start $Start -End (Get-Date) | ForEach-Object {[Timespan]::New($_.Days, $_.Hours, $_.Minutes, $_.Seconds)} Write-Host "`r$Duration - Account $AccountCount of $($AccountList.Count) (Assignments:$($Assignments.Count)) " -NoNewline $AccountCount++ foreach ($PS in Get-SSOADMNPermissionSetsProvisionedToAccountList -AccountId $Account.Id @SSOParams) { if (-not $PSsets[$PS]) {$PSsets[$PS] = (Get-SSOADMNPermissionSet @SSOParams -PermissionSetArn $PS).Name;$APICalls++} $AssignmentsResponse = Get-SSOADMNAccountAssignmentList @SSOParams -PermissionSetArn $PS -AccountId $Account.Id if ($AssignmentsResponse.NextToken) {$AccountAssignments = $AssignmentsResponse.AccountAssignments} else {$AccountAssignments = $AssignmentsResponse} While ($AssignmentsResponse.NextToken) { $AssignmentsResponse = Get-SSOADMNAccountAssignmentList @SSOParams -PermissionSetArn $PS -AccountId $Account.Id -NextToken $AssignmentsResponse.NextToken $AccountAssignments += $AssignmentsResponse.AccountAssignments} foreach ($Assignment in $AccountAssignments) { if (-not $Principals[$Assignment.PrincipalId]) { $AssignmentType = $Assignment.PrincipalType.Value $Expression = "Get-IDS"+$AssignmentType+" @IdsParams -"+$AssignmentType+"Id "+$Assignment.PrincipalId $Principal = Invoke-Expression $Expression if ($Assignment.PrincipalType.Value -eq "GROUP") { $Principals[$Assignment.PrincipalId] = $Principal.DisplayName } else { $Principals[$Assignment.PrincipalId] = $Principal.UserName } } $Assignments += [PSCustomObject]@{ AccountName = $Account.Name PermissionSet = $PSsets[$PS] Principal = $Principals[$Assignment.PrincipalId] Type = $Assignment.PrincipalType.Value} } } } $Duration = New-Timespan -Start $Start -End (Get-Date) | ForEach-Object {[Timespan]::New($_.Days, $_.Hours, $_.Minutes, $_.Seconds)} Write-Host "`r$($AccountList.Count) accounts done in $Duration. Outputting result to $OutputFile" $Assignments | Sort-Object Account | Export-CSV -Path $OutputFile -Force