Привет. Все конечно знают про правила безопасности, например про политики ограничения паролей для пользователей, разграничения прав и т.п. Но наверняка многие на эти правила забивают, в итоге получая целый ком потенциально опасных пользователей, с включенными галками а-ля срок действия пароля не ограничен, или настроенными 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
Тут я опять сделаю небольшое замечание - проверяется наличие прав, довольно топорно – тупо ищем все группы, где есть слово админ и смотрим участников. Соответственно, если у вас используются какие-нибудь хитрые кастомные группы – то сами их добавьте в фильтр. Также данная команда выполняется рекурсивно на группы, следовательно, будут отображены все участники группы, включая участников вложенных групп и так далее. Ну и, конечно, тут не исключены ложные выводы, в случае если у вас есть группы вроде административно-хозяйственный отдел, ну вы поняли.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.
Если вам помогла статья, вы можете >>отблагодарить автора<<