使用导出AWSIAM身份中心身份及其分配的报告 PowerShell - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用导出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文件格式,包括身份名称(委托人)、身份类型(用户或群组)、该身份可以访问的帐户以及权限集。生成此报告后,您可在首选应用程序中将其打开,以便根据需要搜索、筛选和审核数据。下图显示了电子表格应用程序中的示例数据。

PowerShell 在电子表格应用程序中查看脚本结果。

重要:由于此报告包含敏感信息,因此我们强烈建议您将其安全存储,并且仅在 need-to-know基础上共享。

先决条件和限制

先决条件

  • IAM身份中心和AWS组织,已配置并启用。

  • PowerShell,已安装并配置。有关更多信息,请参阅安装 PowerShell(Microsoft 文档)。

  • AWS已安装并配置的工具。 PowerShell出于性能考虑,我们强烈建议您安装名AWS.Tools为的 T AWS ools 的 PowerShell模块化版本。每项AWS服务都由其自己的小模块提供支持。在 PowerShell shell 中,输入以下命令来安装此模式所需的模块:AWS.Tools.InstallerOrganizationsSSOAdmin、和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必须事先通过执行以下任一操作来配置有效的凭据:

    • 使用有关AWSCLIaws 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 的委派管理员账户

    • AWSSSOReadOnlyAWSSSODirectoryReadOnlyAWS托管策略是否已应用于它

    有关更多信息,请参阅使用命名配置AWSCLI文件(文档)和AWS托管策略(IAM文档)。

限制

  • 目标AWS账户必须作为AWS组织在 Organizations 中进行管理。

产品版本

架构

目标架构

使用AWSCLI命名配置文件编写脚本,用于在 Identity Center 中创建IAM身份报告。SSO
  1. 用户在 PowerShell 命令行中运行脚本。

  2. 该脚本采用的命名配置文件为AWSCLI。这将授予对IAM身份中心的访问权限。

  3. 该脚本从 Identity Center 检索SSOIAM身份配置。

  4. 该脚本在保存脚本的本地工作站的同一目录中生成一个CSV文件。

工具

AWS服务

  • AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。

  • AWSIAMId@@ entity Center 可帮助您集中管理对所有AWS帐户和云应用程序的单点登录 (SSO) 访问权限。

  • AWS的工具 PowerShell是一组 PowerShell 模块,可帮助您通过 PowerShell 命令行编写对AWS资源的操作脚本。

其他工具

  • PowerShell是一款在 Windows、Linux 和 macOS 上运行的微软自动化和配置管理程序。

操作说明

任务描述所需技能

准备脚本

  1. 复制此模式的 “其他信息” 部分中的 PowerShell 脚本。

  2. Param在本节中,针对您的AWS环境,定义以下变量的值:

    • OutputFile - 报告的名称。

    • ProfileName— 您要用来生成报告的AWSCLI指定配置文件。

    • Region— 部署IAM身份中心的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.InstallerOrganizationsSSOAdmin、和IdentityStore

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

No credentials specified or obtained from persisted/shell defaults 错误

操作说明操作说明部分的准备脚本中,确认您已正确输入 ProfileNameRegion 变量。确保指定配置文件中的设置和凭据具有足够的权限来管理 Ident IAM ity Center。

Authenticode Issuer …安装 AWS .Tools 模块时出错

Install-AWSToolsModule 命令添加 -SkipPublisherCheck参数。

Get-ORGAccountList : Assembly AWSSDK.SSO could not be found or loaded. 错误

如果指定了命名配置AWSCLI文件,将其配置为使用 Iden AWS CLI tity Center 对用户进行IAM身份验证,并且配置为自动检索刷新的身份验证令牌,AWSCLI则可能会发生此错误。要纠正这个错误,可以执行下列操作:

  1. 输入以下命令以确认 SSOSSOOIDC 模块已安装。

    Install-AWSToolsModule SSO, SSOOIDC
  2. 将以下行插入到 param() 块下方的脚本中。

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

相关资源

其他信息

在以下脚本中,确定是否需要更新以下参数值:

  • 如果您在中使用命名的个人资料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