Аудит реестра для отключенных пользователей


2

Что я хотел бы получить, так это события Windows для изменений в реестре. Теперь я обнаружил это руководство, где на одном из этапов настройки событий необходимо редактировать конфигурацию аудита для раздела реестра (найдите ключ -> щелчок правой кнопкой мыши -> разрешения -> расширенный -> аудит).

Теперь, скажем, я хочу установить этот мониторинг для ветви:

HKCU \ Software \ Classes

Я должен найти всех обычных пользователей HKUи установить аудит для каждого из них, дело в том, что пользовательские данные загружаются только тогда, когда они вошли в систему . Я могу загрузить раздел реестра вручную и добавить аудит с помощью:

reg load HKU\Steven C:\Users\Steven\ntuser.dat

Но проблема в том, что не все ключи там доступны (например, классы недоступны), и, честно говоря, это кажется грубым решением. Плюс есть дилемма, что произойдет, если пользователь будет добавлен после установки?

В Windows 10 есть ли способ добавить конфигурации аудита для всех пользователей?

Ответы:


1

Когда пользователь впервые входит в систему и создает его папку профиля, его пользовательский куст инициализируется как копия пользовательского куста по умолчанию, которая хранится здесь:

C:\Users\Default\NTUSER.DAT

После создания профиля копии становятся независимыми, поэтому удобного способа редактировать профили всех пользователей за один раз нет. Однако, если вы загрузите и отредактируете этот улей , изменения будут отражены во всех впоследствии созданных профилях.

ClassesКлюч хранится в отдельном улье , что вы можете загружать и редактировать отдельно:

%USERPROFILE%\AppData\Local\Microsoft\Windows\UsrClass.dat

К сожалению, улей по умолчанию не существует; при создании профиля он инициализируется пустым кустом.


Чтобы сделать все это менее утомительным для вас, я написал сценарий PowerShell для правила аудита для каждого из указанных поддеревьев, загруженных в HKEY_USERS. Но сначала нам нужно включить привилегию аудита, которая требует удивительного количества кода (адаптировано из Lee Holmes ):

param(    
    ## The privilege to adjust.
    $Privilege,
    ## The process on which to adjust the privilege. Defaults to the current process.
    $ProcessId = $pid,
    ## Switch to disable the privilege, rather than enable it.
    [Switch] $Disable
)

## Taken from P/Invoke.NET with minor adjustments.
$definition = @'
using System;
using System.Runtime.InteropServices;
public class AdjPriv
{

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

    [DllImport("advapi32.dll", SetLastError = true)]
    internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

    [StructLayout(LayoutKind.Sequential, Pack = 1)]

    internal struct TokPriv1Luid
    {
        public int Count;
        public long Luid;
        public int Attr;
    }

    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

    public static bool EnablePrivilege(long processHandle, string privilege, bool disable)
    {
        bool retVal;
        TokPriv1Luid tp;
        IntPtr hproc = new IntPtr(processHandle);
        IntPtr htok = IntPtr.Zero;
        retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
        tp.Count = 1;
        tp.Luid = 0;

        if(disable)
        {
            tp.Attr = SE_PRIVILEGE_DISABLED;
        }
        else
        {
            tp.Attr = SE_PRIVILEGE_ENABLED;
        }

        retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
        retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
        return retVal;
    }
}

'@

$processHandle = (Get-Process -id $ProcessId).Handle
try { 
  Add-Type $definition 
} catch {} # Silent failure on re-registration

[AdjPriv]::EnablePrivilege($processHandle, $Privilege, $Disable)

Сохраните это как privs.ps1. Затем мы можем использовать его в нашем скрипте, который должен находиться в том же каталоге:

Param (
    [string[]]$Subkeys
)
$rights = 'ChangePermissions,CreateSubKey,CreateLink,Delete,SetValue,TakeOwnership'
.\privs.ps1 -Privilege SeSecurityPrivilege
$users = [Microsoft.Win32.RegistryKey]::OpenBaseKey('Users', 'Default')
$Subkeys | % {
    $key = $users.OpenSubKey($_, $true)
    $acl = $key.GetAccessControl()
    $rule = [System.Security.AccessControl.RegistryAuditRule]::new([System.Security.Principal.NTAccount]::new('Everyone'), $rights, 'ContainerInherit,ObjectInherit', 'None', 'Success')
    $acl.AddAuditRule($rule)
    $key.SetAccessControl($acl)
    $key.Close()
}

Для каждого из предоставленных подразделов создается правило, которое проверяет успешные изменения (определяемые $rightsпеременной в верхней части, которую вы можете изменить) в этом ключе или подразделах. Сохраните его как файл PS1, например regaudit.ps1. Если вы этого еще не сделали, включите выполнение скрипта PowerShell, как указано в вики-теге PowerShell . Затем загрузите все необходимые ульи под HKEY_USERS. Вы можете запустить скрипт из командной строки PowerShell с повышенными правами следующим образом:

.\regaudit.ps1 -Subkeys 'Steven\Control Panel', 'Steven\Software\Microsoft'

Обратите внимание, что вы не должны включать HKCUили любой такой рут. Вы можете передать столько подключей, сколько захотите. Кроме того, вы можете создать текстовый файл с одним подразделом на строку и использовать его следующим образом:

.\regaudit.ps1 -Subkeys (gc .\toaudit.txt)

Примечание. События аудита не будут отображаться в журнале безопасности, если в разделе «Политика аудита» локальной политики безопасности не включен «Доступ к объекту аудита».

Дальнейшее чтение: Контроль доступа в .NET

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.