Аутентификация Kerberos
Kerberos используется в корпоративной среде и предназначен для разграничения прав доступа пользователей к различным службам (например, разработчики не должны иметь доступ к бухгалтерским данным). Администраторы создают области Kerberos, охватывающие все ресурсы, к которым возможен доступ. Область определяет, кто и к чему может получить доступ.
Особенности Kerberos:
- имеет особый протокол аутентификации;
- использует билеты (
tickets) для аутентификации; - позволяет не хранить пароли локально и не отправлять их через интернет;
- предполагает участие доверенной третьей стороны;
- основан на криптографии с симметричным ключом.
Билет — это «удостоверение личности», зашифрованное секретным ключом для конкретной службы. Билет хранится на локальном компьютере. Пока билет действителен, пользователь может получить доступ к запрашиваемой службе, которая хранится в области Kerberos. Вместо ввода своих учетных данных, пользователь использует для аутентификации кешированный на своем компьютере билет.
В Kerberos взаимодействуют три стороны:
- сервер аутентификации;
- сервер выдачи билетов;
- служба HTTP, к которой пользователь хочет получить доступ.
Для входа в режим аутентификации сайт должен вернуть код 401 Unauthorized с дополнительным заголовком WWW-Authenticate в ответе.
Пример взаимодействия клиента и сервера
-
Клиент запрашивает защищенный от доступа документ
index.htmlс сервера с помощью методаGET:GET dir/index.html -
При первом запросе документа клиент не отправляет заголовок
Authorization, поэтому сервер отвечает:HTTP/1.1 401 Unauthorized WWW-Authenticate: Negotiate -
Клиент получает учетные данные пользователя с помощью механизма
SPNEGO GSSAPIдля идентификации и создания сообщенияGSSAPI, которое будет отправлено на сервер с новым запросом, включающим следующий заголовок аутентификации:GET dir/index.html Authorization: Negotiate a87421000492aa874209af8bc028 -
Сервер расшифрует данные GSSAPI и передаст их в механизм
SPNEGO GSSAPI. Если передаваемый контекст не заполнен, сервер ответит кодом состояния 401 с заголовкомWWW-Authenticate, содержащим данные GSSAPI:HTTP/1.1 401 Unauthorized WWW-Authenticate: Negotiate 749efa7b23409c20b92356 -
Клиент расшифрует данные GSSAPI и передаст новые данные GSSAPI на сервер:
GET dir/index.html Authorization: Negotiate 89a8742aa8729a8b028
Этот цикл может продолжаться до тех пор, пока не будет сформирован контекст безопасности. Далее клиенту будут возвращены окончательные данные для аутентификации. Если серверу нужно отправить клиенту дополнительные данные GSSAPI для завершения контекста, они должны быть указаны в заголовке WWW-Authenticate вместе с окончательным ответом, содержащим тело HTTP:
HTTP/1.1 200 Success
WWW-Authenticate: Negotiate ade0234568a4209af8bc0280289eca
Клиент расшифрует данные GSSAPI и передаст их, используя контекст для этого сервера. Если статус окончательного вызова будет успешным, ответ можно будет использовать в приложении.
Как происходит обмен данными при доступе к сервису
Клиент и сервер аутентификации
-
Для доступа к сервису клиент представляется серверу аутентификации. После входа в систему с компьютера пользователя к серверу аутентификации посылается запрос в виде обычного текста на получение билета для выдачи билета (
TGT— Ticket-Granting Ticket). Текстовое сообщение содержит:- имя/идентификатор пользователя;
- имя/идентификатор запрашиваемой службы (в этом случае служба — это сервер выдачи билетов);
- сетевой адрес клиента (может быть списком IP-адресов для нескольких компьютеров или быть пустым, чтобы использоваться на любом компьютере);
- запрашиваемый срок действия
TGT.
-
Сервер аутентификации проверяет, существует ли пользователь в базе данных KDC (Key Distribution Center — Центр Распространения Ключей), учетные данные при этом не проверяются. Затем сервер аутентификации отправляет клиенту два сообщения:
-
Сообщение
TGT, зашифрованное секретным ключомTGS. Сообщение содержит:- имя/идентификатор пользователя;
- имя/идентификатор
TGS; - временную метку;
- сетевой адрес клиента (может быть списком IP-адресов для нескольких компьютеров или быть пустым, чтобы использоваться на любом компьютере);
- срок действия
TGT(может быть таким, как запрошен изначально, или меньшим, если срок действия секретных ключей пользователя или ключейTGSподходит к концу, или другим, установленным при настройке Kerberos); - ключ сеанса
TGS.
-
Сообщение, зашифрованное секретным ключом клиента. Сообщение содержит:
- название/идентификатор
TGS; - временную метку;
- срок действия (такой же, как в первом сообщении);
- ключ сеанса
TGS.
- название/идентификатор
Секретный ключ клиента определяется путем запроса пароля, добавления соли (состоящей из
user@REALMNAME.COM) и хеширования всей информации. -
Клиент и сервер выдачи билетов
-
Клиент готовит аутентификатор, который содержит:
- имя/идентификатор пользователя;
- временную метку.
Затем клиент зашифровывает этот аутентификатор ключом
TGS. -
Клиент отправляет серверу выдачи билетов незашифрованное сообщение, которое содержит:
- имя/идентификатор сервиса, к которому требуется получить доступ;
- срок действия билета;
- полученный перед этим аутентификатор;
- полученное от сервера аутентификации сообщение
TGT.
-
Сервер выдачи билетов проверяет базу данных KDC, чтобы узнать, существует ли служба HTTP. Если сервис существует, то сервер выдачи билетов расшифровывает
TGTс помощью своего секретного ключа. Взяв из расшифрованногоTGTключ сеансаTGS, сервер расшифровывает аутентификатор пользователя. -
После этого сервер выдачи билетов:
- сравнивает полученный из аутентификатора идентификатор пользователя с идентификатором
TGT; - сравнивает временную метку, полученную из аутентификатора, с меткой времени, полученной из
TGT; - проверяет по временной метке, не истек ли срок действия
TGT; - убеждается, что средство проверки подлинности еще не находится в кеше
TGS(чтобы избежать повторных атак); - сравнивает IP-адрес источника с сетевым адресом клиента (если сетевой адрес в исходном запросе не равен
null).
- сравнивает полученный из аутентификатора идентификатор пользователя с идентификатором
-
Если все данные верны, сервер выдачи билетов случайным образом генерирует ключ сеанса службы HTTP и подготавливает для пользователя билет службы HTTP, который содержит:
- имя/идентификатор пользователя;
- название/идентификатор службы HTTP;
- сетевой адрес клиента (может быть списком IP-адресов для нескольких компьютеров или быть пустым, чтобы использоваться на любом компьютере);
- временную метку;
- срок действия билета;
- ключ сеанса службы HTTP.
После чего шифрует билет с помощью секретного ключа службы HTTP.
-
Сервер выдачи билетов отправляет клиенту два сообщения:
- Зашифрованный билет службы HTTP.
- Сообщение, зашифрованное ключом сеанса
TGS, которое содержит:- название/идентификатор службы HTTP;
- временную метку;
- срок действия билета;
- ключ сеанса HTTP.
-
Компьютер пользователя расшифровывает последнее сообщение ключом сеанса
TGS, который он ранее кешировал для получения ключа сеанса службы HTTP.Билет службы HTTP компьютер пользователя расшифровать не может, поскольку он зашифрован с помощью секретного ключа службы HTTP.
Клиент и служба HTTP
-
Для получения доступа к службе HTTP клиент готовит еще одно сообщение для аутентификации, которое содержит:
- имя/идентификатор пользователя;
- временную метку.
Затем клиент зашифровывает этот аутентификатор ключом сеанса HTTP.
-
Клиент отправляет сервису аутентификатор и билет службы НТТР, полученный ранее от сервера выдачи билетов.
-
Служба HTTP расшифровывает билет с помощью секретного ключа, чтобы получить ключ сеанса HTTP. Затем он использует этот ключ сеанса для расшифровки отправленного клиентом сообщения аутентификатора.
-
Затем служба HTTP:
- сравнивает полученный из аутентификатора идентификатор пользователя с идентификатором
TGT; - сравнивает временную метку, полученную из аутентификатора, с меткой времени, полученной из
TGT; - проверяет по временной метке, не истек ли срок действия
TGT; - убеждается, что средство проверки подлинности еще не находится в кеше
TGS(чтобы избежать повторных атак); - сравнивает IP-адрес источника с сетевым адресом клиента (если сетевой адрес в исходном запросе не равен
null).
- сравнивает полученный из аутентификатора идентификатор пользователя с идентификатором
-
Затем служба HTTP отправляет клиенту сообщение аутентификатора, содержащее его идентификатор и временную метку, чтобы подтвердить свою подлинность. Сообщение зашифровано с помощью ключа сеанса службы HTTP.
-
Компьютер пользователя считывает сообщение аутентификатора, расшифровывая его с помощью кешированного сеансового ключа службы HTTP, и знает, что он должен получить сообщение с идентификатором службы HTTP и временной меткой.
Аутентификация для использования службы HTTP получена. В будущих запросах используется кешированный запрос службы HTTP, если срок его действия не истек, как определено в атрибуте lifetime.
Полезные ссылки
Промостраница Яндекс Браузера для организаций
Соль — случайные данные, добавляемые к паролю перед хешированием, чтобы повысить безопасность хранения паролей.