Устранение неполадок Apache с аутентификацией прокси-сервера GSS и авторизацией LDAP
Я настраиваю внутренний веб-сервер на сервере RHEL, присоединенном к домену, с аутентификацией Kerberos через прокси-сервер GSS и многоуровневой авторизацией с помощью LDAP, где Active Directory является источником истины. Kerberos и часть аутентификации работают нормально, но я не могу заставить работать авторизацию, и у меня нет идей.
Вот конфигурация каталога:
<Directory /var/www/nietools.elsinor.net/html/>
AuthType GSSAPI
AuthName "GSSAPI Login"
Require valid-user
</Directory>
<Directory /var/www/nietools.elsinor.net/html/tools/config_grep/>
AuthType GSSAPI
AuthName "GSSAPI Login"
#GssapiConnectionBound On
#GssapiSignalPersistentAuth On
#GssapiUseSessions On
#Session On
#SessionCookieName gssapi_session path=/private;httponly;secure;
AuthLDAPUrl "ldaps://ad.elsinor.net:636/OU=People,DC=ad,DC=elsinor,DC=net/?sAMAccountName?sub"
AuthLDAPBindDN "CN=nietools,OU=Services,DC=ad,DC=elsinor,DC=net"
AuthLDAPBindPassword "exec:/bin/cat /etc/httpd/conf.d/pw"
Require ldap-group "CN=NIE,OU=Groups,DC=ad,DC=elsinor,DC=net"
</Directory>
Первая конфигурация каталога работает точно так, как ожидалось. Если вы подключаетесь с доменного ноутбука, он проходит прозрачную аутентификацию. Если нет, то запросит логин. Все хорошо.
Второй каталог никого не авторизует. Закомментированные параметры — это все, с чем я возился, пытаясь решить проблему. Я сосредоточил внимание на этих параметрах из-за сообщений в журнале ошибок Apache. Попытки аутентифицированного пользователя получить доступ ко второму каталогу приводят к следующим ошибкам:
2023-08-07 15:40:27.893785 clientip=10.61.3.159:41364, hdr_referer="https://nietools.elsinor.net/", servername=nietools.elsinor.net, pid=45071, tid=140289914160704, module=authz_core, loglevel=error, message="AH01631: user testuser@AD.ELSINOR.NET: authorization failure for "/tools/config_grep": "
2023-08-07 15:40:27.992661 clientip=10.61.3.159:41364, hdr_referer="https://nietools.elsinor.net/", servername=nietools.elsinor.net, pid=45071, tid=140289905768000, module=auth_gssapi, loglevel=error, message="INTERNAL ERROR Mechanism needs continuation but neither GssapiConnectionBound nor GssapiUseSessions are configured"
Эти сообщения об ошибках появляются постоянно, по-видимому, независимо от того, как я настраиваю GssapiConnectionBound и GssapiUseSessions — ни одно из них не появляется ни в одной из найденных мной ссылок на конфигурацию, относящихся к такой настройке.
И, кстати, аутентификация будет работать так, как и ожидалось, если я удалю LDAP из уравнения и помещу пользователей в группу, определяемую вручную, вот так:
<Directory /var/www/nietools.elsinor.net/html/tools/config_grep/>
AuthType GSSAPI
AuthName "GSSAPI Login"
AuthGroupFile "/etc/httpd/conf.d/groups"
Require group nie
</Directory>
Возможно ли, что сообщение INTERNAL ERROR является безопасным, а реальная проблема более обыденна — например, использование атрибута, отличного от SamAccountName? (Я уже пробовал UserPrincipalName.)
Это, кстати, RHEL 9 и Apache 2.4.
РЕДАКТИРОВАТЬ: я заметил кое-что в журналах отладки Apache: модуль Kerberos передает в модуль LDAP, но UserPrincipalName — [email protected][email protected] . Возможно, в этом проблема. Я подозреваю, что мне придется каким-то образом использовать атрибут UserPrincipalName и псевдоним «AD.ELSINOR.NET» для «elsinor.net».
РЕДАКТИРОВАТЬ 2: Не то. Я реализовал предложение пользователя user1686, и журналы Apache теперь показывают, что идентификаторы пользователей должны соответствовать имени sAMAccountName. К сожалению, они до сих пор не авторизованы. Я подозреваю одно из двух:
Происходит что-то более фундаментальное, и я просто не могу этого найти. Я проверил значения AuthLDAPUrl, AuthLDAPBindDN и Require примерно по 20 раз каждое.
Ошибка «требуется продолжение» на самом деле актуальна, и я не устранил ее должным образом, потому что понятия не имею, что это значит.
Мне следует добавить то, что я уже выполнилsudo setsebool -P httpd_can_connect_ldap 1
и аудит SELinux чист, даже после отключения неприятных молчаливых отказов с помощьюsemodule -DB
.
РЕДАКТИРОВАТЬ 3: Конфигурация gssproxy:
[service/HTTP]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 48
krb5_principal = HTTP
[service/ldap]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 55
krb5_principal = ldap
[service/imap]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 76
krb5_principal = imap
1 ответ
Имена участников Kerberos не совсем совпадают с именами UPN Active Directory. Принципал, который вы получаете от GSSAPI, выглядит как UPN (и оба называются «именами принципалов», что сбивает с толку), но на самом деле не имеет к нему прямого отношения.
Участники Kerberos в AD формируются из имени пользователя NT (sAMAccountName
) плюс область Kerberos домена (которая всегда представляет собой версию домена в верхнем регистре, независимо от каких-либо суффиксов UPN).
Я бы, наверное, использовалGssapiLocalName On
чтобы библиотека Krb5 попыталась преобразовать принципала в «имя локальной учетной записи»; в конфигурации по умолчанию этот перевод всегда просто удаляет область системы по умолчанию. То есть,user@LOCAL.REALM
становится справедливымuser
, который затем подходит для запроса LDAP к sAMAccountName (при этом субъекты из внешних областей остаются как есть).