次の方法で共有


JEA の監査とレポート

JEA をデプロイしたら、JEA 構成を定期的に監査する必要があります。 監査は、適切なユーザーが JEA エンドポイントにアクセスでき、割り当てられたロールがまだ適切であることを評価するのに役立ちます。

マシンで登録済みの JEA セッションを検索する

コンピューターに登録されている JEA セッションを確認するには、 Get-PSSessionConfiguration コマンドレットを 使用します。

# Filter for sessions that are configured as 'RestrictedRemoteServer' to
# find JEA-like session configurations
Get-PSSessionConfiguration | Where-Object { $_.SessionType -eq 'RestrictedRemoteServer' }
Name          : JEAMaintenance
PSVersion     : 5.1
StartupScript :
RunAsUser     :
Permission    : CONTOSO\JEA_DNS_ADMINS AccessAllowed, CONTOSO\JEA_DNS_OPERATORS AccessAllowed,
                CONTOSO\JEA_DNS_AUDITORS AccessAllowed

エンドポイントの有効な権限は、 Permission プロパティに一覧表示されます。 これらのユーザーには、JEA エンドポイントに接続する権限があります。 ただし、アクセスできるロールとコマンドは、エンドポイントの登録に使用されたセッション構成ファイルRoleDefinitions プロパティによって決まります。 RoleDefinitions プロパティを展開して、登録済みの JEA エンドポイントのロール マッピングを評価します。

# Get the desired session configuration
$jea = Get-PSSessionConfiguration -Name 'JEAMaintenance'

# Enumerate users/groups and which roles they have access to
$jea.RoleDefinitions.GetEnumerator() | Select-Object Name, @{
  Name = 'Role Capabilities'
  Expression = { $_.Value.RoleCapabilities }
}

マシンで使用可能なロール機能を見つける

JEA は、PowerShell モジュール内の .psrc フォルダーに格納されている ファイルからロール機能を取得します。 次の関数は、コンピューターで使用できるすべての役割機能を検索します。

function Find-LocalRoleCapability {
    $results = @()

    # Find modules with a "RoleCapabilities" subfolder and add any PSRC files to the result set
    Get-Module -ListAvailable | ForEach-Object {
        $psrcpath = Join-Path -Path $_.ModuleBase -ChildPath 'RoleCapabilities'
        if (Test-Path $psrcpath) {
            $results += Get-ChildItem -Path $psrcpath -Filter *.psrc
        }
    }

    # Format the results nicely to make it easier to read
    $results | Select-Object @{ Name = 'Name'; Expression = { $_.Name.TrimEnd('.psrc') }}, @{
        Name = 'Path'; Expression = { $_.FullName }
    } | Sort-Object Name
}

この関数の結果の順序は、複数のロール機能が同じ名前を共有している場合にロール機能が選択される順序であるとは限りません。

特定のユーザーの有効な権限を確認する

Get-PSSessionCapability コマンドレットは、ユーザーのグループ メンバーシップに基づいて、JEA エンドポイントで使用できるすべてのコマンドを列挙します。 Get-PSSessionCapabilityの出力は、JEA セッションでGet-Command -CommandType Allを実行している指定されたユーザーの出力と同じです。

Get-PSSessionCapability -ConfigurationName 'JEAMaintenance' -Username 'CONTOSO\Alice'

ユーザーが追加の JEA 権限を付与するグループの永続的なメンバーでない場合、このコマンドレットはそれらの追加のアクセス許可を反映していない可能性があります。 これは、Just-In-Time 特権アクセス管理システムを使用して、ユーザーがセキュリティ グループに一時的に属できるようにする場合に発生します。 ロールと機能へのユーザーのマッピングを慎重に評価して、ユーザーが自分のジョブを正常に実行するために必要なアクセス レベルのみを取得するようにします。

PowerShell イベント ログ

システムでモジュールまたはスクリプト ブロックのログ記録を有効にした場合、ユーザーが JEA セッションで実行するコマンドごとに Windows イベント ログにイベントを表示できます。 これらのイベントを見つけるには、 Microsoft-Windows-PowerShell/Operational イベント ログを開き、イベント ID 4104 のイベントを探します。

各イベント ログ エントリには、コマンドが実行されたセッションに関する情報が含まれます。 JEA セッションの場合、イベントには ConnectedUserRunAsUser に関する情報が含まれます。 ConnectedUser は、JEA セッションを作成した実際のユーザーです。 RunAsUser は、コマンドの実行に使用されるアカウント JEA です。

アプリケーション イベント ログには、 RunAsUser によって行われた変更が表示されます。 そのため、特定のコマンド呼び出しを ConnectedUser にトレースし直すには、モジュールとスクリプトのログ記録を有効にする必要があります。

アプリケーション イベント ログ

外部アプリケーションまたはサービスと対話する JEA セッションで実行されるコマンドは、イベントを独自のイベント ログに記録する場合があります。 PowerShell のログやトランスクリプトとは異なり、他のログ記録メカニズムでは JEA セッションの接続ユーザーはキャプチャされません。 代わりに、これらのアプリケーションは仮想実行ユーザーのみをログに記録します。 コマンドを実行したユーザーを特定するには、 セッション トランスクリプト を参照するか、PowerShell イベント ログをアプリケーション イベント ログに表示される時刻とユーザーと関連付ける必要があります。

WinRM ログは、アプリケーション イベント ログ内の接続ユーザーに実行ユーザーを関連付けるのにも役立ちます。 Microsoft-Windows-Windows Remote Management/Operational ログのイベント ID 193 は、接続しているユーザーのセキュリティ識別子 (SID) とアカウント名を記録し、新しい JEA セッションごとにユーザーとして実行します。

セッション トランスクリプト

各ユーザー セッションのトランスクリプトを作成するように JEA を構成した場合、すべてのユーザーのアクションのテキスト コピーが指定されたフォルダーに格納されます。

次のコマンド (管理者として) は、すべてのトランスクリプト ディレクトリを検索します。

Get-PSSessionConfiguration |
  Where-Object { $_.TranscriptDirectory -ne $null } |
    Format-Table Name, TranscriptDirectory

各トランスクリプトは、セッションが開始された時刻、セッションに接続したユーザー、およびそれらに割り当てられた JEA ID に関する情報で始まります。

**********************
Windows PowerShell transcript start
Start time: 20160710144736
Username: CONTOSO\Alice
RunAs User: WinRM Virtual Users\WinRM VA_1_CONTOSO_Alice
Machine: SERVER01 (Microsoft Windows NT 10.0.14393.0)
[...]

トランスクリプトの本文には、ユーザーが呼び出した各コマンドに関する情報が含まれています。 使用されるコマンドの正確な構文は、PowerShell リモート処理用にコマンドを変換する方法のため、JEA セッションでは使用できません。 ただし、実行された有効なコマンドは引き続き確認できます。 JEA セッションで Get-Service Dns を実行しているユーザーからのトランスクリプト スニペットの例を次に示します。

PS>CommandInvocation(Get-Service): "Get-Service"
>> ParameterBinding(Get-Service): name="Name"; value="Dns"
>> CommandInvocation(Out-Default): "Out-Default"
>> ParameterBinding(Out-Default): name="InputObject"; value="Dns"

Running  Dns                DNS Server

CommandInvocation 行は、ユーザーが実行するコマンドごとに書き込まれます。 ParameterBindings は、 コマンドで指定された各パラメーターと値を記録します。 前の例では、パラメーター Name コマンドレットの値 Get-Service が指定されていることがわかります。

各コマンドの出力は、通常するOut-Defaultをトリガーします。 Out-Default は、コマンドから返される PowerShell オブジェクトです。 そのオブジェクトの詳細は、ユーザーが見た内容を厳密に模倣して、下に数行印刷されます。

こちらも参照ください

PowerShell ♥ のブルーチームに関するセキュリティブログ投稿