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

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

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

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

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

Исполнение требований

Приказ ФСТЭК России № 21 от 18.02.2013 "Состав и содержание мер по обеспечению безопасности персональных данных, необходимых для обеспечения каждого из уровней защищенности персональных данных":
АНЗ.5 АНЗ.5 Контроль правил генерации и смены паролей пользователей, заведения и удаления учетных записей пользователей, реализации правил разграничения доступа, полномочий пользователей в информационной системе
УПД.1 УПД.1 Управление (заведение, активация, блокирование и уничтожение) учетными записями пользователей, в том числе внешних пользователей
CIS Critical Security Controls v7.1 (SANS Top 20):
CSC 16.8 CSC 16.8 Disable Any Unassociated Accounts
Disable any account that cannot be associated with a business process or business owner.
CSC 16.9 CSC 16.9 Disable Dormant Accounts
Automatically disable dormant accounts after a set period of inactivity.
CSC 16.7 CSC 16.7 Establish Process for Revoking Access
Establish and follow an automated process for revoking system access by disabling accounts immediately upon termination or change of responsibilities of an employee or contractor . Disabling these accounts, instead of deleting accounts, allows preservation of audit trails.
Приказ ФСТЭК России № 17 от 11.02.2013 "Требования о защите информации, не составляющей государственную тайну, содержащейся в государственных информационных системах":
УПД.1 УПД.1 Управление (заведение, активация, блокирование и уничтожение) учетными записями пользователей, в том числе внешних пользователей
АНЗ.5 АНЗ.5 Контроль правил генерации и смены паролей пользователей, заведения и удаления учетных записей пользователей, реализации правил разграничения доступом, полномочий пользователей в информационной системе
SWIFT Customer Security Controls Framework v2022:
1 - 1.2 Operating System Account Control
1.2 Operating System Privileged Account Control
Приказ ФСТЭК России № 31 от 14.03.2014 "Состав мер защиты информации и их базовые наборы для соответствующего класса защищенности автоматизированной системы управления":
УПД.1 УПД.1 Управление учетными записями пользователей
ИАФ.3 ИАФ.3 Управление идентификаторами
NIST Cybersecurity Framework (EN):
PR.AC-1 PR.AC-1: Identities and credentials are issued, managed, verified, revoked, and audited for authorized devices, users and processes
Приказ ФСТЭК России № 239 от 25.12.2017 "Состав мер по обеспечению безопасности для значимого объекта соответствующей категории значимости":
УПД.1 УПД.1 Управление учетными записями пользователей

Комментарии 1

Скрипт аудита 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