У нас есть клиент-серверное приложение, которое разрабатывается внутри компании. Клиенты и сервер обмениваются данными через TCP / IP-соединение с протоколом для конкретного приложения. Клиенты работают в Windows, а сервер - в Linux. Все машины находятся в одном домене / области Active Directory / Kerberos.
В настоящее время пользователь вводит имя пользователя и пароль при запуске приложения. Сервер проверяет имя пользователя и пароль (аутентификация). На основании имени пользователя сервер также определяет доступ к ресурсам (авторизацию).
Мы хотим добавить в приложение возможности единого входа (SSO). То есть мы не хотим, чтобы пользователь вводил имя пользователя и пароль, но мы хотим автоматически войти в систему как текущий пользователь Windows.
Конечно, определение текущего пользователя Windows должно выполняться безопасно.
Я придумал следующую схему:
- Я использую SSPI (Negotiate) в Windows и GSSAPI в Linux.
- Когда клиент подключается к серверу, он использует
AcquireCredentialsHandle (Negotiate)
для получения учетных данных текущего пользователя Windows. - Клиент использует
InitializeSecurityContext (Negotiate)
для создания токена на основе этих учетных данных. - Клиент отправляет токен на сервер.
- Сервер использует
gss_acquire_cred()
для получения учетных данных службы. Они хранятся в файле .keytab. - Сервер получает токен от клиента.
- Сервер использует
gss_accept_sec_context()
для обработки токена. Этот вызов также возвращает «имя источника», то есть текущего пользователя Windows клиента. - Сервер использует «имя источника» в качестве имени пользователя: сервер не выполняет дополнительной аутентификации. Сервер все еще выполняет авторизацию.
Это работает, но у меня есть вопросы:
- Это безопасно? Для клиента не должно быть возможности указать любое другое имя пользователя, кроме пользователя Windows клиентского процесса. Если у пользователя есть учетные данные для создания процесса от имени другого пользователя (легально или нелегально), то это разрешено.
- Следует ли мне выполнять дополнительные проверки для подтверждения имени пользователя?
- Есть ли альтернативные способы достижения единого входа в этой настройке? Каковы их плюсы и минусы?