Authentifizieren mit Client-SSL-Zertifikat oder Basisauthentifizierung

Authentifizieren mit Client-SSL-Zertifikat oder Basisauthentifizierung

Aus Sicherheitsgründen sollte die Authentifizierung für eine Webanwendung auf SSL-Client-Zertifikate umgestellt werden. Die Anmeldung sollte wahlweise mit Benutzername/Passwort oder SSL möglich sein. Zudem sollte es Benutzern aus dem Intranet erlaubt sein, die App ohne zusätzliche Authentifizierung zu nutzen.

Wir haben versucht, dieses Szenario gemäß der offiziellen Dokumentation zu implementieren, jedoch ohne Erfolg.

Hier ist unsere aktuelle Konfiguration

<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>

Bei dieser Konfiguration wird nicht einmal ein Client-Zertifikat angefordert. Wenn wir die grundlegende Authentifizierungskonfiguration entfernen, funktioniert die SSL-Client-Authentifizierung gut.

Antwort1

Die Frage ist drei Monate alt, daher benötigt der OP meine Antwort möglicherweise nicht, sie kann aber jedem helfen, der diese Konfiguration wünscht.

Die Frage ist mit apache-2.4 gekennzeichnet, aber die Konfiguration sieht aus wie eine, die für 2.2 geeignet ist. Das ist nicht ganz überraschend, da viele Beispiele in der Apache 2.4-Dokumentation selbst nicht für 2.4 geeignet zu sein scheinen.

Ich hatte eine solche Konfiguration in 2.2 am Laufen (außer „Allow from“, das nicht funktionierte) und musste sie für 2.4 neu schreiben. Ich stellte fest, dass einige Elemente fehlten, die in der Dokumentation nicht sofort ersichtlich waren.

Ich übernehme hierfür keine Garantie; es basiert auf meiner Konfigurationsdatei und wurde nicht getestet. +StrictRequireIst möglicherweise nicht erforderlich SSLOptions– ich habe es nicht ohne versucht, aber so funktioniert es.

In diesem Zusammenhang SSLOptionsist die Zeile möglicherweise überhaupt nicht erforderlich – die +FakeBasicAuthOption wird wahrscheinlich nicht verwendet. In der Konfiguration, die ich hier habe, wird der Zugriff gewährt, sobald Company_Oim Zertifikat gefunden wird. So wie ich es verstehe, +FakeBasicAuthwird mit Require valid-user(allein) verwendet und der Zugriff wird gewährt, wenn der DN aus dem Zertifikat in der in definierten Benutzerliste gefunden wird AuthUserFile, zusammen mit einem entsprechenden Passwort. Mein System funktioniert so nicht und ich vermute, dass der OP das auch nicht wollte.

<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
        # Correction: eq is integer comparison, string comparison requires ==
        # Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
        Require expr %{SSL_CLIENT_I_DN_O} == "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>

Ich habe

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

in einer anderen Konfigurationsdatei - es könnte sein, dass dies ein wichtiger Teil des Rezepts ist.

Es hat eine Weile gedauert, bis ich das zum Laufen gebracht habe. Es schien, als Require expr %{SSL_CLIENTwürde das Bit von alleine funktionieren, aber irgendwann habe ich gemerkt, dass das Require ssl-verify-clientauch erforderlich ist (siehehttp://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)

Antwort2

Ich fand die Antwort von @yitzchok-lavi sehr nützlich, aber wenn Sie (wie ich) das Popup zur grundlegenden Authentifizierung vermeiden möchten, das für Clients außerhalb Ihres Netzwerks und ohne Client-Zertifikat angezeigt wird, Require valid-usermuss die Anweisung in diesem Abschnitt stehen RequireAll. Außerdem legt die Frage des OP nahe, dass dies bereits irgendwo in seiner Konfiguration vorhanden war, aber der Vollständigkeit halber sei erwähnt, dass die Anweisung auch erforderlich ist, falls jemand über diese Frage stolpert SSLCACertificateFile(um zu definieren, anhand welcher CA-Client-Zertifikate überprüft wird).

Der von mir verwendete Konfigurationsausschnitt:

<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>

verwandte Informationen