Некоторые картинки не загружаются из РФ и РК, используйте VPN.

вторник, 28 ноября 2023 г.

GPO+Powershell Включение аудита файлов пользователя

Пользователь мне втирал, что он файл не удалял, пока я его не ткнул мордой в лог. 
На самом деле, спорная штука - аудит средствами ОС Windows, так как жутко неудобная, так и еще дополнительная нагрузка на компьютер.

Поехали
  1. Создать политику
    1. Распространение файла скрипта
    2. Сценарий запуска скрипта
    3. Аудит включать не надо!
  2. Закинуть файл скрипта на шару

Скрипт простенький, но сделан для русской локализации и требует сохранения в CP1251:
# %windir%\System32\WindowsPowerShell\v1.0\powershell.exe  -Noninteractive -NoProfile -ExecutionPolicy Bypass -File C:\usr\SetAudit.ps1
# auditpol /get /category:*
$AuditUser = "DOMAIN\Domain Users"
$Path="C:\Users"
$LogFile="C:\usr\SetAudit.log"
# $Folder - $Directory.FullName
# $Inheritance - boolean
# $RemoveAuditRule - boolean
function ChangeFolderACL{
	Param(
		[string]$Folder,
		[bool]$Inheritance=$true,
		[bool]$RemoveAuditRule=$false
	)
	Write-output ("$Folder is processed.") 
	
	if ( -not (Test-Path $Folder) ){
		Write-output ("$Folder not found.") 
		exit
	}
	$ACL = Get-Acl $Folder -Audit
	if ($ACL.audit.count -eq 0) {
		if( $RemoveAuditRule ){
			
			Write-output ("Removing inheritance on a folder ($Folder).") 
			$ACL = get-acl $Folder -Audit
			$ACL.Audit | ? {$_.IsInherited -eq $false} | foreach{$ACL.RemoveAuditRule($_)}
			
		} else {
			
			$ACL = (Get-Item -Path $Folder -Force).GetAccessControl('Access')
			if ( $Inheritance -eq $true ){
				
				Write-output ("Installing audit rules on a folder ($Folder).") 
				$ACL.SetAuditRuleProtection($false, $false)
				$AuditRules = "CreateFiles, AppendData, DeleteSubdirectoriesAndFiles, Delete"
				$InheritType = "ContainerInherit,ObjectInherit"
				$AuditType = "Success"
				$AccessRule = New-Object System.Security.AccessControl.FileSystemAuditRule($AuditUser,$AuditRules,$InheritType,"None",$AuditType)
				# Applying and installng audit rules
				$ACL.SetAuditRule($AccessRule)
				
			} else {
				
				Write-output ("Disabling inheritance on a folder ($Folder).")  
				$ACL.SetAuditRuleProtection($true, $false)
				
			}
			
		}
		Set-Acl -path $Folder $ACL
	} else {
		Write-output ("$Folder is already enabled") 
	}
}

function RunProcessPerform() {
	auditpol /set /subcategory:"Файловая система" /failure:enable /success:enable
	foreach ($Directory in  $(Get-ChildItem -Path $Path -Exclude "Public")){
		
		ChangeFolderACL -Folder "$($Directory.FullName)" 
		ChangeFolderACL -Folder "$($Directory.FullName+`"\AppData`")" -Inheritance $false   
		foreach ($SubDirectory in  $(Get-ChildItem -Path $Directory -Exclude "AppData","ntuser*" -Force)){
			ChangeFolderACL -Folder "$($SubDirectory.FullName)" -RemoveAuditRule $false 
		}
		Write-output ("Processing of the `"$($Directory.FullName)`" Folder is compleated")  
		Write-output ("_____________________________")  
	}
}
RunProcessPerform 2>&1 | ForEach-Object { $_.ToString()} | Tee-Object "$LogFile"
Скрипт не идеален, но должен работать и на Windows 10 и на Windows 7. Первая версия скрипта была ошибочной и ломала права доступа, так как копировала их с папки пользователя на дочерние. Новая версия берет права с дочерней, добавляет аудит и применяет.

В сценарии запуска программа:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
а параметры:
-Noninteractive -NoProfile -ExecutionPolicy Bypass -File C:\usr\SetAudit.ps1
Почему не надо включать аудит в Локальных или Групповых политиках?, да потому, что он тогда включит всю групп "Доступ к объектам", а в журнал писать будет очень много. Лучше командой включить только "Файловая система"

Скрипт перебирает НЕСКРЫТЫЕ каталоги и файлы по пути C:\users\, отключает наследование у AppData и применяет политику аудита:

Дабы не усложнять скрипт, я в качестве аудируемого указываю группу "Domain users"
Далее можно настроить сценарий завершения работы с выгрузкой лога на сервер логов, но это уже совсем другая история.

Комментариев нет:

Отправить комментарий