Проверьте, что данный пользователь имеет данную привилегию

16

Учитывая пару пользователя и привилегию, мне нужно определить, есть ли у пользователя привилегия на сервере. Следующее верно в моей настройке:

  • Сервер является частью домена, но не контроллером домена
  • В инфраструктуре есть несколько доменов с доверительными отношениями.
  • Иногда пользователи (локальные, доменные или из другого домена) могут принадлежать к локальной группе, потому что они находятся в какой-то другой группе (доменной или локальной), которая принадлежит к локальной группе, а не принадлежит к группе напрямую.

Пример сценария для последней точки:

  • Пользователь1 принадлежит группе TeamA в Домене A
  • DomaimA \ TeamA является членом DomainB \ SpecialAccess
  • DomainB \ SpecialAccess является членом DomainB \ DomainAdmins
  • Наконец DomainB \ DomainAdmins принадлежат к локальной группе администраторов
  • Группа локальных администраторов имеет привилегию SeRemoteInteractiveLogonRight

Теперь, если у меня есть на входе DomainA \ User1 и SeRemoteInteractiveLogonRight, мне нужно получить ответ Да или Нет. Поэтому я открываю локальную политику на машине, отмечаю, что группы перечислены в списке прав, которые мне тоже интересны, затем захожу к менеджерам серверов и вижу, что у членов группы, а затем мне нужно посмотреть, какие члены каких-либо групп в этих группах и так далее.

У меня есть чувство, что это может быть проще. Я был очень взволнован, когда нашел утилиту AccessChk. Это заняло целых три минуты, после чего я обнаружил, что в ней перечислены только прямые отношения, поэтому пользователь в группе не будет указан.

Теперь я предполагаю, что было бы возможно объединить результаты из AccessChk так, чтобы я мог проверить, принадлежит ли пользователь какой-либо из групп, которые возвращает AccessChk, но, учитывая, что это не один домен, а несколько из них, я не уверен, как подойти к этому. Также выходные данные AccessChk, кажется, не различают группу и пользователя.

РЕДАКТИРОВАТЬ : в духе того, чтобы не попасть в ловушку проблем XY, мне действительно нужно убедиться, что на группе серверов нет определенных учетных записей пользователей, которые используются в качестве удостоверений пула приложений IIS, с привилегиями SeInteractiveLogonRight или SeRemoteInteractiveLogonRight. У меня нет проблем с частью IIS, но последний шаг проверки учетной записи по привилегии - это то, что я изо всех сил пытаюсь найти простой способ проверить. Я также хотел бы автоматизировать проверку, потому что это нужно делать регулярно.

Андрей Савиных
источник
6
Это звучит как работа для ... Результирующей политики (RSoP)! technet.microsoft.com/en-us/library/cc758010%28v=WS.10%29.aspx
Davidw
1
@zespri - мой ответ был мусором, и я удалил его. Права пользователя SeInteractiveLogonRight и SeRemoteInteractiveLogonRight обрабатываются не так, как «обычные» привилегии, и похоже, что отчетность по ним будет проблематичной. Если я найду решение для вас, я отправлю другой ответ, но пока у меня ничего нет.
Эван Андерсон
1
@Davidw - RSoP проблематичен тем, что настройки локальной политики безопасности не будут отражены в выходных данных. Таким образом, любые записи «Не сконфигурировано» просто будут отображаться как «Не сконфигурировано», и вы фактически не увидите, каким принципалам предоставлено право локальной политикой безопасности. Наконец, даже если вы получите список принципалов из групповой политики, вы застрянете, расширяя членство в группах (возможно, также и междоменное) для репликации функциональности ОС. Это на самом деле оказалось гораздо более сложным вопросом, чем я ожидал.
Эван Андерсон
1
@EvanAnderson Точно! Когда меня попросили оценить, сколько времени это займет у меня, это казалось простой задачей. И после пары дней поиска в Google и пробовать разные вещи ... ничего. В настоящее время я планирую вызвать GetTokenInformation с помощью класса информации о токене TokenPrivileges. Конечно, сначала мне нужно выяснить, как получить сам токен. Этот маршрут кажется наиболее перспективным на данный момент.
Андрей Савиных
@zespri - NtOpenProcessToken (), вероятно, лучший способ получить токен. (Взгляните на leeholmes.com/blog/2006/07/21/… )
Эван Андерсон

Ответы:

1

Токены доступа не имеют информации о правах, только о привилегиях.

Что вам нужно сделать, это:

  • Найдите рабочий процесс IIS, который соответствует вашему пулу приложений. Поскольку вы знаете идентичность пула приложений, это должно быть легко, перечислив все процессы с именем рабочего процесса и отфильтровав тот, у которого есть идентификатор. Если их больше одного, вы можете использовать любой.
  • Используйте GetTokenInformation с информационным классом TokenGroup, а не TokenPrivilege в токене процесса. Результат даст вам все переходные группы, к которым относится и идентичность. Это означает, что даже косвенные.
  • Теперь вы можете циклически проходить через эти группы и вызывать LsaEnumerateAccountRights для каждой из них и сопоставлять информацию. Это даст вам то, что вы хотите.

Вышеуказанное зависит от существования процесса (и токена), соответствующего идентификатору учетной записи. В вашем сценарии это не должно быть проблемой. В тех случаях, когда это является проблемой, вы можете попытаться использовать поиск в Active Directory для вычисляемого атрибута Token-Groups . В этой статье перечислено несколько подходов, как это осуществить.

Андрей Савиных
источник