На самом деле, спорная штука - аудит средствами ОС Windows, так как жутко неудобная, так и еще дополнительная нагрузка на компьютер.
Поехали
- Создать политику
- Распространение файла скрипта
- Сценарий запуска скрипта
- Аудит включать не надо!
- Закинуть файл скрипта на шару
Скрипт простенький, но сделан для русской локализации и требует сохранения в 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"
Далее можно настроить сценарий завершения работы с выгрузкой лога на сервер логов, но это уже совсем другая история.
Комментариев нет:
Отправить комментарий