Множественные потоки аутентификации в apache

#apache

#apache

Вопрос:

Я пытаюсь настроить Apache для аутентификации HTTP-запросов с помощью сертификатов kerberos или клиентских сертификатов.

Следующая конфигурация способна проверять подлинность запросов с помощью любого из вышеперечисленных. Однако он выполняет поиск LDAP для обоих. Я хотел бы требовать поиска LDAP только при аутентификации через kerberos. Для проверки подлинности сертификата клиента я хотел бы выполнить некоторую фильтрацию на основе другого свойства в сертификате, а затем использовать значение CN в Authorize-Samaccountname заголовке. Я могу получить CN в заголовке с помощью SSL_CLIENT_S_DN_CN , поэтому должен иметь возможность указать ему использовать тот, который присутствует.

 <VirtualHost *:443>
  ServerName subdomain.example.com
  
  DocumentRoot "/var/www/html"

  <Directory "/var/www/html">
    AllowOverride None
    Require all granted
  </Directory>

  <Location "/">
    <LimitExcept OPTIONS>
        Require ldap-filter objectclass=user
    </LimitExcept>
    AuthType Kerberos
    AuthName "Kerberos Login"
    SSLVerifyClient optional
    SSLVerifyDepth 10
    SSLUserName SSL_CLIENT_S_DN_CN
    SSLRequireSSL
    AuthLDAPURL "ldaps://example.com/dc=EXAMPLE,dc=COM?sAMAccountName"
    AuthLDAPBindDN svc-ldap
    AuthLDAPBindPassword yupyupyup
    ProxyPass http://localhost:8080/ timeout=600
    ProxyPassReverse http://localhost:8080/
  </Location>

  ## Request header rules
  RequestHeader set Authorize-Samaccountname %{AUTHORIZE_SAMACCOUNTNAME}e

  ## Kerberos directives
  KrbMethodNegotiate on
  KrbMethodK5Passwd on
  KrbAuthoritative on
  Krb5Keytab /usr/local/etc/svc-t-kerberos.keytab
  KrbLocalUserMapping on
  KrbVerifyKDC on
  KrbServiceName HTTP/svc-t-kerberos
  KrbSaveCredentials off

  ## SSL directives
  SSLEngine on
  SSLCertificateFile      "/etc/pki/CA/certs/host.example.com.cer"
  SSLCertificateKeyFile   "/etc/pki/CA/certs/host.example.com.key"
  SSLCertificateChainFile "/etc/pki/CA/certs/intermediate.cer"
  SSLCACertificatePath    "/etc/pki/tls/certs"
  SSLCACertificateFile    "/etc/pki/tls/certs/ca-bundle.crt"

</VirtualHost>
  

Как мне обойти поиск LDAP, но вместо этого проверить значение поля сертификата при использовании клиентских сертификатов?

Ответ №1:

Похоже, что если вы укажете несколько Require операторов, может потребоваться любой из них (в зависимости от того, завершается проверка с ошибкой или является нейтральной). В моем случае я могу использовать следующее:

 Require ldap-filter objectclass=user
Require ssl-verify-client
  

Это по-прежнему выполняет поиск LDAP, но, учитывая, что требование SSL проходит, оно все равно позволит пользователю пройти.

Вы можете увидеть mod_authz_core для того, как вы можете использовать RequireAny , и RequireAll для более сложных требований, хотя они не могут быть объединены с. LimitExcept Я предполагаю, что вы могли бы использовать Require method OPTIONS вместо этого, но не исследовали дальше, поскольку вышеупомянутое соответствует моим потребностям.