を使用して AWS IAM Identity Center アイデンティティとその割り当てのレポートをエクスポートする PowerShell - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

を使用して AWS IAM Identity Center アイデンティティとその割り当てのレポートをエクスポートする PowerShell

作成者: Jorge Pava (AWS)、Chad Miles (AWS)、Frank Allotta (AWS)、および Manideep Reddy Gillela (AWS)

環境:本稼働

テクノロジー: セキュリティ、アイデンティティ、コンプライアンス、管理とガバナンス

ワークロード: Microsoft

AWS サービス: IAM Identity Center、AWS Tools for PowerShell

[概要]

AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使用して、すべての Amazon Web Services (AWS) アカウントとクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理する場合、AWS マネジメントコンソールによる割り当てのレポーティングと監査は面倒で時間がかかることがあります。数十または数百の AWS アカウントにまたがるユーザーまたはグループのアクセス権限についてレポートする場合は特にそうです。

多くの人にとって、この情報を表示するための理想的なツールは、Microsoft Excel などのスプレッドシートアプリケーションです。これにより、AWS Organizations が管理する組織全体のデータをフィルタリング、検索、視覚化できます。

このパターンでは、AWS Tools for を使用して IAM Identity Center で SSO ID 設定のレポート PowerShell を生成する方法について説明します。レポートは CSV 形式で生成され、ID 名 (プリンシパル)、ID タイプ (ユーザーまたはグループ)、ID がアクセスできるアカウント、および権限セットが記載されます。レポートの生成後、これを任意のアプリケーションで開き、必要に応じてデータを検索、フィルタリング、および監査することができます。以下の画像は、スプレッドシートアプリケーションを使ったサンプルデータです。

PowerShell スプレッドシートアプリケーションで表示される スクリプトの結果。

重要: このレポートには機密情報が含まれているため、安全に保存し、 need-to-know ベースでのみ共有することを強くお勧めします。

前提条件と制限

前提条件

  • 構成済みで有効になっている IAM アイデンティティセンターと AWS Organizations。

  • PowerShell、インストールおよび設定済み。詳細については、「 のインストール PowerShell」(Microsoft ドキュメント) を参照してください。

  • AWS Tools for がインストールされ PowerShell、設定されています。パフォーマンス上の理由から、 PowerShellと呼ばれる AWS Tools for のモジュール化されたバージョンをインストールすることを強くお勧めしますAWS.Tools。各AWSサービスが、それ自身の個別の小さなモジュールによって適用されます。 PowerShell シェルで、次のコマンドを入力して、このパターンに必要なモジュールをインストールします: AWS.Tools.InstallerOrganizationsSSOAdminIdentityStore

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

    詳細については、「Windows に AWS.Tools をインストールする」または「Linux または macOS に AWS.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 アイデンティティセンター 用の委任管理者アカウントにアクセスできる

    • AWSSSOReadOnlyAWSSSODirectoryReadOnly AWS マネージドポリシーが適用されている

    詳細については、「名前付きプロファイルの使用」 (AWS CLI ドキュメント) および「AWS マネージドポリシー」 (IAM ドキュメント) を参照してください。

制約事項

  • ターゲット AWS アカウントは、AWS Organizations 内の 1 つの組織として管理する必要があります。

製品バージョン

アーキテクチャ

ターゲットアーキテクチャ

AWS CLI の名前付きプロファイルを使用して IAM アイデンティティセンターで SSO ID のレポートを作成するスクリプト。
  1. ユーザーは PowerShell コマンドラインでスクリプトを実行します。

  2. このスクリプトは、AWS CLI の名前付きプロファイルを前提としています。これにより、IAM アイデンティティセンター へのアクセスが許可されます。

  3. このスクリプトは IAM アイデンティティセンターから SSO ID 構成を取得します。

  4. このスクリプトは、スクリプトが保存されているローカルワークステーションの同じディレクトリに CSV ファイルを生成します。

ツール

AWS サービス

  • AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • AWS IAM アイデンティティセンター」 により、すべての AWS アカウントとクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理できます。

  • AWS Tools for PowerShell は、 PowerShell コマンドラインから AWS リソースに対するオペレーションをスクリプト化するのに役立つ PowerShell モジュールのセットです。

その他のツール

  • PowerShell は、Windows、Linux、macOS で実行される Microsoft の自動化および設定管理プログラムです。

エピック

タスク説明必要なスキル

スクリプトを作成する。

  1. このパターンの追加情報「追加情報」セクションにある PowerShell スクリプトをコピーします。

  2. Param セクションでは、お使いの AWS 環境に合わせて、以下の変数の値を定義します。

    • OutputFile – レポートの名前。

    • ProfileName – レポートの生成に使用する AWS CLI の名前付きプロファイル。

    • Region – IAM アイデンティティセンターがデプロイされている AWS リージョン。リージョンのリストについては、「リージョンのエンドポイント」を参照してください。

  3. スクリプトを SSO-Report.ps1 という名前で保存します。

クラウド管理者

スクリプトを実行します。

次のコマンドを使用して PowerShell 、シェルでカスタムスクリプトを実行することをお勧めします。

.\SSO-Report.ps1

または、次のコマンドを入力して、スクリプトを別のシェルから実行します。

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 Tools for PowerShell またはそのモジュールはインストールされません。 PowerShell シェルで、AWS Tools for PowerShell と、このパターンに必要なモジュールをインストールするにはAWS.Tools.Installer、、OrganizationsSSOAdmin、および のコマンドを入力しますIdentityStore

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

No credentials specified or obtained from persisted/shell defaults エラー

エピック」セクションの「スクリプトの作成」で、変数 ProfileName および Region を正しく入力したことを確認します。指定したプロファイルの設定と認証情報に IAM アイデンティティセンター を管理するための十分な権限があることを確認してください。

AWS.Tools モジュールをインストールすると Authenticode Issuer … エラーが発生する

-SkipPublisherCheck パラメータを Install-AWSToolsModule コマンドに追加します。

Get-ORGAccountList : Assembly AWSSDK.SSO could not be found or loaded. エラー

このエラーは、名前付きの AWS CLI プロファイルが指定され、IAM アイデンティティセンターでユーザーを認証するように AWS CLI が構成され、更新された認証トークンを自動的に取得するように AWS CLI が構成されている場合に発生する可能性があります。この問題を解決するには、次のいずれかの操作を実行します。

  1. 次のコマンドを入力して、SSO および SSOOIDC モジュールがインストールされていることを確認します。

    Install-AWSToolsModule SSO, SSOOIDC
  2. 以下の行を param() ブロックの下のスクリプトに挿入します。

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

関連リソース

追加情報

次のスクリプトで、以下のパラメータの値を更新する必要があるかどうかを判断します。

  • 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