ファイルシステムオブジェクトアクセスイベント監査を使用して、特定のファイルを作成、削除、または変更した特定のユーザーを識別できます。 この記事では、Windows Server2016の共有ネットワークフォルダー上のファイルのイベント監査を構成する方法を説明します。 監査を構成した後、イベントビューアーからの情報を使用して、ファイルサーバー上の特定のファイルを削除したユーザーを見つけることができます。
Windowsでファイルおよびフォルダアクセス監査ポリシーを有効にするにはどうすればよいですか?
既定では、Windows Serverではファイルシステムオブジェクトアクセス監査は有効になっていません。 グループポリシーを使用して監査設定を有効にして構成できます。 複数のサーバーまたはコンピューターで監査ポリシーを有効にする必要がある場合は、ドメインGpoを使用できます(gpmc.msc
mmcコンソールを使用して構成可能)。 1つのサーバーでのみ監査を構成する場合は、ローカルグループポリシーエディターを使用できます。
- ローカルグループポリシーエディターコンソールを開きます–
gpedit.msc
; - WINDOWS設定->セキュリティ設定->高度な監査ポリシー構成->オブジェクトアクセス;
- 監査ファイルシステムポリシーを開き、アクセス成功イベントのみをフ; また、Windows設定->セキュリティ設定->ローカルポリシー->監査ポリシーのAudit Object Access policyを使用して、ローカルオブジェクトアクセスの監査を有効にすることもで ただし、NTFSアクセスイベントのみを追跡するため、ファイルシステム監査ポリシーを使用することをお勧めします。
- 次のコマンドを使用して変更を保存し、ローカルグループポリシー設定を更新します。
gpupdate /force
。
共有フォルダのファイル削除監査設定の構成
アクセスを追跡する共有ネットワークフォルダのプロパティで監査を構成する必要があります。 ファイルエクスプローラーを実行し、フォルダプロパティを開きます。 [セキュリティ]タブに移動します。 詳細設定ボタン->をクリックして、監査タブに移動します。
“このオブジェクトの監査プロパティを表示するには、管理者であるか、適切な権限を与えられている必要があります”というメッセージが表示され
次に、追加ボタンをクリックして、監査イベントをキャプチャするユーザーまたはグループを指定します。 すべてのユーザーのアクセスイベントを追跡する場合は、Everyoneグループを指定します。
次に、オブジェクトへのアクセスに使用されるアクセス許可をログに記録する必要があります。 ファイル削除イベントのみをイベントログに保存するには、[詳細権限の表示]ボタンをクリックします。 イベントリストで、フォルダとファイルの削除イベントの監査のみを残します–サブフォルダとファイルの削除と削除。
$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
これで、ユーザーが共有ネットワークフォルダー内のファイルまたはフォルダーを削除すると、ファイルシステム->監査成功ファイル削除イベントが、Microsoft Windowsセキ
イベントビューアmmcコンソール(eventvwr.msc
)を開き、Windowsログ->セキュリティセクションを展開します。 EventID4663でイベントログフィルタを有効にします。
残りのイベントのいずれかをイベントビューアーで開きます。 ご覧のとおり、削除されたファイルの名前、ファイルを削除したユーザーのアカウント、およびプロセス名に関する情報が含まれています。
An attempt was made to access an object.Subject:Security ID: CORP\jsmithAccount Name: jsmithAccount Domain: CORPLogon ID: 0x32B12627Object:Object Server: SecurityObject Type: FileObject Name: E:\Distr\Backup.rarHandle ID: 0x7bc4Resource Attributes: S:AIProcess Information:Process ID: 0x4Process Name:Access Request Information:Accesses: DELETEAccess Mask: 0x10000
のユーザー名を持つファイル削除監査イベント4663ファイルアクセス監査ポリシーを有効にした後、セキュリティログにあります:
- ファイルを削除するために使用されたアプリケーション(プロセス)
- 復元するバックアップの日付は何ですか。ファイル削除イベントを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データベースにアクセスする方法の例は、PowerShellを使用したMySQLデータベースのクエリの記事で以前に検討しました。Microsoft SQL Serverデータベースを使用する場合は、記事「PowerShellからMSSQL Serverクエリを実行する方法」を参照してください。”
現在の日のセキュリティログからEventID4663を使用してイベントを取得するには、次のPowerShellスクリプトを使用します:
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = $_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data."#text"
$User = $event.Event.EventData.Data."#text"
$Computer = $event.Event.System.computer
}
}次のPowerShellスクリプトは、取得したデータをリモートサーバー上のMySQLデータベース(IPアドレス)に書き込みます10.1.1.13):
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = @{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 = $_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data."#text"
$File = $File.Replace('\','|')
$User = $event.Event.EventData.Data."#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()