ユーザーアクセスログ (UAL)¶
UAL とは¶
ユーザーアクセスログ (UAL) は Windows Server の機能で、Windows Server 2012 以降は既定でインストールされ、有効になっています。クライアントがサーバーの役割に対して行った要求を、ESE データベースに集計して記録します。役割、クライアントのアドレス、アカウントの組み合わせごとに、その年にクライアントが最初と最後に確認された日時、要求の総数、および年内の各日の要求数を保持します。対象となる役割には、File Server (SMB)、Active Directory Domain Services、Active Directory Certificate Services、DHCP Server、Print and Document Services、Remote Access、Web Server (IIS)、Windows Server Update Services などがあります。
UAL は横展開の調査に役立ちます。クライアントの行からは、どのアドレスとアカウントがどの日にサーバーを利用したかがわかり、その記録はイベント ログが上書きされた後も長く残っていることが少なくありません。
この証拠から判断できること: 記録されたアドレスのクライアントが、記録されたアカウントとして認証され、要求数が記録されている各日にその役割を利用しました。
保存場所と収集¶
C:\Windows\System32\LogFiles\Sum\Current.mdb
C:\Windows\System32\LogFiles\Sum\{GUID}.mdb (one per year)
C:\Windows\System32\LogFiles\Sum\SystemIdentity.mdb
C:\Windows\System32\LogFiles\Sum\Svc*.log, Svc.chk (transaction logs)
Current.mdb には最新のアクティビティが格納されます。SystemIdentity.mdb はサーバーについて記述し、役割の名前を定め、各年のデータを保持する {GUID}.mdb ファイルを一覧にしています (CHAINED_DATABASES)。UAL サービスはデータベースを開いたままにしているため、Sum ディレクトリ全体をフォレンジック コレクターで、またはボリューム スナップショットから収集してください。
ダーティなデータベース
稼働中のサーバーから収集した Current.mdb は、ダーティな状態であることがよくあります。Juntei は収集されたままの状態で読み取り、その状態を報告しますが、Svc*.log は再生しません。トランザクション ログにしか存在しないアクティビティは含まれません。
分析時の注意点¶
- UAL は要求を日ごとに集計するだけで、個々の要求を記録するわけではありません。クライアント行が持つ時刻は
InsertDateとLastAccessだけです。 DailyAccessesの日付は UTC 基準の日です。Addressはサーバーから見えたアドレスです。サーバーと実際のクライアントの間に NAT ゲートウェイ、プロキシ、VPN が介在している可能性があります。::1と127.0.0.1はサーバー自身です。Sumディレクトリのすべてのデータベースを解析してください。同じクライアントがCurrent.mdbと、その年の{GUID}.mdbの両方に行を持つことがあります。- 行がないことは、何も接続しなかったことの証明にはなりません。UAL は無効にできます (
Disable-Ual、または User Access Logging Service の停止による)。また、ダーティなデータベースには最新の変更が含まれていません。 SystemIdentity.mdbがない場合、RoleNameには Windows Server が各役割に付けている名前が使われます。LastAccessがゼロまたは不正な場合、その値から年を判断しません。有効なInsertDate、次に年別データベースのメタデータを使用し、年が不明な場合はDayOfYearを保持します。- 集計値はすべての収集元の行を合算した値です。
Current.mdb、年別データベース、スナップショットには重複があり得るため、重複を除いた接続数やログオン数として扱わないでください。
Juntei で解析する¶
Usage: juntei parse-ese ual <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find Current.mdb, {GUID}.mdb and SystemIdentity.mdb
-f, --file <FILE> Parse one UAL database
Output:
-o, --output <PATH> Directory of CSV tables, or JSON/JSONL file
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ese ual -d Sum -o ual-csv
juntei parse-ese ual -d Sum -t jsonl \
| jq 'select(.Table == "CLIENTS") | {Address, AuthenticatedUserName, RoleName, LastAccess}'
出力テーブル¶
CSV では、テーブルごとに 1 つのファイルが作成されます。テーブルが空の場合は、ヘッダーだけのファイルになります。JSON と JSONL の各行には、SourceFile (データベース) と Table (データベース内でのテーブル名) が含まれます。
| CSV ファイル | テーブル | 内容 |
|---|---|---|
UAL-Clients.csv |
CLIENTS |
各役割のクライアント: アドレス、アカウント、その年の最初と最後のアクセス、要求の総数と日ごとの要求数。 |
UAL-RoleAccess.csv |
ROLE_ACCESS |
各役割が最初と最後に使用された日時。 |
UAL-DNS.csv |
DNS |
アドレスとホスト名の組と、それぞれが最後に確認された日時。 |
UAL-VirtualMachines.csv |
VIRTUALMACHINES |
Hyper-V 仮想マシン: 識別子、シリアル番号、作成日時と最終アクティブ日時。 |
UAL-SystemIdentity.csv |
SYSTEM_IDENTITY |
サーバー自体: 名前、ドメイン、Windows のバージョン、製品の種類、ハードウェア、タイム ゾーン、最終起動。新しい行は、名前の変更、ドメインへの参加、ドメイン コントローラーへの昇格を示している場合があります。 |
UAL-ChainedDatabases.csv |
CHAINED_DATABASES |
各年の {GUID}.mdb ファイル。 |
UAL-Roles.csv |
ROLE_IDS |
役割の GUID とその名前。 |
UAL-<table>.csv |
その他のテーブル | Juntei が認識しないテーブルのすべての列。 |
フィールド¶
| フィールド | 解釈 |
|---|---|
SourceFile |
行の読み取り元のデータベース。 |
RoleGUID, RoleName |
役割と、データベースと同じ場所にある SystemIdentity.mdb から得たその名前 (ない場合は組み込みの名前)。 |
TenantID |
クライアントのテナントの GUID (役割がテナントを報告する場合)。 |
TotalAccesses |
データベースの年におけるクライアントの要求数。DailyAccesses の合計です。 |
InsertDate |
行が作成された日時。つまり、このデータベースにおけるクライアントのその年最初の要求です (UTC)。 |
LastAccess |
クライアントの最新の要求 (UTC)。 |
Address |
クライアントの IPv4 または IPv6 アドレス。 |
AuthenticatedUserName |
クライアントが認証に使用したアカウント (DOMAIN\user。コンピューター アカウントは末尾が $)。 |
ClientName |
クライアントの名前 (役割が報告する場合)。 |
DailyAccesses |
要求のあった日とその要求数。Day1 … Day366 列から取得し、LastAccess の年の日付として表します。CSV では 2023-01-12: 5, 2023-01-13: 2、JSON では Date と Accesses を持つオブジェクトになります。年が不明な日は、Date の代わりに DayOfYear を持ちます。 |
FirstSeen, LastSeen |
役割の最初と最後の使用 (ROLE_ACCESS)、DNS の組が最後に確認された日時 (DNS)。いずれも UTC です。 |
CreationTime, LastSeenActive |
仮想マシンまたは SYSTEM_IDENTITY 行が作成された日時と、仮想マシンが最後にアクティブだった日時 (UTC)。 |
OS-ProductType, OS-ProductTypeName |
1 Workstation、2 Domain Controller、3 Server。 |
OS-CurrentTimeZone |
サーバーの UTC からのオフセット (分単位。-420 は UTC-07:00)。 |
OS-LastBootUpTime |
サーバーの最終起動日時 (UTC)。読み取れない場合は、保存されている WMI のテキストのままです。 |
| その他の列 | テーブルのその他すべての列を、Juntei の PascalCase フィールド ラベルで出力します。例: SystemDNS-HostName、SystemDomainName、OS-BuildNumber、SystemSerialNumber。 |
自動解析¶
auto-parse は、テーブルを LateralMovement に UAL-Clients.csv、UAL-RoleAccess.csv などとして書き出し (-t json または -t jsonl の場合は 1 つの UAL.json または UAL.jsonl ファイル)、あわせて LateralMovement/UAL-logs.txt を作成します。結合された -j タイムラインにはすべての行が含まれ、Comp と Artifact 識別子 ual が付きます。-Z は InsertDate、LastAccess、FirstSeen、LastSeen、CreationTime、LastSeenActive、OS-LastBootUpTime を変換します。