Вы здесь

Ищем опасные учётные записи в AD


Ищем опасные учётные записи в AD

Привет. Все конечно знают про правила безопасности, например про политики ограничения паролей для пользователей, разграничения прав и т.п. Но наверняка многие на эти правила забивают, в итоге получая целый ком потенциально опасных пользователей, с включенными галками а-ля срок действия пароля не ограничен, или настроенными SPN записями для пользователей, которые являются членами привилегированных групп. В общем, сегодня хочу показать несколько команд Powershell которые выдадут вам список проблемных пользователей, чтобы можно было иметь представление о ситуации и при необходимости предпринимать какие-либо меры.

1 - Давно не логинившиеся пользователи.

Стоит ли говорить, что нужно отключать или удалять учётки, которые не активны? Тут без комментариев. Найти таких пользователей помогут команды:

$90Days = (get-date).adddays(-90)
$filter = {
  (lastlogondate -notlike "*" -OR lastlogondate -le $90days) -AND
  (passwordlastset -le $90days) -AND
  (enabled -eq $True) -AND
  (whencreated -le $90days)
}
Get-ADUser -properties * `
 -filter $filter `
 | select-object `
    name, `
    SAMaccountname, `
    passwordExpired, `
    PasswordNeverExpires, `
    logoncount, `
    whenCreated, `
    lastlogondate, `
    PasswordLastSet, `
    lastlogontimestamp, `
    CanonicalName `
 | export-csv .\notloggedonusers.csv -notypeinformation -encoding utf8

На выходе получим файл CSV со списком учётных записей. Само собой путь и имя выходного файла можете изменить на нужные вам – изменив путь после export-csv. Также можете изменить период неактивности (переменная 90days)

 

2 - Срок действия пароля не ограничен.  

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

$filter = {
 (PasswordNeverExpires -eq "true") -and
 (Enabled -eq "true")
}
get-aduser -Properties * `
-Filter $filter `
 | Select-Object `
  name, `
  samaccountname, `
  canonicalname, `
  whenCreated, `
  lastlogondate `
 | export-Csv .\unlimitedpassword.csv -NoTypeInformation -Encoding utf8

 

 

3 - Не отключенные учетные записи.

В общем следующая команда является дублем первого пункта, только без фильтра по времени входа. Очень часто используются специальные контейнеры или OU для хранения отключенных пользователей, например deleted users, inactive users и т.д. И если перенос учеток уволившихся сотрудников осуществляется вручную, с последующим отключением их также вручную, велика вероятность возникновения ситуации, что данные учётки благополучно забудут отключить. Я думаю все и так прекрасно знают, что может сулить активная учетная запись для покинувшего компанию сотрудника, особенно когда покидается компания со скандалом. Следующая команда найдет включенные учетки в OU, где учетки должны быть отключены.

get-aduser -Properties * -Filter {(enabled -eq "true")} `
 | where-object `
  {($_.CanonicalName -like "*inactive*") -or ($_.canonicalname -like "*deleted*")} `
  | Select-Object `
    name, `
    samaccountname, `
    Canonicalname, `
    whenCreated, `
    lastlogondate `
  | export-Csv -NoTypeInformation -Encoding utf8 -Path .\false-disabled-users.csv

 

 

4 - SPN.

Знаете, вы или нет, но включенный SPN для пользователя может быть довольно серьезной угрозой безопасности сети, т.к. злоумышленник может получить кэш пароля этой учетной записи и спокойно сбрутить его оффлайн. Поэтому нужно по возможности избегать запуска служб от имени пользователей, уходя в сторону управляемых учетных записей служб (MSA/gMSA). А если уж приходится использовать пользовательскую учётку для запуска службы то пароль нужно делать максимально длинным и необходимо его периодически менять. Найти пользователей с прописанным SPN может следующая команда. На выходе получим файл CSV со всеми такими учётами, а также с содержимым этого атрибута, чтобы сразу понимать, что за сервисы работают от имени этой учётки.

get-aduser -Properties * -Filter {(Enabled -eq "True")} `
 | where-object {$_.servicePrincipalName -ne $null} `
 | select-object `
  name, `
  samaccountname, `
  Canonicalname, `
  whenCreated, `
  lastlogondate, `
  @{Label="servicePrincipalName"; Expression={($_.servicePrincipalName | out-string)}}, `
  @{Label="groups"; Expression={(Get-ADPrincipalGroupMembership $_.samaccountname).name | out-string}} `
 | export-Csv -NoTypeInformation -Encoding utf8 -Path .\SPN-users.csv

 

 

5 - Флаг PASSWD_NOTREQD

Вне зависимости от ваших парольных политик, также как и с галкой про вечные пароли, полика может обходится еще и флагом PASSWD_NOTREQD. Какие потенциальные угрозы он может нанести? Во первых на учётные записи с таким флагом не распространяются парольные политики в принцие. Во вторых, политики не распространяются на столько, что пользователь может себе спойоно задать пустой пароль. Оно вам надо? Найти таких пользователей поможет команда:

get-aduser -filter * -Properties * `
 | where-object { `
  ($_.userAccountControl -ne 512) -and `
  ($_.useraccountcontrol -ne 66048) -and `
  ($_.useraccountcontrol -ne 514) -and `
  ($_.useraccountcontrol -ne 66050) -and `
  ($_.useraccountcontrol -ne 590336) -and `
  ($_.useraccountcontrol -ne 4260352) -and `
  ($_.useraccountcontrol -ne 2163202) -and `
  ($_.useraccountcontrol -ne 590338)} `
 | Select-Object `
  name, `
  samaccountname, `
  enabled, `
  Canonicalname, `
  whenCreated, `
  lastlogondate,`
  userAccountControl `
 | export-Csv -NoTypeInformation -Encoding utf8 -Path .\nopass-users.csv

 

Тут стоит оговориться, что в команде идет поиск по значению атрибута userAccountControl, который формируется методом суммирования разных флагов. Можно провести аналогию с правами доступа в линукс, типа 4 – чтение, 1 – исполнение, 2 - запись, 5 (4+1) – чтение и исполнение, 7 (1+2+4) – полный доступ. Также и со значением поля, только базовых значений великое множество. В примере я сделал исключения некоторых значений, которые не попадают под включенный флаг PASSWD_NOTREQD, но далеко не всех. У вас они могут отличаться, по этому не исключено, что будут показаны лишние учётки – смотрите внимательно, и как говориться Google в помощь.

 

7 - Ищем администраторов

И последняя команда из сегодняшнего списка. Будем искать пользователей с правами администраторов. Всех же интересует, у кого есть повышенные привилегии в домене?

$GruppeMedlemmer = @()
$Groups = Get-ADGroup `
 -Filter {(name -like "*админ*") -or (name -like "*admin*")} `
 -properties *

foreach ($g in $Groups) {
$members = $g | Get-ADGroupMember -recursive
     foreach ($m in $members) {
       $Info = New-Object psObject
       $Info | add-member -MemberType NoteProperty `
        -Name "GroupName" -Value $g.Name
       $Info | add-member -MemberType NoteProperty `
        -Name "Description" -Value ($g.description | out-string)
       $Info | add-member -MemberType NoteProperty `
        -Name "MemberOf" -Value ($g.MemberOf | out-string)
       $Info | Add-Member -MemberType NoteProperty `
        -Name "Member" -Value $m.name
       $Info | Add-Member -MemberType NoteProperty `
        -Name "SamAccountName" -Value $m.SamAccountName
       $Info | Add-Member -MemberType NoteProperty `
        -Name "distinguishedName" -Value $m.distinguishedName
       $Info | Add-Member -MemberType NoteProperty `
        -Name "objectClass" -Value $m.objectClass
       $GruppeMedlemmer+= $Info
     }
  }
}
$GruppeMedlemmer | Sort-Object GroupName | Export-CSV .\admins.csv -notypeinformation -Encoding utf8

 

Тут я опять сделаю небольшое замечание - проверяется наличие прав, довольно топорно – тупо ищем все группы, где есть слово админ и смотрим участников. Соответственно, если у вас используются какие-нибудь хитрые кастомные группы – то сами их добавьте в фильтр. Также данная команда выполняется рекурсивно на группы, следовательно, будут отображены все участники группы, включая участников вложенных групп и так далее. Ну и, конечно, тут не исключены ложные выводы, в случае если у вас есть группы вроде административно-хозяйственный отдел, ну вы поняли.

5 2

Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.


Если вам помогла статья, вы можете >>отблагодарить автора<<