Skip to Content

Протокол аутентификации в Windows Kerberos V5

Kerberos V5 — основной протокол аутентификации в Windows позволяющий взаимно идентифицировать сервер и клиента перед установлением связи между ними. Цербер (Kerber) — мифический трёхголовый пес, охраняющий вход в подземное царство. Трем головам в протоколе Kerberos соответствуют три компоненты: клиент, сервер и посредник. Роль посредника играет центр распространения ключей Key Distribution Center (KDC). KDC – это служба, которая выполняется на каждом контроллере домена, она записывает в базу данных Active Directory (AD) криптографический ключ, известный только участнику безопасности и службе KDC. Этот ключ, называемый долговременным, создается он на основе хешированного пароля пользователя и хранится в AD как атрибут учетной записи.

Служба KDC запускается автоматически подсистемой Local Security Authority (LSA) и объединяет две службы:

  1. AuthenticationService (AS), которая выдает билеты начальной аутентификации TGT
  2. TicketGrantingService (TGS), которая выдает билеты на доступ к другим серверам домена или к службе KDC доверяемого домена

Клиент Kerberos V5 устанавливается на каждой рабочей станции и сервере.

Чтобы найти адрес KDC, клиент запрашивает на DNS-сервере SRV-запись с именем _kerberos._udp.ИмяДоменаDNS. Для подключения к службе KDC клиент посылает UDP дейтаграмму на порт 88. KDC отвечает клиенту дейтаграммой на тот порт, откуда поступил запрос.

Для того, чтобы получить доступ к серверу, клиент запрашивает KDC, KDC в ответ отправляет клиенту и серверу копию уникального ключа сеанса (Session Key), действительную в течение короткого времени. Копия ключа сеанса, отправляемая серверу, шифруется с помощью долговременного ключа сервера, а отправляемая клиенту – долговременного ключа клиента. Так теоретически происходит аутентификации клиента и сервера.

При такой схеме, сервер должен хранить в памяти свою копию ключа сеанса до тех пор, пока клиент не свяжется с ним. Может случится так, что запрос от клиента, уже получившего ключ сеанса, поступит на сервер раньше, чем сообщение от KDC с этим ключом. В этом случае сервер не ответит до тех пор, пока не получит от KDC свою копию ключа сеанса.

На практике применяется более эффективная схема управления ключами, позволяющая рационально использовать ресурсы сервера и обеспечивающая хорошую масштабируемость системы. В ответ на запрос служба KDC отправляет оба ключа сеанса клиенту. Сообщение, предназначенное клиенту, шифруется с помощью долговременного ключа клиента, а ключ сеанса для сервера вместе с информацией о клиенте включается в блок данных, получивший название билет сеанса (session ticket). Затем билет сеанса шифруется с помощью долговременного ключа сервера. При такой схеме, служба KDC выдает билет, а клиент сам доставляет на сервер зашифрованный ключ сеанса. Расшифровать копию ключа сеанса может только тот, кто знает секретный долговременный ключ этого клиента, а чтобы прочесть содержимое билета сеанса, нужен долговременный ключ сервера. Клиент получив ответ от KDC извлекает из него билет сеанса, копию ключа сеанса и помещает их в кэш-память (credentials cache, область оперативной памяти, защищенная подсистемой LSA). Затем клиент при подключении посылает серверу билет сеанса зашифрованный с помощью долговременного ключа этого сервера и собственного аутентификатора, зашифрованного ключом сеанса. Сервер используя свой долговременный ключ расшифровывает билет сеанса, затем извлекает из него ключ сеанса и с помощью этого ключарасшифровывает аутентификатор клиента. Билет сеанса и аутентификатор позволяет серверу опознать клиента. Для проведения взаимной аутентификации с клиентом, сервер с помощью своей копии ключа сеанса шифрует аутентификатор клиента и пересылает его клиенту в качестве собственного аутентификатора. Клиент, для связи с сервером, может многократно использовать билет сеанса, выданный KDC. Билет действителен определенное количество времени, продолжительность которого определяется доменной политикой и обычно не превышает восьми часов. По истечении времени все билеты и ключи уничтожаются и клиент для подключения к серверу вновь должен обратиться к KDC за новым билетом сеанса.

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

Протокол Kerberos содержит три подпротокола:

  1. Обмен со службой аутентификации AS Exchange (AuthenticationServiceExchange) — используется KDC для передачи клиенту ключа сеанса регистрации LSK (Logon Session Key) и билета TicketGrantingTicket(TGT).
  2. Обмен со службой выдачи билетов TGS Exchange (Ticket Granting Service Exchange) – используется для рассылки служебных ключей сеанса и ключей сеанса службы KDC.
  3. Обмен клиент-сервер CS Exchange (Client-Server Exchange) используется клиентом для пересылки билета сеанса доступа к службам.

AS Exchange.После входа в сеть, служба Kerberos клиента хеширует введенный пароль, сохраняет его в кэш-памяти (CredentialsCache) и отправляет в KDC запрос KRB_AS_REQ (Authentication Service Request) содержащий идентификатор пользователя, название службы KDC и данные предварительной аутентификации PAD(Pre-authenticationData), представляющие собой метку времени зашифрованную долговременным ключом клиента. KDC находит в базе данных учетную запись клиента, соответствующий ей долговременный ключ, расшифровывает им PAD и сравнивает метку времени. В случае совпадения KDC генерирует билет TGT и отправляет клиенту ответ службы аутентификации KerberosKRB_AS_REP (KerberosAuthenticationServiceReply). Ответ формируется в два этапа. Сначала создается ключ сеанса регистрации LSK (LogonSessionKey) и шифруется долговременным ключом клиента. Затем служба KDCдобавляет в билет TGT SID клиента, SID групп безопасности в которые он входит и еще одну копию ключа LSK, затем шифрует билет собственным долговременным ключом. Отправляемый клиенту пакетKRB_AS_REPсодержит билет TGT и зашифрованный ключ LSK. Получив ответ клиент расшифровывает ключ LSK с помощью своего долговременного ключа, извлекает билет TGT и сохраняет их в кэш-памяти. Долговременный ключ удаляется из Кэш-память, поскольку в текущем сеансе во всех транзакциях с KDC будут использоваться полученные LSK и TGT.

В случае ошибки, отправляется в ответ сообщение KRB_ERROR, которое не шифруется.

Долговременные ключи не передаются по сети, а используются только для шифрования передаваемой информации.

TGS Exchange. Служба Kerberos клиента отправляет в KDC запрос на доступ к серверу — KRB_TGS_REQ (Kerberos Ticket-Granting Service Request). Запрос включает в себя данные о клиенте, зашифрованный с помощью LSK аутентификатор PAD, билет TGT, а также имя сервера к которому нужно получить доступ. KDC получив запрос KRB_TGS_REQ с помощью своего долговременного ключа расшифровывает билет TGT и извлекает LSK клиента и им расшифровывает PAD. В случае совпадения KDC извлекает из TGT данные о клиенте и генерирует ключ сеанса, общий для клиента и сервера. Одну копию этого ключа KDC шифрует с помощью LSKклиента, а другую вместе с данными о клиенте помещает в билет сеанса, который шифрует с помощью долговременного ключа сервера и пакетом KRB_TGS_REP (Kerberos Ticket-Granting Service Reply) отправляет клиенту. Получив пакет клиент, с помощью своего LSK расшифровывает ключ сеанса, извлекает билет сеанса и помещает их в кэш-память.

CS Exchange.

Служба Kerberos клиента отправляет серверу запрос KRB_AP_REQ (Kerberos Application Request). Запрос состоит из аутентификатора клиента, зашифрованного ключом сеанса, билета сеанса и флага, указывающего на необходимость проведения взаимной аутентификации. Получив сообщение KRB_AP_REQ, сервер расшифровывает билет, извлекает данные о клиенте и ключ сеанса. С помощью этого ключа расшифровывает аутентификатор клиента, в случае совпадения метки времени, проверяет установлен ли флаг взаимной аутентификации, если установлен, шифрует метку времени из аутентификатора ключом сеанса, включает полученный результат в пакет KRB_AP_REP (Kerberos Application Reply) и посылает клиенту. Клиент получив пакет расшифровывает аутентификатор, используя ключ сеанса, сравнивает исходную метку времени с полученной. В случае совпадения связь считается установленной и начинается обмен информацией.

Протокол Kerberos позволяет использовать TGT полученный в одном домене, для получения билета сеанса от KDC другого домена, с которым установлены доверительные отношения. Например, для получения доступа к серверу в другом домене, клиент запрашивает у KDC своего домена билет сеанса. KDC не найдя сервер в своей базе данных, отправляет клиенту билет перенаправления (Referral Ticket), который представляет собой TGT, зашифрованный с помощью общего для двух доменов ключа (этот ключ генерируется в момент, когда между доменами устанавливаются доверительные отношения). Получив билет перенаправления, клиент использует его запроса ключа сеанса у KDC другого домена, служба KDC расшифровывает билет перенаправления с помощью своей копии общего ключа и направляет клиенту билет сеанса на доступ к серверу своего домена.

Программа Kerbtray.exe из Windows Server 2003 Resource Kit Tool позволяет проверять и удалять билеты Kerberos с любых связанных компьютеров.

One Response to “Протокол аутентификации в Windows Kerberos V5” Leave a reply ›

  • Спасибо! Статья понятней, чем официальные пособия одобренные майкрасофт, написанные тупым языком технета.

Leave a Reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>