本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 匯出 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檔案,其中包含身分名稱 (主體)、身分類型 (使用者或群組)、身分可存取的帳戶,以及許可集。產生此報告後,您可以在偏好的應用程式中開啟報告,以視需要搜尋、篩選和稽核資料。下圖顯示試算表應用程式中的範例資料。
重要事項:由於此報告包含敏感資訊,因此強烈建議您安全地存放它,並僅根據基準 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必須透過工作憑證設定,方法是執行下列其中一項操作:
使用 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 的組織管理帳戶或委派管理員帳戶
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 以及此模式所需的模組:
|
| 在 Epics 區段的準備指令碼中,確認您已正確輸入 |
| 將 |
| 當指定具名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