Каковы различия в безопасности между NegotiateStream и WebRequest с использованием SPNego/Kerberos?

Следующая ссылка описывает традиционный связь между клиентом и сервером в интрасети через сокет с использованием Kerberos

public class NegotiateStream : System.Net.Security.AuthenticatedStream
... 
// Request authentication.
NetworkStream clientStream = client.GetStream();
NegotiateStream authStream = new NegotiateStream(clientStream, false); 
...
// Pass the NegotiateStream as the AsyncState object 
// so that it is available to the callback delegate.
IAsyncResult ar = authStream.BeginAuthenticateAsClient(
                  new AsyncCallback(EndAuthenticateCallback), authStream);
... 

С другой стороны, IIS имеет возможность аутентификации с использованием того, что я понимаю как "Kerberos с SPNego через SSL"... (пожалуйста, исправьте мою терминологию!).

В этом режиме SPNego/SSL/Kerberos мне не удалось заставить работать NegotiateStream, однако я смог заставить работать machineaccount$ правильно с WebRequest.AuthenticationLevel, установленным на MutualAuthRequired.

введите здесь описание изображения

Вопрос

  • В чем разница в безопасности между использованием NegotiateStream и WebRequest.AuthenticationLevel?

  • Каковы стандарты (например, MS-SPNG) используется в каждом решении?

  • Какие подсистемы Windows (SIP, GSS-API и т. д.) используются?

Любая информация, которая может помочь мне интегрировать агенты Linux в это решение Kerberos/SpNego, была бы идеальной.


person TLDR    schedule 22.05.2019    source источник


Ответы (1)


Это все о различиях в типах транспорта. Здесь у вас есть два разных транспорта:

  • Двоичный поток произвольных данных
  • HTTP-поток HTTP-кодированных данных

HTTP-запрос и ответ имеют очень специфическую семантику того, как вы аутентифицируете запрос, и это происходит через заголовок Authorization: [scheme] [token] и инициируется заголовком ответа WWW-Authenticate: [Scheme], где [scheme] часто равно Negotiate.

Бинарный поток является произвольным и предоставляется разработчику, чтобы делать все, что он хочет.

Схема Negotiate — это пакет, совместимый с GSS, который представляет собой простой протокол, позволяющий клиенту и серверу согласовывать внутренний протокол аутентификации, такой как Kerberos или NTLM. В среде Windows это называется пакетом SSPI.

Пакет, GSS или SSPI, состоит из набора функций, которые запускают или принимают рукопожатия между сторонами, а затем потенциально шифруют/дешифруют данные между двумя сторонами (опционально поддерживается). Эти функции генерируют сообщения, которые могут передаваться через любой транспорт, и любой вид транспорта может вызывать эти функции.

В случае WebRequest класс достаточно умен, чтобы обнаружить заголовок Negotiate и вызвать функции Windows SSPI для получения билета, передав имя пакета. Это в первую очередь зависит от Kerberos для защиты самого билета, но не защищает ничего другого в HTTP-запросе, поэтому используется SSL/TLS.

В случае NegotiateStream формат проводника несколько произволен, но ограничен рукопожатием Negotiate. Клиент отправит по сети только сообщение об инициализации переговоров, сервер ответит, и, если они согласятся, вы сможете начать отправлять друг другу зашифрованные сообщения.

person Steve    schedule 22.05.2019