Как войти в систему пользователя на сервере и запустить процесс с использованием билета Kerberos

Как аутентификация и вход в систему работают в Windows с помощью Kerberos? Я хочу достичь того, чтобы войти в систему пользователя на сервере и запустить процесс для этого пользователя.

В качестве первого шага я создаю билет Kerberos на клиенте и отправляю его на сервер. На сервере я не знаю API для входа пользователя с его билетом. Конечно, я могу принять контекст безопасности, используя AcceptSecurityContext (SSPI), но это не инициирует вход в систему.

Я думаю, что некоторые реализации SSH для Windows делают именно это. Но я хочу знать, как и какой API они, вероятно, используют?


person Spiegelritter    schedule 13.09.2018    source источник


Ответы (1)


Есть несколько способов сделать это. Вам нужно вызвать AcceptSecurityContext в заявке, чтобы получить контекст безопасности. Это то, что загружает все в Windows. Оттуда вы можете делать несколько разных вещей.

Обычно вы вызываете ImpersonateSecurityContext, чтобы текущий поток понимал, каким пользователем, по его мнению, он должен быть. После этого вы можете вызвать QuerySecurityContextToken, чтобы получить дескриптор токена доступа Windows. Затем с помощью этого дескриптора вы вызываете CreateProcessAsUser. Вы также можете указать ему, чтобы он выполнял такие действия, как загрузка профиля, если это необходимо.

На самом деле это не делает вход в систему, как LogonUserX, но эффективно запускает процесс от имени этого пользователя, чего обычно и хотят добиться люди.

person Steve    schedule 19.09.2018
comment
Спасибо за ваш ответ. Пока работает с CreateProcessAsUser, новый процесс запускается как пользователь. Однако он не может взаимодействовать с другими службами на разных серверах (например, REST API). Невозможно создать новые билеты для других служб (с использованием AquireCredentialsHandle и InitializeSecurityContext), я получаю сообщение об ошибке: в пакете безопасности нет учетных данных. Я могу создавать новые заявки (делегирование) в службе после ImpersonateSecurityContext, но до создания нового процесса. Но я не этого хочу. Можно ли это сделать в новом процессе? - person Spiegelritter; 20.09.2018
comment
Да, в этом сценарии требуется еще один шаг - настроить учетную запись, в которой запущен родительский процесс, чтобы разрешить делегирование и олицетворение. Итак, client => server => child process это означает, что процесс server работает от имени пользователя, и у этого пользователя должны быть настроены олицетворение и делегирование. - person Steve; 20.09.2018
comment
Кажется, работает с неограниченным делегированием. Знаете ли вы, работает ли этот подход с ограниченным делегированием (когда TGT не отправляется вместе с билетом службы для целей делегирования). - person Spiegelritter; 30.01.2019