Защита Active Directory с помощью PowerShell

Опубликовано: 7 Апреля, 2023

Управление делегированием OU

Давайте начнем с рассмотрения того, как мы можем следить за делегированием организационных единиц (OU). Возможность добавлять объекты в OU или изменять эти объекты внутри OU часто контролируется на уровне OU. Эти права могут быть переданы с использованием ряда различных методов, включая мастер «Делегирование управления» в AD Users and Computers, непосредственное изменение списка управления доступом (ACL) OU или использование утилиты командной строки, такой как dsacls.exe.. Интересно, что в модуле Active Directory PowerShell, предоставляемом Microsoft, нет прямых командлетов, позволяющих получать и устанавливать ACL для объектов AD. Однако это нас не остановит. Что мы можем сделать, так это воспользоваться AD «PS Provider», который поставляется с модулем PowerShell, вместе с некоторыми существующими командлетами Get-ACL и Set-ACL, которые обычно используются для получения и настройки безопасности файловой системы. Они одинаково хорошо работают в AD как PS Provider, так что давайте посмотрим, как это работает. Допустим, я хочу получить текущие разрешения для своей маркетинговой OU. Как я могу это сделать? Введите в PowerShell следующее, чтобы войти в AD PS Provider:

Это изменяет наш диск по умолчанию на наш текущий домен AD. Теперь, когда мы находимся «в AD», мы можем использовать Get-ACL и Set-ACL для управления безопасностью в OU. Допустим, мы хотим узнать текущий ACL на Marketing OU. Мы можем ввести:

Это возвращает полный список управления доступом для Marketing OU. Здесь мы вызываем командлет Get-ACL для различающегося имени Marketing OU и просим его вернуть только свойство «Access», которое содержит дескриптор безопасности для этого OU. Но вывод немного запутан, и что мы действительно хотим увидеть, так это субъект безопасности для данной записи управления доступом (ACE) и ее разрешение, поэтому мы можем немного изменить оператор выше, чтобы сократить список, как это:

В приведенном выше примере мы используем конвейер для отправки вывода в список форматов и выбираем только свойства identityReference, AccessControlType и ActiveDirectoryRights для каждого ACE, что возвращает гораздо более полезный вывод, как показано на рисунке 1:

Изображение 10469
Рисунок 1: Просмотр ACL OU

Теперь предположим, что я хотел зафиксировать текущую делегацию для своего подразделения Marketing и сохранить ее, чтобы сравнить ее с более поздней версией и посмотреть, не изменились ли какие-либо разрешения с течением времени. Самый простой способ сделать это — записать вывод, показанный на рис. 1, в файл CSV, который я могу постоянно хранить на диске. Итак, в следующем заявлении я использую командлет Export-CSV, чтобы сохранить текущие разрешения для CSV-файла:

Эта команда похожа на предыдущую, за исключением того, что вместо передачи вывода ACL в командлет format-list мы передаем его командлету Select-Object (псевдоним select ), чтобы выбрать три нужных столбца, а затем передаем их вывод в командлет export-csv для сохранения текущего ACL в файле. После того, как у нас есть базовый план, сохраненный в файле, мы можем периодически выполнять быстрый набор команд для проверки несоответствий. Например, вы можете запустить следующие команды в сценарии PowerShell с помощью планировщика заданий Windows, чтобы получить периодический отчет о различиях. Итак, давайте посмотрим, как это будет работать. Во-первых, нам нужно получить текущий ACL для OU и сохранить его в переменной. Это выглядит очень похоже на выше:

Теперь, когда мы сохранили текущий ACL в переменной $newACL, мы хотим получить наш базовый ACL из CSV-файла, который мы сохранили ранее, и сохранить его в, а также использовать командлет Compare-Object PowerShell, чтобы найти различия между базовым и новейшая версия списка ACL, как показано здесь:

Обратите внимание, что в первом операторе мы извлекаем базовые разрешения из CSV-файла и сохраняем их в переменной с именем $baselinePerms. Во втором операторе мы вызываем Compare-Object и передаем командлету $baselinePerms и $newACL. Мы также используем параметр –Property, чтобы указать имена свойств, которые мы хотим сравнить между этими двумя объектами. Наконец, мы передаем вывод командлету format-list (псевдоним fl) для удобочитаемости. Вывод выглядит следующим образом:

Изображение 10470
Рисунок 2: Просмотр различий в ACL OU

Это показывает, что группе под названием «CPANDLOffice 2003 Users» были предоставлены дополнительные права «CreateChild, Self и WriteProperty» в OU.

Обнаружение дрейфа членства в группе

Тот же метод, который мы использовали выше, можно использовать для проверки любых изменений или отклонений в критическом членстве в группах AD. Командлет Get-ADGroupMember AD может возвращать список членов в заданной группе (либо прямых членов, либо рекурсивных членов с использованием параметра –Recursive). Когда у вас есть этот список, вы можете снова сохранить его в «базовом» файле на диске, используя командлет Export-CSV, а затем использовать командлет Compare-Object в сценарии по расписанию, чтобы проверить текущее членство в группе.. Чтобы добавить некоторые дополнительные возможности в наш сценарий, давайте отправим сообщение электронной почты всякий раз, когда мы обнаружим изменение членства в группе. Для этого используется следующий код скрипта:

Этот сценарий начинается с предположения, что я уже использовал Export-CSV для экспорта членства в группе Marketing Users в файл CSV с именем c:datagroupbaseline.csv. В строке 1 мы начинаем с получения текущего членства в группе и присваиваем его $currentGroup. Строка 2 импортирует базовый уровень в переменную с именем $baselineGroup. В строке 3 используется командлет Compare-Object для сравнения свойства DistinguishedName с любыми различиями, обнаруженными между двумя списками. В строке 4, если объект $diff, которому мы присвоили различия в строке 3, не равен нулю (это означает, что мы нашли некоторые различия), тогда мы используем цикл foreach в строке 6 для перебора различий. Для каждого отличия мы получаем DN объекта (строка 8). Затем в строке 9 мы смотрим на свойство «SideIndicator» объекта разницы, чтобы определить, был ли пользователь/группа добавлен или удален. Исходя из этого, мы формируем тело почтового сообщения, указывающее, что участник был добавлен или удален, в строках 9-15. Наконец, в строке 16 мы используем командлет Send-MailMessage для отправки сообщения. Обратите внимание, что мне нужно указать действительное имя хоста SMTP-сервера и порт, если применимо. Кроме того, параметр –credential позволяет вам передавать учетные данные на SMTP-сервер, если ваш сервер требует аутентификации перед отправкой почты. Обратите внимание, что в приведенном выше скрипте я передаю переменную этому параметру, но эта переменная не определена в скрипте. Однако вы можете предварительно заполнить эту переменную, используя следующий синтаксис:

После запуска этого сценария сообщение электронной почты отправляется каждый раз, когда обнаруживается изменение членства в группе (при условии, что изменение происходит до запуска сценария!)

Резюме

Использование Powershell для контроля, аудита и составления отчетов о смещении объектов в AD очень полезно и эффективно. Возможность запланировать эти команды Powershell, чтобы вы знали, когда что-то не так, как должно быть, — это просто и удобно. Я еще расскажу о Powershell и о том, как использовать его для управления Active Directory.