PowerShellでActive Directoryログオンレポートを作成する

PowerShellを使用してActive Directoryログオンレポートを作成します。私たちが知っているように、セキュリティにとって、Active Directory(AD)環境での監査は重要です。ユーザーが何を行ったか、どのシステムにログインしたかを把握することは重要です。したがって、現在ほとんどの管理者が取り組んでいる重要なタスクの1つは、ユーザーがどこにログインしたかを見つけることです。この記事では、ドメインコントローラー(DC)上の組み込みのイベントビューアーを利用して、ユーザーがどこにログインしたかを見つけ、PowerShellを使用して包括的なログオンレポートを生成する手順を詳しく説明します。

では、さあ、PowerShellを使用してActive Directoryログオンレポートを作成する記事を続けましょう。

Active Directoryログオンレポートの作成

前提条件

イベントビューアー監視は数日間イベントを監視するために使用されるため、イベントログのサイズが十分であることを確認する必要があります。たとえこれらの設定をすでに有効にしているかもしれませんが、他の人がイベントログのサイズを増やす必要がある場合に備えて、再度確認します。

以前に構成を変更していない場合、イベントログのデフォルトのサイズ設定はおおよそ64 MBになるはずです。ただし、サイズを増やす必要がある場合、特に環境で複数のDCを扱う場合があります。たとえば、複数の日にわたって監査ログオンを追跡したい場合、イベントビューアーにははるかに多くのスペースが必要になります。

グループポリシーオブジェクトを作成します。

1. 環境の準備の最初のステップとして、グループポリシーオブジェクト(GPO)を作成し、イベントログサイズの設定を含めます。 グループポリシー管理コンソール(GPMC)を開き、GPO を作成します。コンソールを開くには、グループポリシー を検索するか、Run(Ctrl+R)ウィンドウにgpmc.msc と入力します。

2. ナビゲーションパネルで、フォレスト: ForestNameを展開し、ドメインを展開し、DomainNameを展開し、グループポリシーオブジェクトをクリックします。次に、アクションをクリックし、新規作成をクリックします。

3. 新しく作成された GPO 内の以下のパスを見つけてください:

4. 環境と要件に基づいて セキュリティ イベントのサイズを変更します。また、ディスク容量やパフォーマンスに関する懸念がない場合、最大レベルの 4 GB に設定することも可能です。

5. ドメインコントローラにファイアウォール設定がない場合、このステップはオプションです。ただし、複数の ドメインコントローラ および複数のサイトからイベントログをクエリできる必要があります。その結果、ファイアウォールを介して リモートイベント ログ 監視 が有効になっていることを確認することが重要です。

残念ながら、ファイアウォール設定の構成に関する詳細をすべてカバーすることはできません。ただし、以下のイメージには、リモートイベントログ監視 を有効にするために必要なすべての設定が示されています。

6. 今、私たちが作成したGPOをDomain Controllers OUに接続し、いくつかのイベントが発生するのを待ちます。イベントは環境に依存しますので、すぐに監査をクエリするか、数日待つことができます。ログ記録を正しく設定したので、次に記事の次のセクションで議論されるPowerShellスクリプトを実行することができます。

次は、PowerShellを使用してActive Directoryログオンレポートを作成する方法が記事の主要な部分です。お読みください。

PowerShellを使用してADログオンレポートを作成する

まず、スクリプトをダウンロードしてディレクトリまたはフォルダにコピーします。または、git がインストールされている場合、次のコマンドを実行できます。

git clone https://github.com/InfraSOS/Get-UserLastLogon.git

ActiveDirectory モジュールを使用していますが、スクリプトではそのモジュールを手動でインストールする必要はありません。スクリプトはシステム内のモジュールを確認します。ダウンロードしたら、PowerShellを起動し、ダウンロードしたスクリプトのフォルダーまたはドライブに移動します。

ダウンロードしたファイルを編集する場合、4つの主要な関数が表示されます。これらの4つの主要な関数はParamBeginProcess、およびEndです。

サイバー攻撃監視のためのトップ10のベストSIEMツールも読む

PowerShellスクリプトの説明

Paramセクションには、スクリプトを実行するために必要なパラメータが含まれています。以下のコードブロックに示すように、スクリプトを実行するためには3つのパラメータが必要です。これらのパラメータについて後で説明します。

param (
    [Parameter(Mandatory = $true)]
    [String]$User,

    [Parameter(Mandatory = $false)]
    [Array]$Server = @((Get-ADDomainController -Filter *).Name) ,

    [Parameter(Mandatory = $false)]
    [Array]$Days = 90
)

ベストプラクティスとして、変数や一般的な情報はメインのスクリプト部分が混雑しないようにBeginセクションに配置されます。

[Array]$Table         = $null
$DomainControllers    = $Server
$AllDomainControllers = @((Get-ADDomainController -Filter *).Name)
[Array]$ExclusionList = @($User,'krbtgt')
$DCCount              = $DomainControllers.Count
$UPN                  = ((get-addomain).DNSRoot).toUpper()
$DateFilter           = "-"+$days
$DateThen             = (((Get-Date).AddDays($DateFilter)).ToString("yyyy-MM-dd"))+"T20:30:00.000Z"
$DateNow              = (Get-Date -Format yyyy-MM-dd)+"T20:30:00.999Z"
$ForestRoot           = ((Get-ADForest).rootDomain).toUpper()
$Counter              = 0

Beginスクリプトはイベントログをクエリするための主要なフィルターも作成します。その後、スクリプトはこのフィルターを各DCに送信して情報を収集します。これらの行には、$UPN$Userなど、以前に説明した変数が含まれていることがわかります。

[xml]$FilterXML = @"


    *[System[(EventID=4769)
	and TimeCreated[@SystemTime>='$DateThen'
	and @SystemTime<='$DateNow']]]
	and*[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]


"@

プロセスセクションは、スクリプトがレポートを生成するためのデータをクエリする重要な機能です。以下のコードブロックは、別のDCにログインしてデータをクエリするたびに実行されるforeachコマンドです。

Foreach($DCName in $DomainControllers){...}

まず最初に、最初のDCでイベントを収集します。次に、各イベントから価値のある情報を抽出し、次のイベントに移る前にそれをオブジェクトに保存します。最初のDCで完了したら、スクリプトは別のDCに移動してプロセスを繰り返します。

最後に、エンドセクションで最終的に生成されたレポートが表示されます。

end{
    $Table = $Table | Where-Object {($_.Location -notin $AllDomainControllers) -and ($_.Location -ne $ForestRoot) -and ($_.Location -notin $ExclusionList)}
    $Table | Sort Time | FT Time,User,Location,Domain,DC -AutoSize
}

PowerShellスクリプトの実行

開始するには、PowerShellを開き、以下のコマンドを入力してcmdletをメモリに読み込みます。Enterキーを押すと、PowerShellの実行ポリシーによりスクリプトの実行が無効になる場合があり、エラーが表示されます。エラーが発生した場合は、管理特権を持つPowerShellコンソールを開き、以下のコマンドを入力してスクリプトの実行を許可し、前のコマンドを再実行します。

. .\Get-UserLastLogon.ps1

エンターキーを押すと、PowerShell実行ポリシーによりスクリプトの実行が無効になっている旨のエラーが表示されることがあります。エラーが発生した場合は、管理者権限でPowerShellコンソールを開き、以下のコマンドを入力してスクリプトの実行を許可し、前のコマンドを繰り返してください。

Set-ExecutionPolicy RemoteSigned
. .\Get-UserLastLogon.ps1

スクリプトが完全にロードされたので、これを例として、過去15日間でユーザーがログオンしたワークステーションを調べてみましょう。まず、 ユーザー名を–Userパラメーターとともに、–Daysパラメーターで期間を指定し、Enterキーを押してください。

Get-UserLastLogon -User marion -Days 15

ご存知かもしれませんが、-Server パラメータというもう一つのパラメータがあります。もし-Serverパラメータに値を提供しない場合、このパラメータを満たすためにすべてのドメインコントローラーを考慮します。さて、特定のDCを検索クエリの対象として指定したい場合は、-Serverパラメータの値として指定できます。

実行後、スクリプトはその状態と完了までにかかる時間を知らせる進行状況バーを表示します。さて、スクリプトを実行した後に生成されたレポートを見ることができます。レポートは、ユーザーが過去15日間にサインインしたワークステーションを教えてくれます。

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

PowerShellスクリプトの理解

スクリプトを実行すると、最初にユーザーアカウントが存在するかどうかを確認します。したがって、入力されたユーザー名やIDが存在しない場合、残りのスクリプトを実行する必要はありません。

次のステップで、必要な変数を計算し、それらをDCに送信します。また、選択したユーザーのイベントに関してクエリを実行するために必要なフィルターも送信します。最後に、スクリプトはリスト内の最初のドメインコントローラーにリクエストを送信し、選択したユーザーに関連するクエリされたイベントを変数に保存します。

スクリプトが開始する保存されたイベントのリストと、その後のステップでは、イベントから貴重なデータを収集することになります。最後に、スクリプトは抽出されたデータをドメイン、DC名、ログイン時間、ログインワークステーションなどの変数に割り当てます。

最後に、スクリプトは次のDCを実行し、プロセスを繰り返します。

スクリプトが最後のDCと連絡を取り、その情報を収集すると、コンピューターのリストを表示します。

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

PowerShellでActive Directoryログオンレポートを作成することをお読みいただきありがとうございます。結論に入ります。

Active Directoryログオンレポートの結論

このガイドでは、エッセンシャルなイベントビューアの使い方と、それをPowerShellスクリプトと組み合わせて、ユーザーがログオンしたワークステーションのリストを見つける方法について学びました。スクリプトはドメイン内のすべてのDCをクエリし、結果を見つけ、読みやすい形式に解析してレポートとしてエクスポートします。提供されたスクリプトを実行する前に、前提条件のチェックを実行することを忘れないでください。

Source:
https://infrasos.com/create-active-directory-logon-reports-with-powershell/