Назад | Перейти на главную страницу

Переменная REMOTE_USER без суффикса @DOMAIN

Я администрирую приложение, которое обеспечивает единый вход для допустимых пользователей AD и в настоящее время работает в IIS. Для повышения производительности у меня есть задача перенести веб-слой на Apache / Php в Linux.

У меня есть AD на Win2012 Server и Apache на CentOS. Я успешно присоединился к домену (TEST.COM) и могу войти в centos с учетными записями пользователей Windows.

Я также настроил Kerberos и Samba, и SSO работает с одной проблемой.

Пользователи из AD импортируются в приложение без префикса / суффикса доменного имени. Итак, если мой пользователь в AD - это TEST \ myUser, то в приложении это просто myUser.

Приложение считывает имя пользователя из переменной REMOTE_USER, но к имени пользователя добавляется строка @DOMAIN, в результате чего полное имя пользователя будет myUser@TEST.COM. Естественно, приложение считает, что это недействительный пользователь, поскольку ожидает, что это будет просто myUSer. Если я добавлю в приложение нового пользователя myUser@TEST.COM, система единого входа будет работать нормально.

Есть ли способ отказаться от атрибута @DOMAIN в переменной REMOTE_USER? Как бы вы это сделали и какие файлы нужно настроить?

mod_auth_kerb специфичен для Kerberos: он реализует аутентификацию Kerberos через HTTP Negotiate. Таким образом, в переменной среды REMOTE_USER он сообщает идентификацию Kerberos («основное имя») аутентифицированного клиента. Основные имена Kerberos записываются foo / bar / baz /...@ REALM; ведущие компоненты называются «экземплярами» (чаще всего встречаются только один или два), а «область» - это домен доверия в системе Kerberos, встроенный механизм федерации. В AD область Kerberos совпадает с именем «домена» AD в верхнем регистре.

mod_auth_kerb (достаточно новая версия) имеет функцию KrbLocalUserMapping. Это вызывает функцию библиотеки Kerberos krb5_aname_to_localname () для преобразования основного имени в «локальное имя»; то есть что-то значимое на локальном хосте. Что делает эта функция, зависит от реализации Kerberos. В MIT Kerberos вы можете настроить отображение с помощью правил auth_to_local в krb5.conf. Правило по умолчанию просто переводит foo @ [default realm] -> foo, что достаточно в простых ситуациях, когда существует одна область и ваши имена пользователей совпадают с вашими основными именами Kerberos. Однако вам могут потребоваться более сложные правила. Например, у нас есть соглашение, согласно которому администраторы Windows имеют учетную запись «пользователь-администратор» с правами администратора домена в дополнение к своим учетным записям «пользователей». Когда они входили в свои учетные записи «admin», они получали отказ при переходе к аутентифицированным веб-службам, работающим в Unix, поскольку «user-admin» не распознавался. Мы просто добавили сопоставление, чтобы user-admin @ REALM сопоставлялся с «пользователем», как это делает user @ REALM, и это было немедленно исправлено прозрачно для всех веб-приложений. Еще одна приятная вещь в том, чтобы сделать это таким образом, заключается в том, что он работает для любой керберизованной службы, которая использует krb5_aname_to_localname (), в отличие от использования mod_map_user, которое применимо только к Apache.

Некоторые люди предлагали просто отобразить все имена user @ REALM на «user», независимо от области (это то, что предлагает предлагаемое решение mod_map_user). Обратите внимание, что это потенциальная проблема безопасности: если у вас есть несколько сфер Kerberos, связанных межсферным доверием, то часть области становится значимой; это часть идентификации пользователя. Если вы просто удалите его, это означает, что администратор в другой области может выдать себя за локального пользователя Apache, просто создав учетную запись с тем же именем.

Недавно я успешно реализовал нечто подобное в локальной сетевой среде, используя https://github.com/Legrandin/PyAuthenNTLM2 и заголовки ntlmv2, предоставляемые веб-браузерами.

Он использует mod_python вместо установки samba в качестве дополнительного пакета.

Надеюсь это поможет

Для этого раньше был модуль Apache с именем mod_map_user. В конфигурации Apache вы бы сказали:

MapUsernameRule (.*)@(.*) "$1"

Но: Согласно этому сообщению, mod_auth_kerb (если это то, что вы используете) теперь делает это за вас: Группы пользователей Apache mod_auth_kerb и LDAP