監査ポリシーを使ってWindows Serverでファイルを削除したユーザーを特定する方法
ファイルシステムオブジェクトへのアクセスに関するイベント監査を活用すれば、特定のファイルを作成・削除・変更したユーザーを正確に特定できます。本記事では、Windows Server 2016の共有ネットワークフォルダ上のファイルに対してイベント監査を設定する手順を詳しく解説します。監査を有効化した後は、イベントビューアーの情報をもとに、共有フォルダから特定のファイルを削除したユーザーを突き止められるようになります。
なお、共有ネットワークフォルダからファイルを削除した場合、そのファイルはユーザーのごみ箱には移動されず、即座に完全削除される点に注意してください。また、共有フォルダ上で現在開かれているファイルの一覧は、以下の手順で取得できます。
Windowsでファイルおよびフォルダアクセスの監査ポリシーを有効にする方法
デフォルトでは、Windows Serverのファイルシステムオブジェクトアクセス監査は無効になっています。監査設定はグループポリシーを使って有効化・構成できます。複数のサーバーやコンピューターに監査ポリシーを適用したい場合は、ドメインGPO(gpmc.msc MMCコンソールで構成可能)を利用すると効率的です。単一のサーバーのみに監査を設定する場合は、ローカルグループポリシーエディターを使用しましょう。
- ローカルグループポリシーエディター(
gpedit.msc)を開きます。 - 高度な監査ポリシーのセクションへ移動します:Windowsの設定 → セキュリティの設定 → 高度な監査ポリシーの構成 → オブジェクトアクセス
- ファイルシステムの監査ポリシーを開き、ファイルシステムオブジェクトへのアクセス成功イベントのみを記録するよう指定します(次の監査イベントを構成する → 成功)。なお、Windowsの設定 → セキュリティの設定 → ローカルポリシー → 監査ポリシー配下のオブジェクトアクセスの監査ポリシーでもローカルオブジェクトのアクセス監査を有効化できますが、NTFSアクセスイベントのみを追跡できる「ファイルシステムの監査」ポリシーの方が推奨されます。
- 変更を保存し、コマンド
gpupdate /forceを実行してローカルグループポリシーを更新します。
共有フォルダにおけるファイル削除監査の設定
次に、アクセスを追跡したい共有ネットワークフォルダのプロパティで監査を構成します。エクスプローラーを起動してフォルダのプロパティを開き、セキュリティタブを選択します。詳細設定ボタンをクリックし、監査タブへ移動してください。
「このオブジェクトの監査プロパティを表示するには、管理者であるか、適切な権限が付与されている必要があります」というメッセージが表示された場合は、続行ボタンをクリックします。
続いて追加ボタンをクリックし、監査イベントを収集対象とするユーザーまたはグループを指定します。すべてのユーザーのアクセスイベントを追跡したい場合は、Everyoneグループを指定します。
次に、どのアクセス権限をログに記録するかを指定します。イベントログにファイル削除イベントのみを保存したい場合は、詳細なアクセス許可の表示ボタンをクリックし、イベント一覧からフォルダとファイルの削除に関わる項目――削除およびサブフォルダとファイルの削除――のみ監査対象として残します。
ヒント: Windowsオブジェクトの監査ポリシーは追加の計算リソースを消費します。慎重に運用し、監査対象のオブジェクト数と記録するイベント数は常に最小限に抑えるようにしましょう。
以下のPowerShellスクリプトを使えば、フォルダの監査設定をコマンドラインから一括構成することも可能です。
$Path = "E:\Public"
$AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone', 'Delete,DeleteSubdirectoriesAndFiles', 'none', 'none', 'Success')
$Acl = Get-Acl -Path $Path
$Acl.AddAuditRule($AuditChangesRules)
Set-Acl -Path $Path -AclObject $AclイベントID 4663でファイル削除者を確認する
ここまでの設定が完了すると、ユーザーが共有ネットワークフォルダ内のファイルやフォルダを削除するたびに、Microsoft Windows security auditingソースからのイベントID 4663(ファイルシステム → 監査成功)として、セキュリティログに削除イベントが記録されます。
イベントビューアーMMCコンソール(eventvwr.msc)を開き、Windowsログ → セキュリティセクションを展開します。イベントID 4663でフィルターを有効にすると、該当イベントだけを絞り込んで表示できます。
残ったイベントのいずれかを開くと、削除されたファイル名、ファイルを削除したユーザーアカウント、プロセス名などの情報が確認できます。
An attempt was made to access an object.
Subject:Security ID: CORP\jsmith
Account Name: jsmith
Account Domain: CORP
Logon ID: 0x32B12627
Object:Object Server: Security
Object Type: File
Object Name: E:\Distr\Backup.rar
Handle ID: 0x7bc4
Resource Attributes: S:AI
Process Information:
Process ID: 0x4
Process Name:
Access Request Information:
Accesses: DELETE
Access Mask: 0x10000
ファイルアクセス監査ポリシーを有効化すると、セキュリティログから以下の情報を把握できるようになります。
- 誰がいつ共有ネットワークフォルダからファイルを削除したのか
- どのアプリケーション(プロセス)を使ってファイルが削除されたのか
- 復元すべきバックアップの日付
ファイル削除イベントをSQLデータベース(MySQL/MSSQL)に記録する方法
ただし、削除ファイルの監査を有効にしていても、ログの中から目的の情報を見つけ出すのは容易ではありません。第一に、数千件規模のイベントの中から特定のエントリを探すのは困難です(Windowsには柔軟なフィルターでイベントを検索できる便利なツールがありません)。第二に、ファイルがかなり前に削除されていた場合、新しいイベントによって上書きされ、ログから消失している可能性があります。
そこで、すべてのファイル削除イベントをSQLデータベースに保存する方法が有効です。イベントの保存先としては、Microsoft SQL Server、Elasticsearch、MySQL/MariaDBなどが利用できます。
本記事の例では、MySQL上の専用データベーステーブルに監査イベントを記録する方法を紹介します。使用するテーブルの形式は以下の通りです。
- サーバー名
- 削除されたファイル名
- 日時
- ファイルを削除したユーザー名
このテーブルを作成するMySQLクエリは次のようになります。
CREATE TABLE deleted_items (id INT NOT NULL AUTO_INCREMENT, server VARCHAR(100), file_name VARCHAR(255), dt_time DATETIME, user_name VARCHAR(100), PRIMARY KEY (ID));注: PowerShellからMySQLデータベースへアクセスする方法については、「Querying MySQL Database with PowerShell」の記事も参考にしてください。Microsoft SQL Serverを使用したい場合は、「How to run a MSSQL Server Query from PowerShell?」の記事をご覧ください。
当日分のイベントID 4663をセキュリティログから取得するには、次のPowerShellスクリプトを使用します。
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
}
}次のPowerShellスクリプトは、取得したデータをリモートサーバー(IPアドレス10.1.1.13)上のMySQLデータベースに書き込みます。
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$File = $File.Replace('\','|')
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
$sql.CommandText = "INSERT INTO deleted_items (server,file_name,dt_time,user_name ) VALUES ('$Computer','$File','$Time','$User')"
$sql.ExecuteNonQuery()
}
}
$Reader.Close()
$Connection.Close()イベントを外部データベースに保存した後は、このイベントログをクリアしても問題ありません。
これで、「AnnualReport.DOC」というファイルを誰が削除したのかを調べたい場合は、PowerShellコンソールで次のスクリプトを実行するだけで済みます。
$DeletedFile = "%AnnualReport.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$MYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$MYSQLCommand.Connection=$Connection
$MYSQLCommand.CommandText="SELECT user_name,dt_time from deleted_items where file_name LIKE '$DeletedFile'"
$MYSQLDataAdapter.SelectCommand=$MYSQLCommand
$NumberOfDataSets=$MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
foreach($DataSet in $MYSQLDataSet.tables[0])
{
write-host "User:" $DataSet.user_name "at:" $DataSet.dt_time
}
$Connection.Close()これにより、PowerShellコンソール上でファイルを削除したユーザー名と削除時刻を確認できます。
注: 「\」記号がデータベースに書き込まれない不具合が確認されているため、代わりに「|」に置換しています。ファイルへのフルパスを表示したい場合は、データベースから選択する際に逆置換を行ってください:$DataSet.file_name.Replace('|','\')。
イベントログからデータベースへ情報を書き込むスクリプトは、タスクスケジューラを使って一日の終わりに実行するか、ファイル削除イベント(On Event)にトリガーを紐付けて実行する方法があります。後者はより多くのリソースを消費するため、システム要件に応じて使い分けるとよいでしょう。
ヒント: セキュリティイベントログファイルの最大サイズを、一日分のすべてのイベントを記録できる十分な容量に設定しておいてください。そうしないと、データベースへのエクスポートタスクを一日一回よりも頻繁に、あるいはトリガー連動で実行する必要が出てきます。一般的に、ワークステーションのログの最大サイズは少なくとも64MB、Windowsファイルサーバーでは262MB以上が推奨されます。古いイベントを上書きするオプション(必要に応じてイベントを上書きする)は有効のままにしておきましょう。
必要であれば、簡単なPHP Webページを作成し、ファイルを削除したユーザーの情報をより見やすい形で表示することも可能です。
重要な注意点: ログに「ファイルがユーザーによって削除された」という記録があっても、すぐに意図的または悪意のある行為だと判断しないでください。多くのプログラム(特にMS Officeアプリケーション)は、変更を保存する際に一時ファイルを作成し、その後旧バージョンのファイルを削除します。この場合は、ファイルを削除したプロセス名(ProcessNameフィールド)のログ記録を有効にし、それに基づいてファイル削除イベントを解析するか、winword.exeやexcel.exeなどといったプロセス由来のイベントをフィルタリングで除外するとよいでしょう。
ファイル削除監査イベントをテキストファイルに記録する方法
専用のデータベースサーバーを使用したくない場合は、ファイル削除監査イベントをプレーンテキストのログファイルに保存することもできます。以下のPowerShellスクリプトを使えば、出力結果をテキストファイルに保存できます。
$Outfile = "C:\Logs\Deleted-file-history-log.txt"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$strLog = $Computer + " " + $File + " " + $Time + " " + $User
$strLog | out-file $Outfile –append
}
}以上、共有ネットワークフォルダから削除されたファイルに関する情報を監査・保存するための基本的な考え方とシステムモデルを紹介しました。必要に応じて、自社の要件に合わせて容易にカスタマイズできます。
-
Windows 7/8/10で完全に削除されたファイルを復元する方法【ソフトあり・なし両方解説】
誰でも一度は、不要だと思ってパソコンからファイル(写真、音声、動画、ドキュメントなど)を完全に削除したことがあるはずです。ところが後になって、そのファイルがどうしても必要になり、しかも代わりとなるものが存在しない――そんな場面に直面することがあります。さらに、ごみ箱からも復元できないとなれば、絶望的に感じるかもしれません。 しかし、諦める必要はありません。Windowsシステム上で削除されたファイルを検索・復元する方法は実はいくつも存在します。本記事では、Windowsで完全に削除されたファイルを復元できる、確実な方法をいくつかご紹介します。その前にまず、削除されたファイルは本当に完全に失われ
-
Windows 10/8/7でShift+Deleteしたファイルを復元する方法
「もう使わないだろう」と思ってファイルをShift+Deleteで完全に削除してしまった、あるいは誤って大事なファイルを消してしまった——そんな経験はありませんか?ご安心ください。これは誰にでも起こりうるミスであり、しかも取り返しがつきます。そう、Shiftキーを使って削除したファイルでも復元できるのです。 ただし、サードパーティ製ソフトウェアの助けなしに簡単に復元することはできません。この記事では、Windows 10、8、7でShift+Deleteによって削除されたファイルを復元できるおすすめのソフトウェアをご紹介します。 その前に、まずは「見えなくなった削除済みファイルがなぜ復元できる