本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用导出AWSIAM身份中心身份及其分配的报告 PowerShell
由豪尔赫·帕瓦 (AWS)、查德·迈尔斯 ()、弗兰克·阿洛塔 (AWS) 和 Manideep Reddy Gillela (AWS) 创作 AWS
环境:生产 | 技术:云原生、DevOps、基础设施、现代化、安全、身份、合规、管理和治理 | 工作负载:Microsoft |
AWS服务:IAM身份中心;AWS工具 PowerShell |
Summary
当您使用 Ident AWS IAM ity Center(AWS单点登录的继任者)集中管理对所有 Amazon Web Services (AWS) 账户和云应用程序的单点登录 () 访问权限时,通过AWS管理控制台报告和审计这些分配可能既繁琐又耗时。SSO如果您要报告用户或群组在数十或数百个AWS账户中的权限,则尤其如此。
对于许多人来说,查看此信息的理想工具是电子表格应用程序,例如 Microsoft Excel。这可以帮助您筛选、搜索和可视化由 Organizations 管理的整个AWS组织的数据。
此模式描述了如何使用AWS工具在 Id PowerShell entity Center 中生成SSOIAM身份配置报告。该报告采用CSV文件格式,包括身份名称(委托人)、身份类型(用户或群组)、该身份可以访问的帐户以及权限集。生成此报告后,您可在首选应用程序中将其打开,以便根据需要搜索、筛选和审核数据。下图显示了电子表格应用程序中的示例数据。
重要:由于此报告包含敏感信息,因此我们强烈建议您将其安全存储,并且仅在 need-to-know基础上共享。 |
先决条件和限制
先决条件
IAM身份中心和AWS组织,已配置并启用。
PowerShell,已安装并配置。有关更多信息,请参阅安装 PowerShell
(Microsoft 文档)。 AWS已安装并配置的工具。 PowerShell出于性能考虑,我们强烈建议您安装名
AWS.Tools
为的 T AWS ools 的 PowerShell模块化版本。每项AWS服务都由其自己的小模块提供支持。在 PowerShell shell 中,输入以下命令来安装此模式所需的模块:AWS.Tools.Installer
Organizations
、SSOAdmin
、和IdentityStore
。Install-Module AWS.Tools.Installer Install-AWSToolsModule -Name Organizations, SSOAdmin, IdentityStore
有关更多信息,请参阅在 Windows 上安装 AWS .Tool s 或在 Linux 或 macOS 上安装 AWS .Tools(文档AWS工具)。 PowerShell 如果您在安装模块时收到错误,请参阅此模式的故障排除部分。
AWS命令行界面 (AWSCLI) 或AWSSDK必须事先通过执行以下任一操作来配置有效的凭据:
使用有关AWSCLI
aws configure
更多信息,请参阅快速配置(AWSCLI文档)。配置AWSCLI或 AWS Cloud Development Kit (AWSCDK) 以通过AWS身份和访问管理 (IAM) 角色获得临时访问权限。有关更多信息,请参阅获取CLI访问权限的IAM角色凭证(I dent IAM ity Center 文档)。
的命名配置文件已保存委托人的证书 AWSCLI,该IAM委托人具有以下特征:
有权访问 Organizat AWS ions 管理账户或 Ident IAM ity Center 的委派管理员账户
AWSSSOReadOnly
和AWSSSODirectoryReadOnly
AWS托管策略是否已应用于它
限制
目标AWS账户必须作为AWS组织在 Organizations 中进行管理。
产品版本
对于所有操作系统,建议您使用 7.0 或更高PowerShell 版本
。
架构
目标架构
用户在 PowerShell 命令行中运行脚本。
该脚本采用的命名配置文件为AWSCLI。这将授予对IAM身份中心的访问权限。
该脚本从 Identity Center 检索SSOIAM身份配置。
该脚本在保存脚本的本地工作站的同一目录中生成一个CSV文件。
工具
AWS服务
AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。
AWSIAMId@@ entity Center 可帮助您集中管理对所有AWS帐户和云应用程序的单点登录 (SSO) 访问权限。
AWS的工具 PowerShell是一组 PowerShell 模块,可帮助您通过 PowerShell 命令行编写对AWS资源的操作脚本。
其他工具
PowerShell
是一款在 Windows、Linux 和 macOS 上运行的微软自动化和配置管理程序。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
准备脚本 | 云管理员 | |
运行 脚本。 | 建议您使用以下命令在 PowerShell shell 中运行您的自定义脚本。
或者,您可以通过输入以下命令从其他 Shell 运行脚本。
该脚本在与脚本CSV文件相同的目录中生成一个文件。 | 云管理员 |
分析报告数据。 | 输出CSV文件包含标题AccountNamePermissionSet、主文件和类型。在首选电子表格应用程序打开此文件。您可创建数据表来筛选和排序输出。 | 云管理员 |
故障排除
问题 | 解决方案 |
---|---|
| AWS未安装用于 PowerShell 或其模块的工具。在 PowerShell shell 中,输入以下命令来安装此模式所需的AWS工具 PowerShell 和模块:
|
| 在操作说明操作说明部分的准备脚本中,确认您已正确输入 |
| 向 |
| 如果指定了命名配置AWSCLI文件,将其配置为使用 Iden AWS CLI tity Center 对用户进行IAM身份验证,并且配置为自动检索刷新的身份验证令牌,AWSCLI则可能会发生此错误。要纠正这个错误,可以执行下列操作:
|
相关资源
配置设置存储在何处? (AWSCLI文档)
配置AWSCLI为使用AWSIAM身份中心(AWSCLI文档)
使用命名配置AWSCLI文件(文档)
其他信息
在以下脚本中,确定是否需要更新以下参数值:
如果您在中使用命名的个人资料AWSCLI来访问配置了 Ident IAM ity Center 的帐户,请更新该
$ProfileName
值。如果IAM将 Identity Center 部署在与您的AWSCLI或AWSSDK配置的默认AWS区域不同的区域,请更新该
$Region
值以使用部署IAM身份中心的区域。如果这两种情况都不适用,则不需要更新脚本。
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