Как получить полномочия при использовании SSPI? - PullRequest
0 голосов
/ 23 октября 2019

Когда вы используете API интерфейса поставщика поддержки безопасности (SSPI) для проверки учетных данных пользователя, сервер получает контекст безопасности дескриптор.

Затем можно использовать QueryContextAttributes функция для запроса информации о дескрипторе контекста безопасности:

  • QueryContextAttributes(handle, SECPKG_ATTR_LIFESPAN)
    • tsStart : время вконтекст был установлен.
    • tsExpiry : время истечения срока действия контекста.
  • QueryContextAttributes(handle, SECPKG_ATTR_AUTHORITY)
    • sAuthorityName : имя аутентифицирующего органа, если доступно.
  • QueryContextAttributes(handle, SECPKG_ATTR_PASSWORD_EXPIRY)
    • tsPasswordExpires : когда учетные данные дляконтекст безопасности истекает.
  • QueryContextAttributes(handle, SECPKG_ATTR_PACKAGE_INFO)
    • Имя : имя пакета безопасности.
    • Комментарий :Это может быть любая дополнительная строка, передаваемая пакетом.
  • QueryContextAttributes(handle, SECPKG_ATTR_NATIVE_NAMES)
    • sClientName : основное имя клиента в исходящемтикет.
    • sServerName : основное имя сервера в исходящем тикете
  • QueryContextAttributes(handle, SECPKG_ATTR_CLIENT_SPECIFIED_TARGET)
    • sTargetName : SPN начальной цели.

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

  • Контекстный дескриптор: 0x04CC9F4000AC8B80
  • Имя пользователя: STACKOVERFLOW\ian
  • Собственное имя клиента : ian@STACKOVERFLOW.COM
  • Собственное имя сервера : ian@STACKOVERFLOW.COM
  • SID пользователя: S-1-5-21-1708537768-844245398-2146844275-1109
  • Указанная клиентом цель: ian
  • Полномочия: Требование к функцииested не поддерживается (80090302)
  • Срок действия пароля (UTC):
  • Начало срока службы: 10/23/2019 11:03 ᴀᴍ
  • Срок годности: 10/23/2019 7:32 ᴘᴍ
  • Название пакета: Kerberos
  • Комментарий пакета: Microsoft Kerberos V1.0
  • Возможности пакета: 0x028F3BBF
  • Версия пакета: 0001
  • Пакет RpcID: 0010
  • Максимальная длина токена пакета: 48000

Полномочия

Я хочу знать полномочия , которые проверяли (или ручались за кэшированные) учетные данные.

За исключением вызова QueryContextAttributes QueryContextAttributesEx ) с SECPKG_ATTR_AUTHORITY не удается с помощьюошибка:

// MessageId: SEC_E_UNSUPPORTED_FUNCTION
//
// MessageText:
//
//  The function requested is not supported
//

SEC_E_UNSUPPORTED_FUNCTION       = HRESULT($80090302);

Что делает?

Я могу найти его с помощью командной строки:

C:\Users\Ian>SET

LOGONSERVER=\\HYDROGEN

Но я использую API.

Как работает SSPI

SSPI был спроектирован как универсальная оболочка для разных секурАлгоритмыСпособ использования API довольно прост:

  • Клиент : вызывает InitializeSecurityContext и получает BLOB-объект
  • Клиент отправляет этот BLOB-объект на сервер
  • Сервер : звонит AcceptSecurityContext(blob) и получает большой двоичный объект
  • сервер отправляет этот большой двоичный объект клиенту
  • Клиент : вызывает InitializeSecurityContext(blob), и возвращается BLOB-объект
  • клиент отправляет этот BLOB-объект обратно на сервер
  • Сервер : вызывает AcceptSecurityContext(blob) и получаетblob back
  • ... повторяйте до тех пор, пока не скажете прекратить ...

Обе стороны продолжают двигаться вперед и назад, пока функция не прекратит возвращать BLOB-объект, которыйнеобходимо отправить на другую сторону:

enter image description here

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

Как мне передавать большие двоичные объекты?

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

Если вы говорите с удаленным сервером по TCP / IP, то вы, вероятно, используете это:

// Open connection to server
sockConnect(162.210.196.166, 1433);

blob = null;

Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
   sockWrite(blob); //send the blob to the server

   blob = sockRead(); //wait for the server to return a blob 

   bContinue = InitializeSecurityContext(ref blob);
}

Если вы делаете это через http:

blob = null;
Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
    http = new HttpRequest("http://4chan.org/default.aspx");
    http.AddHeader("X-SSPI-Blob", blob.ToBase64());
    http.Send();

    blob = http.ReasponseHeader["X-SSPI-Blob"];
    if (blob.IsEmpty())
       break;

    bContinue = InitializeSecurityContext(ref blob);
}

Bonus Reading

SSPI - это имя реализации Windows RFC4121

Универсальный прикладной программный интерфейс службы безопасности (GSS-API)

Бонус-бонус

...