Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Bạn có thể sử dụng kiểm tra truy cập đối tượng hệ thống tệp để xác định người dùng cụ thể đã tạo, xóa hoặc sửa đổi một tệp cụ thể. Trong bài viết này, chúng tôi sẽ chỉ cách cấu hình kiểm tra sự kiện cho tệp trên thư mục chia sẻ mạng trên Windows Server 2016. Sau khi cấu hình kiểm tra, bạn có thể dùng thông tin từ Event Viewer để tìm người dùng đã xóa tệp cụ thể trên file server.

Khi bạn xóa tệp từ thư mục chia sẻ mạng, nó bị xóa ngay lập tức thay vì được gửi vào recycle bin của người dùng. Danh sách các tệp mở trên thư mục chia sẻ có thể được lấy như sau.

Cách bật chính sách kiểm tra truy cập tệp và thư mục trên Windows?

Theo mặc định, kiểm tra truy cập đối tượng hệ thống tệp không được bật trên Windows Server. Bạn có thể bật và cấu hình cài đặt kiểm tra bằng Group Policy. Nếu cần bật chính sách kiểm tra trên nhiều server hoặc máy tính, bạn có thể dùng domain GPO (có thể cấu hình bằng console mmc gpmc.msc). Nếu bạn chỉ muốn cấu hình kiểm tra trên một server, bạn có thể dùng Local Group Policy Editor.

  1. Mở console Local Group Policy Editor – gpedit.msc;
  2. Đi đến phần GPO với chính sách kiểm tra nâng cao: Windows Settings → Security Settings → Advanced Audit Policy Configuration → Object Access;
  3. Mở chính sách Audit File System và chỉ định bạn muốn ghi log chỉ các sự kiện truy cập thành công vào đối tượng hệ thống tệp (Configure the following audit events → Success); Bạn cũng có thể bật kiểm tra truy cập đối tượng cục bộ bằng chính sách Audit Object Access trong Windows Settings → Security Settings → Local Policy → Audit Policy. Tuy nhiên, dùng chính sách File System Audit là ưu tiên vì nó chỉ theo dõi sự kiện truy cập NTFS. Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy
  4. Lưu thay đổi và cập nhật cài đặt Local Group Policy bằng lệnh: gpupdate /force.

Cấu hình cài đặt kiểm tra xóa tệp trên thư mục chia sẻ

Bây giờ bạn cần cấu hình kiểm tra trong thuộc tính của thư mục chia sẻ mạng bạn muốn theo dõi truy cập. Mở File Explorer và mở thuộc tính thư mục. Đi đến tab Security. Nhấp nút Advanced → chuyển đến tab Auditing.

Nếu thông báo "You must be an administrator or have been given the appropriate privileges to view the audit properties of this object" xuất hiện, nhấp nút Continue.

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Sau đó nhấp nút Add để chỉ định người dùng hoặc nhóm bạn muốn ghi nhận sự kiện kiểm tra. Nếu bạn muốn theo dõi sự kiện truy cập cho tất cả người dùng, chỉ định nhóm Everyone.

Sau đó bạn cần chỉ định quyền nào được dùng để truy cập đối tượng sẽ được ghi log. Để chỉ lưu sự kiện xóa tệp trong Event Log, nhấp nút Show advanced permissions. Trong danh sách sự kiện, chỉ giữ kiểm tra cho sự kiện xóa thư mục và tệp – Delete và Delete subfolders and files.

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Mẹo. Nhớ rằng chính sách kiểm tra cho đối tượng Windows yêu cầu tài nguyên tính toán bổ sung. Sử dụng thận trọng, luôn cố gắng giảm thiểu số lượng đối tượng và sự kiện kiểm tra cần ghi log.

$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

Bây giờ, nếu người dùng xóa bất kỳ tệp hoặc thư mục nào trong thư mục chia sẻ mạng, sự kiện File System → Audit Success xóa tệp xuất hiện trong Security log với Event ID 4663 từ nguồn Microsoft Windows security auditing.

Mở console mmc Event Viewer (eventvwr.msc), mở rộng phần Windows Logs → Security. Bật bộ lọc log sự kiện theo EventID 4663.

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Mở bất kỳ sự kiện nào còn lại trong Event Viewer. Như bạn thấy, nó chứa thông tin về tên tệp bị xóa, tài khoản người dùng đã xóa tệp và tên tiến trình.

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

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Sau khi bật chính sách kiểm tra truy cập tệp, bạn có thể tìm trong Security log:

  • Ai đã xóa tệp từ thư mục chia sẻ mạng và khi nào nó xảy ra;
  • Ứng dụng (tiến trình) nào được dùng để xóa tệp;
  • Ngày của bản sao lưu cần khôi phục.

Cách ghi sự kiện xóa tệp vào database SQL (MySQL/MSSQL)?

Tuy nhiên, ngay cả khi kiểm tra xóa tệp được bật, việc tìm kiếm trong log có thể rắc rối. Thứ nhất, rất khó tìm một mục cụ thể trong hàng nghìn sự kiện (trong Windows không có công cụ tiện lợi để tìm sự kiện với bộ lọc linh hoạt). Thứ hai, nếu tệp bị xóa lâu rồi, sự kiện đó có thể không có trong log, vì đã bị ghi đè bởi sự kiện mới.

Bạn có thể lưu tất cả sự kiện xóa tệp vào database SQL. Bạn có thể dùng Microsoft SQL Server, Elasticsearch, hoặc database MySQL/MariaDB để lưu trữ sự kiện.

Trong ví dụ này, chúng tôi sẽ chỉ cách ghi log sự kiện kiểm tra vào một bảng database riêng trên MySQL. Tôi sẽ dùng định dạng bảng sau:

  • Tên server;
  • Tên tệp bị xóa;
  • Ngày và giờ;
  • Tên người dùng đã xóa tệp.

Truy vấn MySQL để tạo bảng này trông như sau:

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));
Lưu ý. Ví dụ về cách truy cập database MySQL từ PowerShell đã được xem xét trước đó trong bài viết Querying MySQL Database with PowerShell.

Nếu bạn muốn dùng database Microsoft SQL Server, xem bài viết "How to run a MSSQL Server Query from PowerShell?"

Để lấy sự kiện với EventID 4663 từ Security log cho ngày hiện tại, bạn có thể dùng script PowerShell sau:

$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
}
}

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Script PowerShell tiếp theo sẽ ghi dữ liệu bạn lấy vào database MySQL trên server từ xa (với địa chỉ 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 = [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()

Sau khi lưu sự kiện vào database bên ngoài, Event log này có thể được xóa.

Bây giờ, để biết ai đã xóa tệp "AnnualReport.DOC", chỉ cần chạy script sau trong console 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()

Bây giờ bạn có thể thấy username và thời gian tệp bị xóa trong console PS.

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Lưu ý. Vì đã phát hiện vấn đề ký tự "\" không được ghi vào database, chúng tôi đã thay thế nó bằng "|". Vì vậy, nếu bạn phải hiển thị đường dẫn đầy đủ đến tệp, bạn có thể thực hiện thay thế ngược khi truy vấn từ database:

$DataSet.file_name.Replace('|','\').

Script ghi thông tin từ Event log vào database có thể chạy vào cuối ngày bằng Task Scheduler hoặc gắn vào EventID xóa tệp (On Event), điều này tốn tài nguyên hơn. Tùy thuộc vào yêu cầu hệ thống.

Mẹo. Đảm bảo bạn đặt kích thước tối đa của file Security event log đủ lớn để ghi log tất cả sự kiện trong ngày. Nếu không, bạn sẽ phải chạy task xuất dữ liệu vào database nhiều hơn một lần một ngày hoặc ngay cả trên trigger. Thông thường, Maximum Log Size trên trạm làm việc phải ít nhất 64 MB, và 262 MB trên Windows File server. Tùy chọn ghi đè sự kiện cũ nên để bật (Overwrite events as needed).

Nếu cần, bạn có thể tạo trang web PHP đơn giản để lấy thông tin về người dùng đã xóa tệp dưới dạng thuận tiện hơn.

Mẹo quan trọng. Nếu log chứa mục ghi rằng tệp bị xóa bởi người dùng, đừng vội hiểu đó là hành động cố ý hoặc độc hại. Nhiều chương trình (đặc biệt ứng dụng MS Office) tạo tệp tạm khi lưu thay đổi và sau đó xóa phiên bản cũ của tệp. Trong trường hợp này, bật ghi log tên tiến trình (ProcessName field), từ tiến trình nào tệp bị xóa, và bạn có thể phân tích sự kiện xóa tệp dựa trên nó. Hoặc bạn có thể lọc sự kiện từ các tiến trình như vậy, như winword.exe, excel.exe, v.v.

Ghi log sự kiện kiểm tra xóa tệp vào file văn bản

Nếu bạn không muốn dùng database server riêng, bạn có thể lưu sự kiện kiểm tra xóa tệp vào file log văn bản thuần túy. Dùng script PowerShell này để lưu đầu ra vào file văn bản:
$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 } }

Cách phát hiện ai xóa tệp trên Windows Server với Audit Policy

Vậy, chúng tôi đã đưa ra ý tưởng và mô hình chung của hệ thống để kiểm tra và lưu trữ thông tin về các tệp bị xóa trong thư mục chia sẻ mạng. Nếu cần, nó dễ dàng được chỉnh sửa để đáp ứng yêu cầu của bạn.