Аутентификация с 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>