Перейти к содержимому

Аудит доменных компьютеров с LAPS

04.10.2018

В продолжение темы про LAPS решил рассказать, как находить компьютеры, на которых не работает LAPS, хотя должен.

Соответствие стандартам является условием прохождения любого аудита информационной безопасности. К требованиям, предъявляемым к локальным административным учетным записям, относятся их уникальность на разных системах, сложность в подборе и регулярная смена. В доменной инфраструктуре соблюдение этих требований обеспечивает штатный инструмент LAPS .

Сценарий, представленный ниже, является инструментом аудита. Он показывает, на каких компьютерах в домене (серверах или рабочих станциях) не работает LAPS. При этом можно видеть, где LAPS вообще никогда не запускался, либо на каких системах пароль LAPS устанавливался, но слишком давно. Сценарий возвращает список имен объектов компьютеров в Active Directory, у которых отсутствуют атрибуты LAPS или срок следующего изменения пароля истек. Для каждого компьютера отображается пароль LAPS, если он установлен, и прошедшая дата, когда должна была состояться очередная смена пароля.  Поле остается пустым, если пароль никогда не назначался. В список не попадают заблокированные (disabled) учетные записи компьютеров и неработающие компьютеры, объекты в AD которых изменялись более 90 дней назад.

Import-Module ActiveDirectory
$now = Get-Date
$dt = $now.AddDays(-90)
Get-AdComputer `
-Filter {(enabled -eq $True) -and (whenChanged -ge $dt) -and (OperatingSystem -like "*Server*")} `
-SearchBase ((Get-ADDomain).distinguishedName) -SearchScope Subtree `
-Properties ms-Mcs-AdmPwd,ms-Mcs-AdmPwdExpirationTime `
| Where-Object {$_.distinguishedName -notlike "*OU=Domain Controllers*"} `
| Select-Object name,@{Name="AdmPwd"; Expression={($_."ms-Mcs-AdmPwd")}},`
@{Name="AdmPwdExpTime"; Expression={[datetime]::fromFileTime($_."ms-Mcs-AdmPwdExpirationTime")}} `
| where-object {($_.AdmPwdExpTime -lt $now) -Or ($_.AdmPwd -notlike "*")}`
| Format-Table name,AdmPwd,@{Label="AdmPwdExpTime"; `
    Expression={($_.AdmPwdExpTime).ToString("dd.MM.yyyy") -replace "^.+1601$", ""}}

Для удобства публикации сценарий разбит на несколько строк за счет использования обратных апострофов, хотя, за исключением присваивания дат двум переменным, весь сценарий представляет собой одну большую строку, и, в принципе, ее можно ввести и выполнить из командной строки PowerShell. Выводимая информация имеет примерно такой формат.

В представленном виде сценарий выводит информацию по серверным операционным системам. Для того чтобы получить статистику по клиентским компьютерам,  необходимо в строке 5 условие (OperatingSystem -like «*Server*») заменить на (OperatingSystem -notlike «*Server*»).

Поясню, почему строка оказалась такой длинной.

В параметре Filter командлеты Get-AdComputer невозможно использовать атрибут distinguishedName, поскольку это составной атрибут: он не хранится в AD, а формируется динамически при обращении к объекту. Фильтровать по нему можно только за счет передачи вывода Get-AdComputer в Where-Object. В данном случае из результатов должны быть исключены контроллеры домена, на которых агент LAPS не устанавливается. Предполагается, что контроллеры домена находятся в стандартном расположении — в OU Domain Controllers или ниже по иерархии.

Атрибуты AD, содержащие в своем имени дефис, нужно сначала переименовать, так, чтобы их новые имена не содержали дефиса, и лишь затем использовать в дальнейших конвейерных операциях. Это выполняется в особой конструкции вида @{Name=»AdmPwd»; Expression={($_.»ms-Mcs-AdmPwd»)}} внутри Select-Object.

Время следующего изменения пароля LAPS сохраняется в атрибуте AD в формате Int64. PowerShell не понимает дату в таком формате напрямую, поэтому используется преобразование .Net DateTime.FromFileTime(Int64). Аналогичная проблема, кстати возникает, если стоит задача посмотреть в AD дату последнего входа пользователя в систему.

1601 год известен историкам сильным неурожаем в европейской части России, приведшему в конечном итоге к Смутному времени. Нам же этот год интересен тем,  что отсчет времени в переменных формата дата/время Int64 начинается именно 1 января 1601 года. Чтобы ничего не значащая дата не выводилась для компьютеров, в объектах которых срок следующего изменения пароля LAPS не определен, применяется замена с регулярным выражением
-replace «^.+1601$», «»

 

Реклама
Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: