Вопрос или проблема
Я внедряю Okta в качестве провайдера единого входа в корпоративной среде с примерно 90 пользователями. Одна из функций Okta — это Desktop Single Sign On — возможность аутентификации пользователей с помощью Okta просто на основании входа в свою машину и, таким образом, аутентификации с доменом. Пользователь просто открывает браузер, переходит на URL-адрес Okta компании, и он автоматически входит в систему.
Без этой функции пользователю пришлось бы вводить свои учетные данные при загрузке URL-адреса Okta.
Desktop Single Sign On (DSSO) реализуется за счет того, что браузер получает билет Kerberos из операционной системы, который сам генерируется, когда пользователь аутентифицируется в домене Active Directory. Затем браузер передает этот билет на сервер, который взаимодействует с облаком Okta для аутентификации пользователя.
Поток аутентификации в нашей среде выглядит следующим образом:
- Пользователь входит в свою машину. При входе и аутентификации в домене создается билет Kerberos.
- Пользователь открывает браузер и либо пытается получить доступ к приложению, защищенному/интегрированному с Okta, либо идет напрямую на свой портал Okta.
- Okta перенаправляет пользователя к нашему балансировщику нагрузки, который обрабатывает запрос в веб-приложении IWA на веб-сервере.
- Веб-приложение IWA вызывает у браузера аутентификацию.
- Браузер получает билет Kerberos из ОС и передает его балансировщику нагрузки, который передает его веб-приложению IWA.
- Приложение IWA проверяет билет и извлекает профиль пользователя из Active Directory.
- Приложение IWA создает и цифрово подписывает токен SSO и отправляет его в браузер.
- Браузер отправляет токен обратно в Okta через POST-форму HTML.
- Okta завершает запрос на вход и возвращает пользователя в приложение с токеном SSO.
Процесс не работает на шаге 5, и я знаю это, потому что:
- Chrome запрашивает у пользователя учетные данные NTLM, когда запрашивается URL-адрес Okta.
- Этот запрос возникает до того, как веб-приложение IWA и браузер настроены должным образом для DSSO (в соответствии с документацией, на которую я ссылался в начале).
- Запрос не возникает в Chrome, Firefox и Internet Explorer на Windows (DSSO работает на Windows с Chrome, Firefox и IE).
- Этот запрос не возникает в Safari на macOS X, но возникает с Chrome и Firefox в OS X.
Что я не могу понять, так это почему Chrome и Firefox не получают билет Kerberos из ОС в macOS X, в то время как те же браузеры в Windows без проблем получают билет.
Принятые мной шаги:
-
Настройка белого списка Chrome с помощью следующих команд терминала (рекомендовано в документации Okta):
$ defaults write com.google.Chrome AuthServerWhitelist “*.example.com”
$ defaults write com.google.Chrome AuthNegotiateDelegateWhitelist “*.example.com”
- Настройка белого списка Chrome с помощью конфигурации SimpleMDM (этот метод действительно прошел, настройки были переданы в Chrome – это подтвердили, перейдя на chrome://policy и увидев эти настройки).
- Удаление антивируса.
- Добавление всех возможных FQDN в список серверов, разрешенных на шаге 2 – сначала только серверы, которые мы разрешили в Windows (поскольку в Windows это действительно работает), а затем список серверов Okta, рекомендованных поддержкой Okta.
Я по-прежнему не могу заставить эту функцию работать и теперь пытаюсь выяснить, есть ли способ отладить процесс, который Chrome использует для получения билета Kerberos из ОС. Какой-то отладчик для механизма получения билета Kerberos в Chrome был бы отличным, но я полагаю, что такого не существует.
Это должно работать с:
$ defaults write com.google.Chrome AuthServerWhitelist '*.example.com'
$ defaults write com.google.Chrome AuthNegotiateDelegateWhitelist '*.example.com'
Обратите внимание, что я заменил ” на ‘
Я думаю, что Chrome на macOS необычен тем, как он ищет SPN для Kerberos, когда имя хоста разрешается в CNAME. Он ищет SPN с этим CNAME и не возвращается к исходному имени хоста. Firefox, Safari и даже curl –negotiate будут работать только с SPN для имени хоста, но Chrome (и только на macOS) не сработает, если вы не зарегистрируете SPN для CNAME.
Так, например, в моем случае проблема возникла, потому что я использую Kerberos через сетевой балансировщик нагрузки. Имя хоста разрешается в что-то вроде xxxx.elb.us-east-1.amazonaws.com, чтобы заставить Chrome на macOS работать правильно, мне нужно было зарегистрировать SPN следующим образом:
setspn $acct -a HTTP/xxxx.elb.us-east-1.amazonaws.com
Ответ или решение
Вопрос, с которым вы столкнулись, связан с тем, что браузеры Chrome и Firefox на macOS не могут правильно получить Kerberos билет для аутентификации в Okta через Desktop Single Sign-On (DSSO). Проблема, как вы указали, проявляется на этапе 5 вашего процесса аутентификации, когда браузер запрашивает учетные данные NTLM, вместо того чтобы автоматически использовать ранее полученный Kerberos билет. Давайте разберем возможные причины этой проблемы и пути их решения.
Возможные причины проблемы
-
Настройка SPN (Service Principal Name):
Как вы уже отметили, Chrome на macOS специфичен в отношении того, как он ищет SPN для Kerberos. В случаях, когда доменное имя разрешается в CNAME, Chrome требует, чтобы SPN был зарегистрирован для CNAME, а не только для оригинального имени хоста. Firefox, Safari и другие инструменты могут работать с SPN для оригинального имени, но Chrome требует дополнительной конфигурации. -
Настройки браузера:
Несмотря на то, что вы уже настраивалиAuthServerWhitelist
иAuthNegotiateDelegateWhitelist
, важно убедиться, что эти настройки применены корректно. -
Кэширование Kerberos билетов:
В редких случаях может помочь очистка кэша Kerberos билетов, если там есть устаревшая информация.
Шаги для устранения проблемы
-
Регистрация SPN:
Убедитесь, что у вас правильно зарегистрирован SPN для любого CNAME, используемого в вашей конфигурации. Например, если ваш домен обращается к сетевому балансировщику нагрузки (например, AWS ELB), выполните следующую команду:setspn $acct -a HTTP/xxxx.elb.us-east-1.amazonaws.com
Замените
$acct
на имя учетной записи, под которой будет осуществляться аутентификация. -
Проверка настроек Chrome:
Убедитесь, что вы правильно настроили настройки для Chrome. Ваша команда в терминале должна выглядеть следующим образом:defaults write com.google.Chrome AuthServerWhitelist '*.example.com' defaults write com.google.Chrome AuthNegotiateDelegateWhitelist '*.example.com'
После внесения изменений проверьте их, зайдя на страницу
chrome://policy
. -
Проверка конфигурации системы:
Убедитесь, что настройки Kerberos на вашем Mac правильно настроены. Проверьте файл/etc/krb5.conf
и убедитесь, что он корректно указывает на ваш KDC и realm. -
Очистка кэша Kerberos:
Выполните очистку кэша Kerberos билетов, чтобы исключить вероятность использования устаревших билетов:kdestroy
-
Тестирование аутентификации:
После всех изменений запустите функции аутентификации и проверьте, исчезает ли запрос на учетные данные NTLM. -
Логи и диагностика:
Если проблема остается нерешенной, вы можете использовать инструменты отладки, такие как Wireshark, для захвата трафика и анализа Kerberos сообщений, чтобы увидеть, проходит ли аутентификация правильно или возникает ошибка.
Заключение
Ваша проблема может быть вызвана несколькими факторами, включая неправильную настройку SPN для CNAME, проблемы с конфигурацией браузера или системным Kerberos. Следуя вышеуказанным шагам, вы должны быть в состоянии выявить и устранить причину неудачи аутентификации. Если проблема сохраняется, рассмотрите возможность обращения в техническую поддержку Okta для дополнительной помощи.