Аутентификация с SSL-сертификатом клиента ИЛИ базовая аутентификация

Из соображений безопасности аутентификация для веб-приложения должна быть перенесена в сертификаты клиента SSL. Должна быть возможность войти в систему либо с помощью имени пользователя / пароля, либо с помощью SSL. Кроме того, пользователям из интрасети должно быть разрешено использовать приложение без дополнительной аутентификации.

Мы попытались реализовать этот сценарий согласно официальной документации, но безуспешно.

Вот наш текущий конфиг

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLRequire      %{SSL_CLIENT_I_DN_O} eq "Company_O"
    SSLOptions      +FakeBasicAuth

    Satisfy     any

    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd
    require valid-user

    Order allow,deny
    Allow from 10.20.0.0/255.255.0.0
    Allow from 10.144.100
</Directory>

При такой конфигурации клиентский сертификат даже не запрашивается. Если мы удалим базовую конфигурацию аутентификации, аутентификация клиента SSL будет работать хорошо.

2 ответа

Решение

Вопросу три месяца, поэтому ОП может не понадобиться мой ответ, но он может помочь любому, кто хочет эту конфигурацию.

Вопрос помечен как apache-2.4, но конфигурация выглядит так, как для 2.2. Это не совсем удивительно, так как многие примеры в документации Apache 2.4 сами по себе не подходят для 2.4.

У меня была такая конфигурация, работающая в 2.2 (кроме "Разрешить из", которая не работала), и мне пришлось переписать ее для 2.4. Я обнаружил, что для этого нужны некоторые элементы, которые не сразу проявились в документации.

Я не предлагаю никаких гарантий для этого; это основано на моем файле конфигурации без тестирования. +StrictRequire может не понадобиться в SSLOptions - Я не пробовал без этого, но это работает таким образом.

В этом отношении SSLOptions линия может вообще не потребоваться - +FakeBasicAuth опция, вероятно, не используется. В конфигурации у меня здесь, как только Company_O находится в сертификате, доступ будет предоставлен. Как я понимаю, +FakeBasicAuth используется с Require valid-user (один) и доступ предоставляется, если DN из сертификата находится в списке пользователей, определенном в AuthUserFileвместе с соответствующим паролем. Моя система не работает таким образом, и я подозреваю, что ОП тоже не хотел этого делать.

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # User which is acceptable to basic authentication is OK
    Require valid-user

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>

я должен

<Directory />
    ...
    Require all denied
    ...
</Directory>

в другом файле конфигурации - возможно, это важная часть рецепта.

Мне потребовалось некоторое время, чтобы получить эту работу, потому что казалось, что Require expr %{SSL_CLIENT немного будет работать сам по себе, но в конце концов я понял, что Require ssl-verify-client также было необходимо (см. http://httpd.apache.org/docs/2.4/mod/mod_ssl.html)

Я нашел ответ @yitzchok-lavi очень полезным, но если (как и я) вы хотите избежать всплывающего окна базовой аутентификации, которое появляется для клиентов за пределами вашей сети и без клиентского сертификата,Require valid-userдиректива должна находиться внутриRequireAllраздел. Кроме того, вопрос ОП предполагает, что это уже присутствовало где-то в их конфигурации, но для полноты, если кто-то наткнется на этот вопрос, такжеSSLCACertificateFileнеобходима директива (чтобы определить, какие сертификаты клиента CA будут проверяться).

Фрагмент конфигурации, который я использую:

      <Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire
    # client certs will be verified against this CA
    SSLCACertificateFile /etc/apache2/ssl/iapp-ca.pem

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
        # User which is acceptable to basic authentication is OK
        Require valid-user
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>
Другие вопросы по тегам