Короткий ответ

Регулярный аудит прав — календарная сверка привилегий с реестром и HR, не разовый скрипт после испуга. Раз в квартал: Domain Admins и вложенность, локальные Administrators критичных узлов, sudo/root, VPN-группы, облачные админы, исключения «временно». Каждая лишняя учётка — тикет на снятие или явное продление с датой.

Владелец цикла — Иван Петров. Без даты last-review реестр снова врёт.

Симптомы и как отличить

Типичная картина:

  • в DA люди, которых не вспомнить;
  • contractor в VPN с 2022;
  • disabled-user всё ещё в IT-Admins;
  • локальный admin на FILE01 «для программы».

Отличия:

РаботаКогда
Реестр доступовпостоянно поддерживать
Offboardingсобытие HR
Квартальный аудитсверка факта vs реестра
Первичный IT-аудитшире: узлы, backup, сеть

Возможные причины

  1. Реестр завели и бросили.
  2. Вложенные группы никто не раскрывает.
  3. Нет календаря, «как будет время».
  4. Страх снять «вдруг сломается».
  5. Облако не в том же цикле, что AD.
  6. Редко: аудиторы приходят раз в три года — внутренний цикл не завели.

Диагностика

1. Выгрузка факта AD

$out = 'C:\Temp\access-review-{0:yyyy-MM-dd}' -f (Get-Date)
New-Item -ItemType Directory -Force $out | Out-Null
foreach ($g in @('Domain Admins','Enterprise Admins','Schema Admins','Backup Operators','Account Operators')) {
  Get-ADGroupMember -Identity $g -Recursive |
    Select-Object @{n='Group';e={$g}}, SamAccountName, objectClass, distinguishedName |
    Export-Csv "$out\$g.csv" -NoTypeInformation -Encoding UTF8
}
Get-ADUser -Filter {Enabled -eq $false} -Properties MemberOf |
  Where-Object { $_.MemberOf } |
  Select-Object SamAccountName, DistinguishedName

Disabled с MemberOf — типичный мусор.

2. VPN и кастом

Get-ADGroupMember -Identity 'VPN-Users' -Recursive |
  Select-Object SamAccountName, objectClass

Подставьте свои группы из реестра, не выдумывайте чужие имена сверх шаблона Contoso.

3. Linux

По CMDB узлам:

getent group sudo
sudo ls /etc/sudoers.d
# authorized_keys root
sudo wc -l /root/.ssh/authorized_keys

4. Сравнение с реестром

Любая строка в CSV, которой нет в CMDB Privilegedunknown. Любая строка реестра без факта — stale document.

Решение

Квартальный ритуал (4 часа)

  1. Выгрузки (день 1).
  2. Сверка с HR: уволенные, декрет, подрядчики с истекшим договором.
  3. Сверка с реестром: снять или продлить письменно.
  4. CHG на снятие групп.
  5. Обновить last-review, положить CSV в закрытый каталог (не общий чат).
  6. Короткий отчёт: сколько снято, сколько исключений.

Политика исключений

Временный доступ: дата конца в реестре. На аудите дата в прошлом = снять без дискуссии, либо новый CHG.

Снятие без героизма

Не чистите DA в пятницу пачкой. По одной учётке, проверка входа break-glass, запись в журнале.

Remove-ADGroupMember -Identity 'VPN-Users' -Members 'old.contractor' -Confirm:$false
# Confirm по политике: лучше интерактивно в окне, не слепой -Confirm:$false на DA

Облако и панели

Тот же квартал: список Global Admin, гипервизор, firewall admin. Факт из консоли, не память.

Что снимать в первую очередь

Очередь чистки: disabled в привилегированных группах; подрядчики с датой < сегодня; личные учётки в DA при наличии отдельной admin-учётки; локальный admin на FILE01, которого нет в реестре; ключ SSH уволенного на UBNT01. Не начинайте с экзотики PIM, пока в DA восемь человек.

Заведите CHG-пакет «access-review-2026-Q3» и таскайте туда все снятия квартала, чтобы в журнале было одно место. После снятия VPN — проверка, что учётная запись не входит (попытка тестового клиента, если ещё есть профиль — ожидание отказа).

Сверка с HR: список уволенных за 90 дней vs enabled AD. Любое совпадение — провал offboarding, чините процесс, не только этого человека.

Храните CSV выгрузки квартала: при следующем аудите видно тренд DA. Если число людей в DA выросло без CHG — процесс сломан, даже если «все хорошие».

Дополнительно пройдитесь по вложенности: группа IT-All не должна быть членом Domain Admins «для удобства рассылки». Recursive это покажет, плоская схема потом сэкономит часы.

Как проверить, что проблема устранена

  • В календаре 4 слота на год.
  • Акты/отчёты двух последних кварталов существуют.
  • Повторная выгрузка через неделю после чистки не показывает снятых.
  • Подрядчик с истекшим сроком не в VPN.

Метрика: число членов DA (людей) не растёт без CHG.

Перед снятием из Domain Admins проверьте вход второй привилегированной учёткой и консоль HV01. Пакет «почистим всех подрядчиков за час» без наблюдателя — способ закрыть себе вход. Квартальный аудит должен заканчиваться не только CSV, но и обновлённым реестром Privileged с новой датой last-review. Если дата не двигается, ритуал был театром.

На Linux добавьте в квартал sudo grep -R . /etc/sudoers.d и список uid 0. Локальный admin с NOPASSWD : ALL, которого нет в CMDB, — такой же DA, только без Get-ADGroupMember. Внесите и снимите по CHG, не «потом».

Если не помогло

  • Вложенность «IT-All → DA»: разберите вложенность, иначе Recursive всегда будет шокировать. Цель — упростить.
  • GMSA в группах: не удаляйте как людей, пометьте service.
  • Нет HR-выгрузки: сверка хотя бы с enabled AD vs lastLogon 90 дней — грубая сеть.

Профилактика

  • Изменение DA только через CHG.
  • Offboarding чеклист.
  • Алерт на изменение привилегированных групп (security-раздел), плюс квартал как страховка.
  • Онбординг: временные права с датой.

FAQ

Почему не каждый месяц?

Можно на DA monthly, полный контур quarterly. Если людей двое — квартала хватает при живом offboarding.

Нужны ли скрипты в SIEM?

Полезно. Не заменяет подпись Ивана Петрова на сверке: SIEM не знает, что подрядчик ещё нужен.

Что с локальными админами ПК?

Не в этом цикле целиком. Jump-серверы — да. Массовые ПК — LAPS/отдельный обзор.

Аудит прав = IT-аудит?

Нет. IT-аудит шире (первичный аудит). Этот процесс — только доступы.

Куда складывать CSV с ФИО админов?

Как реестр: ограниченный ACL. Не в Telegram.

Сняли лишнее, сломалась 1С. Что не так?

Сервисная учётка сидела в группе «для людей». Вынесите service accounts в отдельные группы до следующей чистки.