SSPI: получить учетные данные для другого пользователя из процесса, работающего с правами локального администратора.

Я запускаю процесс с правами администратора loacl в Windows и пытаюсь получить дескриптор учетных данных для другого пользователя с помощью AcquireCredentialsHandle . Можно передать структуру SEC_WINNT_AUTH_IDENTITY с информацией о пользователе (например, пользователь, домен, пароль) и получить дескриптор. Я проверил это. Без передачи SEC_WINNT_AUTH_IDENTITY не работает только pszPrincipal.

Интересно, есть ли другой способ сделать это без ввода пароля пользователя?

Я запускаю следующий сценарий:

  1. Клиент получает токен kerberos с помощью имени участника-пользователя и отправляет его на сервер.
  2. Сервер пытается получить дескриптор учетных данных (AcquireCredentialsHandle), используя UPN клиента.

Любые предложения, пожалуйста?


person ekhanad    schedule 04.09.2020    source источник


Ответы (1)


Обычно вы не можете запросить билет от имени других пользователей. Это было бы очень опасной проблемой безопасности.

Есть два способа обойти это.

  1. Используйте S4U2Self, где приложение запрашивает билет для себя, используя переданное имя пользователя, что даст им билет от имени пользователя для себя. Это позволяет вам видеть такие вещи, как членство в группе пользователей. Для этого вам нужно работать как SYSTEM или иметь SeImpersonatePrivilege.

  2. Используйте S4U2Proxy, также известный как переход протокола, когда приложение запрашивает билет для другой службы, используя переданное имя пользователя. Это позволяет вам олицетворять пользователя, основываясь только на имени, и должно быть явно предоставлено серверу и назначено AD. Это невероятно опасная привилегия, потому что вы позволяете своему приложению иметь права, эквивалентные KDC.

К сожалению, это довольно сложный фрагмент кода, поэтому его нельзя публиковать в этом посте как есть. Пример приложения можно найти здесь: https://github.com/SteveSyfuhs/DelegatedAuthentication.

Суть процесса такова:

  1. Клиент отправляет имя пользователя в сервис.
  2. Служба настроена для SeImpersonatePrivilege или SeTcbPrivilege (то есть работает как SYSTEM)
  3. Служба вызывает LsaLogonUser и передает только имя пользователя, возвращая дескриптор токена NT.
  4. Сервис вызывает SetThreadToken с токеном из (3).
  5. Служба вызывает AcquireCredentialsHandle без каких-либо учетных данных (использует учетные данные единого входа по умолчанию).
  6. Сервисные звонки InitializeSecurityContext
  7. Служба отправляет токен на целевой сервер
person Steve    schedule 05.09.2020
comment
Спасибо за ваше объяснение @Steve. Каков предпочтительный способ для моего сценария? Клиент Windows хочет получить доступ к службе на сервере Linux. Служба работает от имени локального администратора. Как только пользователь будет аутентифицирован, сервер будет олицетворять пользователя и запускать другую программу как олицетворяемый пользователь. Мы хотели бы использовать Kerberos. Вход с помощью UPN и службы, работающей от имени локального администратора (без учетной записи домена), не работает с использованием SSPI? - person ekhanad; 10.09.2020