Куда я попал?
SECURITM это SGRC система, ? автоматизирующая процессы в службах информационной безопасности. SECURITM помогает построить и управлять ИСПДн, КИИ, ГИС, СМИБ/СУИБ, банковскими системами защиты.
А еще SECURITM это место для обмена опытом и наработками для служб безопасности.

Отключение неиспользуемых учетных записей в домене Active Directory

Цель: сокращение возможностей злоумышленника по компрометации учетных записей.

Политика:
  • Неактивные более 45 дней учетные записи пользователей подлежат отключению.
  • Неактивные более 60 дней учетные записи компьютеров и серверов подлежат удалению.
Автоматический регулярный поиск неактивных учетных записей и уведомление ответственного за защитную меру осуществляет скрипт, запускаемый ежедневно.
Пример реализации скрипта приведен в заметке к защитной мере

Инструкция
Началом для процесса является получение писем от скрипта аудита с заголовками:
  • Чистка AD: Users 
  • Чистка AD: Computers
Алгоритм обработки писем:
  1. Учетные записи пользователей отключаются и переносятся в юнит domain.local/Отключенные учетные записи/
  2. Учетные записи компьютеров удаляются или переносятся в юнит domain.local/Рабочие станции/Отключенные/
  3. В случае необходимости, неясности - проводятся консультации с Отделом ИТ или с владельцами отключаемой учетной записи
Область действия: Вся организация
Классификация
Тип
Организационная ?
Техническая ?
Корректирующая ?
Компенсирующая ?
Реализация
Вручную
Периодичность
По событию
Ответственный
Не определено
Инструменты
Не определено

Цепочка мер

Предшествующие меры
Этап -1
1 Использование Active Directory для учета, идентификации, аутентификации, авторизации пользователей

Ресурсная оценка

Качественная оценка

Количественная оценка

Итоговая оценка

Стоимость

Трудозатраты

Сложность

Стоимость, тыс. руб

Трудозатраты, дней/ год

CAPEX

?
Неизвестно
Неизвестно
Неизвестно
Неизвестно
Неизвестно
Отсутствует

OPEX

?
Неизвестно
Неизвестно
Неизвестно
Неизвестно
Неизвестно

Заметки

1
3 года назад

Скрипт аудита AD

Скрипт PowerShell настраивается через планировщик задач на ежедневный запуск. Проверяет наличие несоответствий в AD и уведомляет подразделение ИБ по электронной почте. 
# импортируем список серверов из Active Directory (для этого в powershell должен быть дополнительно установлен модуль RSAT)
import-module activedirectory
$computers = Get-ADComputer -SearchBase "DC=domain,DC=local" -Filter * -Properties CanonicalName, whenCreated, whenChanged, Description, LastLogonDate, LastBadPasswordAttempt, IPv4Address, CanonicalName
$users = Get-ADUser  -SearchBase "DC=domain,DC=local" -Filter * -Properties SamAccountName, 
        Name, Company, Department, Description, Office, telephoneNumber, whenCreated, whenChanged, LastLogonDate, 
        LastBadPasswordAttempt, CanonicalName, pwdLastSet, AllowReversiblePasswordEncryption

# Чистка AD: Computers
$exceptions = "PC1","PC2"
$oldDate = (Get-Date).AddDays(-45)
[array]$oldPc = $null
foreach ($comp in $computers)
{
    if($exceptions -ccontains $comp.Name) # Исключения по имени ПК
    {
        Write-Output "Exception: $($comp.Name)"
        continue
    }
     if($comp.DistinguishedName -Match "CN=VDI") # Исключения по юниту AD
    {
        Write-Output "Exception: $($comp.DistinguishedName)"
        continue
    }
    if ($comp.LastLogonDate -lt "$oldDate" -and
	    $comp.Enabled -eq "True")
    {
        $oldPc += $comp
    }
}
if($oldPc.Count -gt 0)
{
    $message = New-Object System.Net.Mail.MailMessage
    $message.From = "AD Cleaner <infosecurity@company.com>"
    $message.To.Add( "infosecurity@company.ru")
    $message.Subject = "Чистка AD: Computers ($($oldPc.Count))"
    $message.IsBodyHTML = $true
    $message.Body = "Добрый день,<br/> Прошу проанализировать и удалить из Active Directory учетные записи компьютеров <b>не подключавшихся более 45 дней </b><br/>Если для обработки объектов из списка требуется подключение других сотрудников Отдела ИТ - необходимо переслать им это письмо с соответствующим запросом<br/>"
    foreach($pc in $oldPc |  Sort-Object -Property CanonicalName)
    {
        $message.Body += "<p><b>$($pc.name)</b><br/>$($pc.CanonicalName)<br/>LastLogon: $(get-date $pc.LastLogonDate -Format 'dd.MM.yyyy') whenCreated: $(get-date $pc.whenCreated -Format 'dd.MM.yyyy')<br/>IP: $($pc.IPv4Address)</p>"
    }
    $message.Body += "__________ <br/>С уважением, <br/>Скрипт автоматической рассылки AD Cleaner"
    $smtp = New-Object Net.Mail.SmtpClient("mail.company.com")
    $smtp.Credentials = $null
    $smtp.Send($message)
}


# Чистка AD: Users
$exceptions = "user1", "user2"
$oldDate = (Get-Date).AddDays(-45)
[array]$oldUsers = $null
[array]$EnabledUsers = $null
$AllowRevPwd = @()
foreach ($user in $users | Sort-Object -Property CanonicalName)
{
    if($exceptions -ccontains $user.SamAccountName) # Исключения по имени пользователя
    {
        Write-Output "Exception: $($user.CanonicalName)"
        continue
    }
    if(($user.CanonicalName -Match '/System users/') # Исключения по имени юнита
    {
       Write-Output "Exception: $($user.CanonicalName)"
       continue
    }

    if (($user.LastLogonDate -lt "$oldDate") -and 
        ($user.whenCreated -lt "$oldDate") -and 
        ($user.Enabled -eq "True") -and
        ($user.CanonicalName -Match 'domain.local/Users/'))
    {
        $oldUsers += $user
    }
    if (($user.Enabled -eq $true)  -and 
        ($user.CanonicalName -Match 'domain.local/Отключенные учетные записи/'))
    {
        $EnabledUsers += $user
    }

    if ($user.AllowReversiblePasswordEncryption) {$AllowRevPwd += $user}
}

if(($oldUsers.Count -gt 0) -or ($EnabledUsers.Count -gt 0) -or $AllowRevPwd)
{
    $message = New-Object System.Net.Mail.MailMessage
    $message.From = "AD Cleaner <infosecurity@company.com>"
    $message.To.Add( "infosecurity@company.com")
    $message.Subject = "Чистка AD: Users ($($oldUsers.count + $EnabledUsers.Count + $AllowRevPwd.Count))"
    $message.IsBodyHTML = $true
    $message.Body = "Добрый день,<br/>"
    if($oldUsers.Count -gt 0)
    {
        $message.Body += "Прошу проанализировать учетные записи пользователей Active Directory не подключавшихся более <b>45</b> дней (кол-во:<b>$($oldusers.Count)</b>)
                        <br/>Учетные записи следует отключить и перенести в юнит <i>Отключенные учетные записи</i> <br/>"
        foreach($user in $oldUsers |  Sort-Object -Property CanonicalName)
        {
            $message.Body += "<p><b>$($user.name) ($($user.SamAccountName))</b><br/>$($user.CanonicalName)<br/><small>LastLogon:</small> $(if($user.LastLogonDate){get-date $user.LastLogonDate -Format 'dd.MM.yyyy'}) | <small>whenCreated: </small>$(if($user.whenCreated){get-date $user.whenCreated -Format 'dd.MM.yyyy'})</p>"
        }
    }
    if($EnabledUsers.Count -gt 0)
    {
        $message.Body += "Прошу проанализировать <b>включенные</b> учетные записи пользователей Active Directory находящиеся в юните <b>domain.local/Отключенные учетные записи/</b> (кол-во:<b>$($EnabledUsers.Count)</b>)
                        <br/>Учетные записи следует отключить или перенести в соответствующий юнит подразделения<br/>"
        foreach($user in $EnabledUsers)
        {
            $message.Body += "<p><b>$($user.name) ($($user.SamAccountName))</b><br/>$($user.CanonicalName)<br/><small>LastLogon:</small> $(if($user.LastLogonDate){get-date $user.LastLogonDate -Format 'dd.MM.yyyy'}) | <small>whenCreated: </small>$(if($user.whenCreated){get-date $user.whenCreated -Format 'dd.MM.yyyy'})</p>"
        }
    }

    $message.Body += "<br/>Если для обработки объектов из списка требуется подключение других сотрудников Отдела ИТ - необходимо переслать им это письмо с соответствующим запросом
                        <br/>__________ <br/>С уважением, <br/>Скрипт автоматической рассылки AD Cleaner"
    $smtp = New-Object Net.Mail.SmtpClient("mail.company.com")
    $smtp.Credentials = $null
    $smtp.Send($message)
}

Пример уведомления:
Добрый день,
 Прошу проанализировать учетные записи пользователей Active Directory не подключавшихся более 45 дней (кол-во:1)
Учетные записи следует отключить и перенести в юнит Отключенные учетные записи
Иванов Иван Иванович (i_ivanov)
domain.local/Users/Отдел продаж/Иванов Иван Иванович
LastLogon: 10.03.2021 | whenCreated: 24.06.2020

Если для обработки объектов из списка требуется подключение других сотрудников Отдела ИТ - необходимо переслать им это письмо с соответствующим запросом 
__________ 
С уважением, 
Скрипт автоматической рассылки AD Cleaner 

Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам улучшить сервис для вас с целью персонализации сервисов и предложений. Вы может прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом, вы даёте согласие на использование ваших cookie-файлов и соглашаетесь с Политикой обработки персональных данных.