翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
PowerShell を使用して AWS IAM アイデンティティセンターのアイデンティティとその割り当てに関するレポートをエクスポートする
作成者: Jorge Pava (AWS)、Chad Miles (AWS)、Frank Allotta (AWS)、および Manideep Reddy Gillela (AWS)
概要
AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使用して、すべての Amazon Web Services (AWS) アカウントとクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理する場合、AWS マネジメントコンソールによる割り当てのレポーティングと監査は面倒で時間がかかることがあります。数十または数百の AWS アカウントにまたがるユーザーまたはグループのアクセス権限についてレポートする場合は特にそうです。
多くの人にとって、この情報を表示するための理想的なツールは、Microsoft Excel などのスプレッドシートアプリケーションです。これにより、AWS Organizations が管理する組織全体のデータをフィルタリング、検索、視覚化できます。
このパターンでは、AWS Tools for PowerShell を使用して IAM アイデンティティセンターで SSO アイデンティティ構成のレポートを生成する方法を説明します。レポートは CSV 形式で生成され、ID 名 (プリンシパル)、ID タイプ (ユーザーまたはグループ)、ID がアクセスできるアカウント、および権限セットが記載されます。レポートの生成後、これを任意のアプリケーションで開き、必要に応じてデータを検索、フィルタリング、および監査することができます。以下の画像は、スプレッドシートアプリケーションを使ったサンプルデータです。

重要このレポートには機密情報が含まれているため、安全に保存し、need-to-know場合にのみ共有することを強くお勧めします。 |
前提条件と制限
前提条件
構成済みで有効になっている IAM アイデンティティセンターと AWS Organizations。
PowerShell がインストールされ、構成済みであること。詳細については、「PowerShellをインストール
」 (Microsoft のドキュメント)を参照してください。 AWS Tools for PowerShell がインストールされ、設定されました。パフォーマンスの理由で、モジュール化された AWS Tools for PowerShell バージョンをインストールすることを強く推奨します。
AWS.Tools
と呼びます。AWS の各サービスが、個別の小さなモジュールによってサポートされます。PowerShell シェルで、以下のコマンドを入力して、このパターンに必要な次のモジュールをインストールします:AWS.Tools.Installer
、Organizations
、SSOAdmin
、およびIdentityStore
Install-Module AWS.Tools.Installer Install-AWSToolsModule -Name Organizations, SSOAdmin, IdentityStore
詳細については、「Windows 用 .Tools のインストール」または「Linux または macOS 用 .Tools のインストール」(AWS Tools for PowerShell ドキュメント) を参照してください。モジュールのインストール時にエラーが発生した場合は、このパターンの「トラブルシューティング」セクションを参照してください。
AWS コマンドラインインターフェイス (AWS CLI) または AWS SDK は、次のいずれかの方法で、あらかじめ有効な認証情報を使用して構成しておく必要があります。
AWS CLI
aws configure
を使用する。詳細については、「クイック構成」 (AWS CLI ドキュメント)を参照してください。AWS Identity and Access Management (IAM) ロールを使用して一時的にアクセスできるように、AWS CLI または AWS Cloud Development Kit (AWS CDK) を構成する。詳細については、「CLI アクセス用の IAM ロール認証情報の取得」(IAM アイデンティティセンター ドキュメント) を参照してください。
以下のような IAM プリンシパルの認証情報を保存した AWS CLI の名前付きプロファイル
AWS Organizations の管理アカウントまたは IAM アイデンティティセンター 用の委任管理者アカウントにアクセスできる
AWSSSOReadOnly
とAWSSSODirectoryReadOnly
AWS マネージドポリシーが適用されている
詳細については、「名前付きプロファイルの使用」 (AWS CLI ドキュメント) および「AWS マネージドポリシー」 (IAM ドキュメント) を参照してください。
制約事項
ターゲット AWS アカウントは、AWS Organizations 内の 1 つの組織として管理する必要があります。
製品バージョン
すべてのオペレーティングシステムでは、「PowerShell バージョン 7.0
」 以降を使用することを推奨します。
アーキテクチャ
ターゲットアーキテクチャ

ユーザーは PowerShell コマンドラインでスクリプトを実行します。
このスクリプトは、AWS CLI の名前付きプロファイルを前提としています。これにより、IAM アイデンティティセンター へのアクセスが許可されます。
このスクリプトは IAM アイデンティティセンターから SSO ID 構成を取得します。
このスクリプトは、スクリプトが保存されているローカルワークステーションの同じディレクトリに CSV ファイルを生成します。
ツール
AWS サービス
「AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
「AWS IAM アイデンティティセンター」 により、すべての AWS アカウントとクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理できます。
「AWS Tools for PowerShell」 は PowerShell のコマンドラインから AWS リソースの操作をスクリプト処理することを支援する PowerShell モジュールのセットです。
その他のツール
PowerShell
は Windows、Linux、および macOS で動作する Microsoft の自動化および構成管理プログラムです。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
スクリプトを作成する。 |
| クラウド管理者 |
スクリプトを実行します。 | PowerShell シェルで次のコマンドを使用してカスタムスクリプトを実行することをお勧めします。
または、次のコマンドを入力して、スクリプトを別のシェルから実行します。
このスクリプトは、スクリプトファイルと同じディレクトリに CSV ファイルを生成します。 | クラウド管理者 |
レポートデータを分析します。 | 出力 CSV ファイルには、「アカウント名」、「権限セット」、「プリンシパル」、「タイプ」の各ヘッダーがあります。このファイルを任意のスプレッドシートアプリケーションで開きます。データテーブルを作成して、出力をフィルターしたりソートしたりできます。 | クラウド管理者 |
トラブルシューティング
問題 | ソリューション |
---|---|
| AWS Tools for PowerShell またはそのモジュールがインストールされていません。PowerShell シェルで、以下のコマンドを入力して、AWS Tools for PowerShell と、このパターンに必要なモジュールをインストールします:
|
| 「エピック」セクションの「スクリプトの作成」で、変数 |
AWS.Tools モジュールをインストールすると |
|
| このエラーは、名前付きの AWS CLI プロファイルが指定され、IAM アイデンティティセンターでユーザーを認証するように AWS CLI が構成され、更新された認証トークンを自動的に取得するように AWS CLI が構成されている場合に発生する可能性があります。この問題を解決するには、次のいずれかの操作を実行します。
|
関連リソース
構成設定はどこに保存されていますか? (AWS CLI ドキュメント)
「AWS IAM IM アイデンティティセンターを使用するための AWS CLI の設定」 (AWS CLI ドキュメント)
「名前付きプロファイルを使用」 (AWS CLI ドキュメント)
追加情報
次のスクリプトで、以下のパラメータの値を更新する必要があるかどうかを判断します。
AWS CLI の名前付きプロファイルを使用して IAM アイデンティティセンター が構成されているアカウントにアクセスする場合は、
$ProfileName
値を更新してください。IAM アイデンティティセンターが AWS CLI または AWS SDK 構成のデフォルトリージョンとは異なる AWS リージョンにデプロイされている場合は、IAM アイデンティティ センターがデプロイされているリージョンを使用するように
$Region
値を更新します。どちらの状況にも当てはまらない場合は、スクリプトを更新する必要はありません。
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