Verzeichnisschutz per Client-Zertifikat

Wenn du bspw. durch die auf meiner Seite vorhandene Anleitung ein selbst signiertes Client-Zertifikat erstellt hast und mit diesem auch gern Verzeichnisse auf deinem Webserver absichern möchtest, können dir die hier beschriebenen Möglichkeiten sicherlich weiterhelfen.

Alternativ gibt es auch eine Anleitung zur BasicAuth-Methode, mit welcher du Verzeichnisse per Benutzernamen und Passwort schützen kannst.


Anzeige

Du rufst im Pfad /etc/apache2/sites-available die Datei zur SSL-Konfiguration deines Web-Servers auf. Bspw. im Terminal per nano, oder mit jedem anderen Editor. Schau zunächst in deinem Verzeichnis nach, wie die Datei bei dir heißt.

sudo nano /etc/apache2/sites-available/default-ssl.conf

Je nachdem, ob du mehrere virtuelle Hosts definiert hast, suchst du dir den passenden Abschnitt in der Datei.

Das sollte in den meisten Fällen erst mal so ähnlich aussehen:

<VirtualHost *:443>
	ServerAdmin admin@server.mail
	ServerName server-name.tld
	ServerAlias server-name.tld
	DocumentRoot /var/www/...

        <Directory /var/www/.../>
                AllowOverride All
        </Directory>
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Include /etc/letsencrypt/options-ssl-apache.conf
	
	SSLCertificateFile /....pem
	SSLCertificateKeyFile /....pem
</VirtualHost>

Allgemein

In jedem Fall müssen die folgenden Zeilen nach DocumentRoot /var/www/... aufgeführt werden:

    SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette
    SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden
    SSLCARevocationCheck chain no_crl_for_cert_ok
	
    SSLVerifyClient optional  # optional = Client-Zert. !muss nicht zwingend! für Zugriff vorhanden sein / require = Client-Zert. !muss zwingend! für Zugriff vorhanden sein
    SSLVerifyDepth  10
    SSLOptions      +StrictRequire +StdEnvVars

Wichtig sind die Angaben zum SSLCACertificateFile und zu SSLVerifyClient. Wird SSLVerifyClient hart auf „require“ eingestellt, muss zwingend ein Client-Zertifikat für den Zugriff auf entsprechend geschützte Verzeichnisse vorhanden sein. Wird SSLVerifyClient auf „optional“ gestellt, kann der Zugriff auf das Verzeichnis auch ohne Zertifikat (bspw. wenn man allgemeinen Inhalt ausgeben möchte, den jeder sehen darf), oder mit der alternativen BasicAuth-Methode erfolgen.


Anzeige

Client-Zertifikat verpflichtend

Also, wenn der Verzeichnisschutz zwingend ein Client-Zertifikat voraussetzen soll, muss wie zuvor beschrieben, für SSLVerifyClient die Option „require“ gesetzt sein.

Nun wechseln wir in den Abschnitt zwischen <Directory /var/www/.../> AllowOverride All</Directory>. Folgende Inhalte werden eingefügt:

<RequireAll>
    Require ssl-verify-client
    Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname"
</RequireAll>

ErrorDocument 403 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>ZERTIFIKAT NICHT GEFUNDEN</font></b> \
<br><br>Sie ben&ouml;tigen ein Client-Zertifikat um auf diese Seite zugreifen zu k&ouml;nnen.</font><br><br><hr>"

Es wird lediglich geprüft, dass das Client-Zertifikat von der Zertifizierungsstelle ServerZertifikat_Firmenname ausgestellt und signiert wurde, egal welche Firmenangabe im Client-Zertifikat (SSL_CLIENT_S_DN_O) hinterlegt ist. Diese Prüfung macht in jedem Fall Sinn.

Mit der Hinterlegung von ErrorDocument 403 wird noch eine aussagekräftigere Meldung definiert, als sie der Webserver ausgeben würde, wenn kein passendes Zertifikat gefunden wird.

Die Bedingungen, die im Client-Zertifikat vorkommen müssen, um diesem auch den Zugriff auf das Verzeichnis zu gewähren, lassen sich auch erweitern und damit verfeinern. Bspw. so:

Require expr ( %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname" \
        and %{SSL_CLIENT_S_DN_CN} == "ClientZertifikat_Inhaber" \
        and %{SSL_CLIENT_S_DN_OU} in {"ClientZertifikat_Abteilung1", "ClientZertifikat_Abteilung2", "ClientZertifikat_Abteilung ..."} )

Du prüft also, ob das Client-Zertifikat von der Zertifizierungsstelle ServerZertifikat_Firmenname (SSL_CLIENT_I_DN_O) signiert wurde, ob das Client-Zertifikat für einen bestimmten Benutzer (SSL_CLIENT_S_DN_CN) erstellt wurde und ob dieser in einer der angegebenen Abteilungen (SSL_CLIENT_S_DN_OU) beschäftigt ist.

Nur wenn diese Bedingungen erfüllt sind, ist auch ein Zugriff auf das Verzeichnis möglich.

Fertig kann das Ganze dann also so aussehen:

<VirtualHost *:443>
	ServerAdmin admin@server.mail
	ServerName server-name.tld
	ServerAlias server-name.tld
	DocumentRoot /var/www/...

    SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette
    SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden
    SSLCARevocationCheck chain no_crl_for_cert_ok
	
	SSLVerifyClient require 
	SSLVerifyDepth  10
	SSLOptions      +StrictRequire +StdEnvVars

    <Directory /var/www/.../>
        AllowOverride All

        <RequireAll>
            Require ssl-verify-client
            Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname"
        </RequireAll>

        ErrorDocument 403 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>ZERTIFIKAT NICHT GEFUNDEN</font></b> \
        <br><br>Sie ben&ouml;tigen ein Client-Zertifikat um auf diese Seite zugreifen zu k&ouml;nnen.<br><br><hr>"

    </Directory>
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Include /etc/letsencrypt/options-ssl-apache.conf
	
	SSLCertificateFile /....pem
	SSLCertificateKeyFile /....pem
</VirtualHost>

Anzeige

Client-Zertifikat und BasicAuth-Methode kombinieren

Hilfreich, wenn man geschützte Verzeichnisse bereitstellen möchte, den Zugriff aber nicht nur vom Client-Zertifikat abhängig machen kann / will, ist die Option den Zugriffsschutz unter Verwendung beider Möglichkeiten bereitzustellen.

Die Nutzung eines Client-Zertifikats, oder alternativ die der BasicAuth-Methode lassen sich kombinieren.

Wichtig ist hierfür, wie unter den allgemeinen Angaben beschrieben, dass SSLVerifyClient in diesem Fall auf „optional“ gestellt werden muss.

Um die Kombination aus Client-Zertifikat und BasicAuth-Methode bereitzustellen, muss nach dieser Anpassung folgender Code zum bereits vorhandenen hinzugefügt werden:

AuthType Basic
AuthName "Zugriff auf geschütztes Verzeichnis"
AuthBasicProvider file
AuthUserFile /PFAD/ZU/.htusers
Require user BENUTZER_IN_HTUSERS1, BENUTZER_IN_HTUSERS2 ...

Das ErrorDocument 403 wird nun noch durch ErrorDocument 401 ersetzt, da der Webserver diesen Fehlercode zurückmelden wird, wenn weder Client-Zertifikat vorhanden ist, noch die Anmeldedaten für die BasicAuth-Methode korrekt sind.

ErrorDocument 401 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>UNG&Uuml;LTIGE ANMELDEDATEN</font></b> \
<br><br>Sie ben&ouml;tigen Zugangsdaten, oder ein Client-Zertifikat um auf diese Seite zugreifen zu k&ouml;nnen.<br><br><hr></font>"

Zusammen sieht das Ganze dann bspw. so aus:

<VirtualHost *:443>
	ServerAdmin admin@server.mail
	ServerName server-name.tld
	ServerAlias server-name.tld
	DocumentRoot /var/www/...

    SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette
    SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden
    SSLCARevocationCheck chain no_crl_for_cert_ok

	SSLVerifyClient optional 
	SSLVerifyDepth  10
	SSLOptions      +StrictRequire +StdEnvVars

    <Directory /var/www/.../>
        AllowOverride All

        <RequireAll>
            Require ssl-verify-client
            Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname"
        </RequireAll>

        AuthType Basic
        AuthName "Zugriff auf geschütztes Verzeichnis"
        AuthBasicProvider file
        AuthUserFile /PFAD/ZU/.htusers
        Require user BENUTZER_IN_HTUSERS1, BENUTZER_IN_HTUSERS2 ...

        ErrorDocument 401 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>UNG&Uuml;LTIGE ANMELDEDATEN</font></b> \
<br><br>Sie ben&ouml;tigen Zugangsdaten, oder ein Client-Zertifikat um auf diese Seite zugreifen zu k&ouml;nnen.<br><br><hr></font>"

    </Directory>
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Include /etc/letsencrypt/options-ssl-apache.conf
	
	SSLCertificateFile /....pem
	SSLCertificateKeyFile /....pem
</VirtualHost>

Anzeige

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.