ファイルサーバのアクセスログをPowerShellで取得する

# はじめに
監査ログを調べると「いつ・誰が・何をしたか」を知ることができ、システムの運用が法規制、セキュリティ評価基準、社内規定等の監査基準に準拠していることを証明できる。内部統制の構築には欠かせないものと言えよう。
Windowsでは、監査ポリシーを設定するだけで、イベントログに監査ログを出力できる。

# 前提環境
本記事では **Windows Server 2016 Datacenter** で解説するが、すべてのエディションで使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/8abc3567-be9d-2e6f-6844-bc1391fba9ac.png)
**Datacenter** とは文字通りデータセンタ環境用のエディションだ。
仮想化により多数のサーバを運用する大企業や、大量のサーバを保有してデータセンタを運用する企業（＝クラウド事業者）向けのエディションである。

# 監査ポリシーの設定手順
ActiveDirectory環境下でドメインコントローラの監査をする場合と、ローカル環境下でファイルサーバなどの監査をする場合とで、最初の手順が異なる。
本記事では、ローカルグループポリシーから、ファイルサーバの監査ポリシーを設定する。
なお、ActiveDirectoryのグループポリシーでは、ドメインやOU単位で監査ポリシーを設定できる。

## ローカルグループポリシーエディタの設定
まず、ファイルサーバに管理者権限を持ったユーザーでログオンしよう。

### gpedit.msc を実行
ローカルグループポリシーエディタで **[オブジェクトアクセス]－[ファイルシステムの監査]** をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5d419e10-6f75-6107-e7d8-66e26342401c.png)

### ファイルシステムの監査のプロパティ
監査のプロパティが表示されるので、今回は、成功・失敗ともにチェックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/a6171f73-663f-03ac-b3eb-4c1dd9fec238.png)

## 監査対象フォルダの設定
- エクスプローラで、監査対象にしたいフォルダまたはファイルを右クリックし、**[プロパティ]** を選択する。
- **[セキュリティ]** タブで **[詳細設定]** をクリックする。

### 監査エントリの追加
**[監査]** タブで **[追加]** をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/605799d2-63f2-07e8-99f4-4175931d2e6c.png)

**[プリンシパルの選択]** をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/66dc967a-8d45-a1cb-6b2f-be7b85ed3bb7.png)

**「選択するオブジェクト名を入力してください」**に `Everyone`（すべてのユーザー）と入力する。
もちろん `Everyone` の代わりにユーザー名やグループ名を入力することもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5f321be8-3aaa-eb79-fdce-f6a34645fb89.png)

ファイルに対するアクセスに、成功しても失敗しても検知したいので**「すべて」**を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/03c1a7bc-d87f-4b2e-d257-d3109a4ec604.png)

**[高度なアクセス許可]** を表示し、今回は、次のようにチェックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/589ab8f2-9c13-e041-a13a-8204492511b9.png)

# 監査ログの確認
これで監査ログの記録が開始されるので、さっそくイベントビューアから **[Windowsログ]－[セキュリティ]** で監査ログを確認してみよう。
アクセスのあったファイル／フォルダ名が、オブジェクト名に表示されているはずだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/4c54f81d-418e-8010-8e19-d4e1f3bf14bc.png)

ついでに **[XMLで表示]** に切り替えて、取得したいデータのXML階層イメージも確認しておこう。
**PowerShell**の`Get-WinEvent`コマンドレットからXML階層を辿るときに必要な情報だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/4b8c706b-313f-b5e0-815d-a92fc2e2854a.png)

**[プロパティ]** からログの最大サイズを変更できる。取りこぼしの無いよう、充分なサイズを確保しておこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/a508deeb-bb44-8ca8-89a4-3760bdb9744c.png)

## PowerShellのコーディング例
ファイルサーバでPowerShellコンソールを起動し、下のコードをそのまま貼り付けるだけで動くはずだ。
今回は、セキュリティイベントの`ID`に4663（ファイルアクセス）を指定しフィルタリングしている。

```powershell:PowerShell
$AccessMaskHash = @{ '0x1' = '読込'; '0x2' = '書込'; '0x4' = '追加'; '0x10000' = '削除'}
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ProviderName = 'Microsoft-Windows-Security-Auditing'
    ID = 4663
} | %{
    $xml = [XML]$_.ToXml()   # EventDataにアクセスするためにXML化

    $FileName = ($xml.Event.EventData.Data | ?{$_.Name -eq 'ObjectName'}).'#text'
    if (! $FileName.StartsWith('E:\SHARED\')) { return }

    $AccessMaskCode = ($xml.Event.EventData.Data | ?{$_.Name -eq 'AccessMask'}).'#text'
    if (! $AccessMaskHash.ContainsKey($AccessMaskCode)) { return }
    $AccessMaskName = $AccessMaskHash[$AccessMaskCode]

    $TimeCreated = ([DateTime]$xml.Event.System.TimeCreated.SystemTime).ToString('yyyy/MM/dd hh:mm:ss')
    $UserName = ($xml.Event.EventData.Data | ?{$_.Name -eq 'SubjectUserName'}).'#text'

    echo "$TimeCreated,$AccessMaskName,$UserName,$FileName"
}
```
- すべてのセキュリティイベントの一覧は [Windows security audit events](https://www.microsoft.com/en-us/download/details.aspx?id=50034) からExcel形式でダウンロードできるので参考にして欲しい。ちょっと書き換えればログオン／ログオフの追跡もできるはずだ。
- `Get-WinEvent`コマンドレットの使い方は [Windows PowerShell のヘルプ - Get-WinEvent](https://forsenergy.com/ja-jp/windowspowershellhelp/html/62e7642c-51d4-47d1-97fe-62b08197896a.htm) が詳しいので併せて参照して欲しい。

## 実行結果
出力をExcelに貼り付けたものを示す。（アカウント名やファイル名は架空）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/a5cb2e62-0299-0357-7ef1-d6faa4b881b2.png)