파일 시스템 개체 액세스 이벤트 감사를 사용하여 특정 파일을 생성, 삭제 또는 수정한 특정 사용자를 식별할 수 있습니다. 이 문서에서는 Windows Server 2016의 공유 네트워크 폴더에 있는 파일에 대한 이벤트 감사를 구성하는 방법을 보여줍니다. 감사를 구성한 후 이벤트 뷰어의 정보를 사용하여 파일에서 특정 파일을 삭제한 사용자를 찾을 수 있습니다. 섬기는 사람.
공유 네트워크 폴더에서 파일을 삭제하면 사용자의 휴지통으로 전송되지 않고 즉시 삭제됩니다. 공유 폴더에 열려 있는 파일 목록은 다음과 같이 얻을 수 있습니다.
Windows에서 파일 및 폴더 액세스 감사 정책을 활성화하는 방법
기본적으로 Windows Server에서는 파일 시스템 개체 액세스 감사가 활성화되어 있지 않습니다. 그룹 정책을 사용하여 감사 설정을 활성화하고 구성할 수 있습니다. 여러 서버 또는 컴퓨터에서 감사 정책을 활성화해야 하는 경우 도메인 GPO(gpmc.msc
를 사용하여 구성 가능)를 사용할 수 있습니다. mmc 콘솔). 하나의 서버에서만 감사를 구성하려는 경우 로컬 그룹 정책 편집기를 사용할 수 있습니다.
- 로컬 그룹 정책 편집기 콘솔 열기 –
gpedit.msc
; - 고급 감사 정책이 있는 GPO 섹션으로 이동:Windows 설정 -> 보안 설정 -> 고급 감사 정책 구성 -> 개체 액세스
- 감사 파일 시스템 열기 정책을 만들고 파일 시스템 개체에 대한 성공적인 액세스 이벤트만 기록하도록 지정합니다(다음 감사 이벤트 구성 -> 성공 ); 객체 액세스 감사를 사용하여 로컬 객체 액세스 감사를 활성화할 수도 있습니다. Windows 설정 -> 보안 설정 -> 로컬 정책 -> 감사 정책 아래의 정책 . 그러나 NTFS 액세스 이벤트만 추적하므로 파일 시스템 감사 정책을 사용하는 것이 좋습니다.
- 변경 사항을 저장하고
gpupdate /force
명령을 사용하여 로컬 그룹 정책 설정을 업데이트합니다. .
공유 폴더에서 파일 삭제 감사 설정 구성
이제 액세스를 추적하려는 공유 네트워크 폴더의 속성에서 감사를 구성해야 합니다. 파일 탐색기를 실행하고 폴더 속성을 엽니다. 보안으로 이동 탭. 고급을 클릭합니다. 버튼 -> 감사로 이동 탭.
"관리자여야 하거나 이 개체의 감사 속성을 볼 수 있는 적절한 권한이 부여되었습니다. "가 나타나면 계속 을 클릭하십시오. 버튼.
그런 다음 추가를 클릭합니다. 버튼을 눌러 감사 이벤트를 캡처할 사용자 또는 그룹을 지정합니다. 모든 사용자의 액세스 이벤트를 추적하려면 모든 사용자를 지정합니다. 그룹.
그런 다음 기록해야 하는 개체에 액세스하는 데 사용되는 권한을 지정해야 합니다. 이벤트 로그에 파일 삭제 이벤트만 저장하려면 고급 권한 표시 단추. 이벤트 목록에서 폴더 및 파일 삭제 이벤트에 대해서만 감사 남기기 – 삭제 및 하위 폴더 및 파일 삭제 .
도움말 . Windows 개체에 대한 감사 정책에는 추가 컴퓨팅 리소스가 필요합니다. 주의해서 사용하고 항상 기록할 감사 개체 및 이벤트의 수를 최소화하도록 노력하십시오.
$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 보안 감사 출처.
이벤트 뷰어 열기 mmc 콘솔(eventvwr.msc
), Windows 로그 확장 -> 보안 부분. EventID 4663으로 이벤트 로그 필터를 활성화합니다.
이벤트 뷰어에서 나머지 이벤트를 엽니다. 보시다시피 삭제된 파일의 이름, 파일을 삭제한 사용자의 계정 및 프로세스 이름에 대한 정보가 포함되어 있습니다.
object.subject :security id :jsmithaccount 도메인 :0x32b12627Object :object 서버 :securityObject 유형 :fileObject 이름 :e :\ distr \ backup.rarhandle ID :0x7bc4Resource 속성: S:AIProcess 정보:프로세스 ID: 0x4Process Name:Access Request Information:Accesses: 0 0 LE
파일 액세스 감사 정책을 활성화한 후 보안 로그에서 찾을 수 있습니다.
- 공유 네트워크 폴더에서 파일을 삭제한 사람과 삭제된 시기
- 파일 삭제에 사용된 애플리케이션(프로세스)
- 복원할 백업 날짜는 언제입니까?
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));
Microsoft SQL Server 데이터베이스를 사용하려면 "PowerShell에서 MSSQL Server 쿼리를 실행하는 방법?" 기사를 확인하세요.
현재 날짜의 보안 로그에서 EventID 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()
이제 PS 콘솔에서 사용자 이름과 파일이 삭제된 시간을 볼 수 있습니다.
참고 . 문제가 발견되었기 때문에 "
\
"가 데이터베이스에 기록되지 않고 "|
로 대체되었습니다. ". 따라서 파일의 전체 경로를 표시해야 하는 경우 데이터베이스에서 선택할 때 역대체를 수행할 수 있습니다.
$DataSet.file_name.Replace(‘|’,’\’).
이벤트 로그의 정보를 데이터베이스에 기록하는 스크립트는 작업 스케줄러를 사용하여 하루가 끝날 때 실행하거나 더 많은 리소스를 소비하는 파일 삭제 EventID(On Event)에 첨부할 수 있습니다. 시스템 요구 사항에 따라 다릅니다.
도움말 . 보안 이벤트 로그 파일의 최대 크기를 그날의 모든 이벤트를 기록할 수 있을 만큼 충분히 크게 설정했는지 확인하십시오. 그렇지 않으면 하루에 한 번 이상 또는 트리거에서 데이터를 데이터베이스로 내보내는 작업을 실행해야 합니다. 일반적으로 최대 로그 크기 워크스테이션에서 최소 64이어야 합니다. MB 및 262 Windows 파일 서버의 MB. 이전 이벤트를 덮어쓰는 옵션은 활성화된 상태로 두어야 합니다(필요에 따라 이벤트 덮어쓰기 ).
필요한 경우 간단한 PHP 웹 페이지를 만들어 파일을 삭제한 사용자에 대한 정보를 보다 편리한 형태로 얻을 수 있습니다.
중요 팁 . 로그에 사용자가 파일을 삭제했다는 항목이 포함되어 있으면 서두르지 말고 고의적이거나 악의적인 작업으로 해석하십시오. 많은 프로그램(특히 MS Office 앱)은 변경 사항을 저장할 때 임시 파일을 만든 다음 파일의 이전 버전을 삭제합니다. 이 경우 파일이 삭제된 프로세스 이름(ProcessName fileld)의 로깅을 활성화하고 이를 기반으로 파일 삭제 이벤트를 구문 분석할 수 있습니다. 또는 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
}
}
그래서 공유 네트워크 폴더에서 삭제된 파일에 대한 정보를 감사하고 저장하기 위한 아이디어와 시스템의 일반 모델을 제안했습니다. 필요한 경우 요구 사항에 맞게 쉽게 수정할 수 있습니다.