使用 匯出 AWS IAM Identity Center 身分及其指派的報告 PowerShell - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 匯出 AWS IAM Identity Center 身分及其指派的報告 PowerShell

由 Jorge Pava (AWS)、Cad Miles ()AWS、Frank Allotta (AWS) 和 Manideep Reddy Gillela (AWS) 建立

環境:生產

技術:安全、身分、合規;管理和治理

工作負載:Microsoft

AWS 服務:IAM身分中心;適用於 AWS的工具 PowerShell

Summary

當您使用 AWS IAM Identity Center (接班人至AWS單一登入) 集中管理對所有 Amazon Web Services (SSO) 帳戶和雲端應用程式的單一登入 (AWS) 存取時,透過 AWS 管理主控台報告和稽核這些指派可能既繁瑣又費時。如果您報告十幾個或數百AWS個帳戶的使用者或群組的許可,尤其如此。

對於許多使用者而言,檢視此資訊的理想工具會位於試算表應用程式中,例如 Microsoft Excel。這可協助您篩選、搜尋和視覺化整個組織的資料,並由 AWS Organizations 管理。

此模式說明如何使用 AWS 工具 PowerShell 在 SSO Identity Center 中產生IAM身分組態的報告。報告會格式化為CSV檔案,其中包含身分名稱 (主體)、身分類型 (使用者或群組)、身分可存取的帳戶,以及許可集。產生此報告後,您可以在偏好的應用程式中開啟報告,以視需要搜尋、篩選和稽核資料。下圖顯示試算表應用程式中的範例資料。

PowerShell 在試算表應用程式中檢視的指令碼結果。

重要事項:由於此報告包含敏感資訊,因此強烈建議您安全地存放它,並僅根據基準 need-to-know共用它。

先決條件和限制

先決條件

  • IAM Identity Center 和 AWS Organizations,已設定並啟用。

  • PowerShell,已安裝並設定。如需詳細資訊,請參閱安裝 PowerShell (Microsoft 文件)。

  • AWS 適用於 PowerShell、已安裝和設定的工具。基於效能原因,強烈建議您安裝適用於 AWS的工具的模組化版本 PowerShell,稱為 AWS.Tools。每個AWS服務都由其個別的小型模組支援。在 PowerShell Shell 中,輸入下列命令來安裝此模式所需的模組:AWS.Tools.InstallerSSOAdminOrganizationsIdentityStore

    Install-Module AWS.Tools.Installer Install-AWSToolsModule -Name Organizations, SSOAdmin, IdentityStore

    如需詳細資訊,請參閱在 Windows 上安裝 AWS.Tools 或在 Linux 或 macOS 上安裝 AWS.Tools (AWS PowerShell 文件工具)。如果您在安裝模組時收到錯誤,請參閱此模式的疑難排解一節。

  • AWS 命令列介面 (AWS CLI) 或 先前AWSSDK必須透過工作憑證設定,方法是執行下列其中一項操作:

    • 使用 AWS CLI aws configure 如需詳細資訊,請參閱快速組態 (AWS CLI 文件)。

    • 設定 AWSCLI或 AWS 雲端開發套件 (AWS CDK),透過 AWS Identity and Access Management (IAM) 角色取得臨時存取權。如需詳細資訊,請參閱取得CLI存取IAM的角色憑證 (IAM Identity Center 文件)。

  • 已為主體儲存憑證AWSCLI的 具名設定檔,該IAM主體:

    • 可存取 AWS Identity IAM Center 的組織管理帳戶或委派管理員帳戶

    • AWSSSOReadOnlyAWSSSODirectoryReadOnlyAWS受管政策是否已套用

    如需詳細資訊,請參閱使用具名設定檔 (AWS CLI 文件) 和 AWS 受管政策 (IAM 文件)。

限制

  • 目標AWS帳戶必須以 AWS Organizations 中的組織管理。

產品版本

架構

目標架構

使用AWSCLI具名設定檔在 IAM Identity Center SSO 中建立身分報告的指令碼。
  1. 使用者在 PowerShell 命令列中執行指令碼。

  2. 指令碼會假設 AWS 的命名設定檔CLI。這將授予 IAM Identity Center 的存取權。

  3. 指令碼會從 SSO Identity Center 擷取IAM身分組態。

  4. 指令碼會在本機工作站上儲存指令碼的相同目錄中產生CSV檔案。

工具

AWS 服務

其他工具

  • PowerShell 是在 Windows、Linux 和 macOS 上執行的 Microsoft 自動化和組態管理程式。

史詩

任務描述所需的技能

準備指令碼。

  1. 在此模式的其他資訊其他資訊區段中複製 PowerShell 指令碼。

  2. Param區段中,針對您的AWS環境定義下列變數的值:

    • OutputFile – 報告的檔案名稱。

    • ProfileName – 您要用來產生報告的AWSCLI具名設定檔。

    • Region – 已部署 IAM Identity Center AWS的區域。如需區域及其代碼的完整清單,請參閱區域端點

  3. 儲存檔案名稱為 的指令碼SSO-Report.ps1

雲端管理員

執行指令碼。

建議您使用下列命令在 PowerShell Shell 中執行自訂指令碼。

.\SSO-Report.ps1

或者,您也可以輸入下列命令,從另一個 Shell 執行指令碼。

pwsh .\SSO-Report.ps1

指令碼會在與指令碼CSV檔案相同的目錄中產生檔案。

雲端管理員

分析報告資料。

輸出CSV檔案具有標頭 AccountNamePermissionSet主體 類型 。在偏好的試算表應用程式中開啟此檔案。您可以建立資料表來篩選和排序輸出。

雲端管理員

故障診斷

問題解決方案

The term ‘Get-<parameter>’ is not recognized as the name of a cmdlet, function, script file, or operable program. 錯誤

AWS PowerShell 或其模組的工具未安裝。在 PowerShell Shell 中,輸入下列命令來安裝適用於 AWS的工具, PowerShell 以及此模式所需的模組:AWS.Tools.InstallerSSOAdminOrganizationsIdentityStore

Install-Module AWS.Tools.Installer Install-AWSToolsModule -Name Organizations, SSOAdmin, IdentityStore

No credentials specified or obtained from persisted/shell defaults 錯誤

Epics 區段的準備指令碼中,確認您已正確輸入 ProfileNameRegion變數。確定具名設定檔中的設定和憑證具有足夠的許可來管理 IAM Identity Center。

Authenticode Issuer … 安裝 AWS.Tools 模組時發生錯誤

-SkipPublisherCheck 參數新增至 Install-AWSToolsModule 命令的結尾。

Get-ORGAccountList : Assembly AWSSDK.SSO could not be found or loaded. 錯誤

當指定具名AWSCLI設定檔、AWSCLI設定為使用 IAM Identity Center 對使用者進行身分驗證,並AWSCLI設定為自動擷取重新整理的身分驗證字符時,可能會發生此錯誤。若要解決此錯誤,請執行下列動作:

  1. 輸入下列命令以確認已安裝 SSOSSOOIDC模組。

    Install-AWSToolsModule SSO, SSOOIDC
  2. 將下列行插入param()區塊下方的指令碼。

    Import-Module AWS.Tools.SSO
    Import-Module AWS.Tools.SSOOIDC

相關資源

其他資訊

在下列指令碼中,判斷您是否需要更新下列參數的值:

  • 如果您在 中使用具名設定檔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