Apache Webserver
SSL gesicherter Webserver
Zur Absicherung unserer Privatsphäre bei unserem Webmailers möchten wir doch das Mitlesen unserer Daten (Authentifizierung wie auch Nachrichten) erschwehren. Hierzu nutzen mir das Modul mod_ssl unseres Apache Webservers. Nachfolgende Beschreibung zeigt, wie man unter CentOS 5 einen SSL geschützten virtuellen Host aufsetzen kann.
Installation
Die noch fehlenden Pakete openssl und mod_ssl installieren wir via yum.
# yum install openssl mod_ssl
Paket-Informationen
Mittels dem Befehl rpm informieren wir uns über den Inhalt der beiden Pakete und über die mitgebrachten Konfigurationsordner.
openssl
Als ersten sehen wir uns das Paket openssl näher an:
# rpm -iql openssl
Name : openssl Relocations: (not relocatable)
...
...
URL : http://www.openssl.org/
Summary : Das OpenSSL-Toolkit
Description :
Das OpenSSL-Toolkit liefert Support für die sichere Kommunikation
zwischen Computern. OpenSSL enthält ein zertifiziertes Management-Tool
und gemeinsam genutzte Bibliotheken, die verschiedene kryptografische
Algorithmen und Protokolle zur Verfügung stellen.
/etc/pki/CA
/etc/pki/CA/private
/etc/pki/tls
/etc/pki/tls/cert.pem
/etc/pki/tls/certs
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/ca-bundle.crt
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/misc
/etc/pki/tls/misc/CA
/etc/pki/tls/misc/c_hash
/etc/pki/tls/misc/c_info
/etc/pki/tls/misc/c_issuer
/etc/pki/tls/misc/c_name
/etc/pki/tls/openssl.cnf
/etc/pki/tls/private
...
mod_ssl
Die Konfiguration unseres Webserver erfolt über das Paket mod_ssl.
# rpm -iql mod_ssl Name : mod_ssl Relocations: (not relocatable) ... ... URL : http://httpd.apache.org/ Summary : SSL/TLS Modul für den Apache HTTP Server Description : The mod_ssl module provides strong cryptography for the Apache Web server via the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols. /etc/httpd/conf.d/ssl.conf /usr/lib/httpd/modules/mod_ssl.so /var/cache/mod_ssl
SSL - Zertifikate
Selbstgeneriertes Zertifikat
Zum ersten Testen und für Anwendungen im Intranet reicht ja unter Umständen ein self-signed certificate.
Privater Schlüssel
Als erstes generieren wir uns einen privaten Schlüssel.
# openssl genrsa -out pivate.key 1024
Über die Dateiberechtigung schützen wir die Datei vor fremden Blicken.
# chmod 400 private.key
Dann kopieren wir diesen an die richtige Stelle.
# cp private.key /etc/pki/tls/private/
Zertifikatsregistrierungsanforderung
Damit unser digitales Zertifikat erstellt werden kann, benötigen wir ein CSR1), eine Textzeichenfolge, die wir mit Hilfe der SSL-Software openssl auf unserem zu zertifizierenden Servers erzeugen. Mit Eingabe eines Punktes . erzeugen wir dabei ein leeres Feld.
# openssl req -new -key private.key -out self-signed-cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:webmailer.nausch.org
Email Address []:michael@nausch.org
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Auch hier passen wir die Dateiberechtigung an.
# chmod 400 self-signed-cert.csr
Unseren Certificate Signing Request kopieren wir dann nach /etc/pki/tls/private/ .
# cp self-signed-cert.csr /etc/pki/tls/private/
Selbst signiertes Zertifikat
Zum Schluß erstellen wir uns nun unser eigenes Zertifikat mit Hilfe des Programms openssl.
# openssl x509 -req -days 3650 -in test-ca.csr -signkey private.key -out self-signed-cert.crt Signature ok subject=/C=DE/ST=Bayern/L=Pliening/O=Nausch/CN=webmailer.nausch.org/emailAddress=michael@nausch.org Getting Private key
Wie schon zuvor passen wir auch hier die Berechtigung an.
# chmod 400 self-signed.crt
Und verschieben unser Zertifikat an die korrekte Stelle im System.
# cp self-signed-cert.crt /etc/pki/tls/certs
Anschließend löschen wir die nicht mehr benötigen Dateien in unserem Arbeitsverzeichnis.
# rm private.key # rm self-signed-cert.csr
Offizielles Zertifikat
Für die eigentliche Produktivumgebung, im speziellen von verschiedenen Orten/Rechnern mit unterschiedlichen Browsern, ist die Verwendung eines offiziellen Zertifikates angesagt. Als Beispiel eines „bezahlbaren“ Zertifikates sei als Quelle SSL123 Certificate von Thawte genannt.
Die grundlegende Herangehensweise entspricht, die unserem selbstsignierten Testzertifikat.
Privater Schlüssel
Als erstes generieren wir uns einen privaten Schlüssel.
# openssl genrsa -out pivate.key 1024
Über die Dateiberechtigung schützen wir die Datei vor fremden Blicken.
# chmod 400 private.key
Dann kopieren wir diesen an die richtige Stelle.
# cp private.key /etc/pki/tls/private/
Zertifikatsregistrierungsanforderung
Damit von Thawte unser digitales Zertifikat erstellt werden kann, benötigen wir ein CSR2), eine Textzeichenfolge, die wir mit Hilfe der SSL-Software openssl auf unserem zu zertifizierenden Servers erzeugen. Mit Eingabe eines Punktes . erzeugen wir dabei ein leeres Feld.
# openssl req -new -key private.key -out self-signed-cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:webmailer.nausch.org
Email Address []:michael@nausch.org
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Auch hier passen wir die Dateiberechtigung an.
# chmod 400 self-signed-cert.csr
Unseren Certificate Signing Request kopieren wir dann nach /etc/pki/tls/private/ .
# cp self-signed-cert.csr /etc/pki/tls/private/
Den Inhalt unseres CSR schicken wir nun Thawte, bzw. geben den Inhalt der Datei im Browserfenster bei der Bestellung ein.
offizielles "Thawte" signiertes Zertifikat
Von Thawte erhalten wir dann unser Zertifikat, welches wir in einer einfachen Textdatei auf unserem Server ablegen.
# vim /etc/pki/tls/certs/unser-offizieller-host.crt
Auch hier passen wir die Datei-Berechtigung an.
# chmod 400 /etc/pki/tls/certs/unser-offizieller-host.crt
Anschließend löschen wir die nicht mehr benötigen Dateien in unserem Arbeitsverzeichnis.
# rm private.key # rm self-signed-cert.csr
SSL Zusatzbefehle
Inhalt eines Zertifikates anzeigen (DER, PEM bzw. NET):
# openssl x509 -in filename -text -inform DER
Konvertierung vom DER ins PEM Format
# openssl x509 -in infile.name -inform DER -out outfile.name -outform PEM
Mit einem HTTPS-Server verbinden und sich das Certifikat und dessen Zertifikatskette anzeigen lassen.
# openssl s_client -showcerts -connect www.m-net.de:443
Konfiguration
Apache
Als erstes geben wir nun unserem System unsere Daten zum erstelten Zertifikat bekannt. Diese erden in der Datei /etc/httpd/conf.d/ssl.conf eingetragen.
# vim /etc/httpd/conf.d/ssl.conf
- ssl.conf
... # Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. SSLCertificateFile /etc/pki/tls/certs/self-signed-cert.crt # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) SSLCertificateKeyFile /etc/pki/tls/private/private.key ...
VHost
Am Anfang unserer VHost-Konfigurationsdatei /etc/httpd/conf.d/vhosts.conf tragen wir die Option NameVirtualHost *:443 ein.
# vim /etc/httpd/conf.d/vhosts.conf
- vhosts.conf
# This configuration file enables the vhosts to this Server NameVirtualHost *:80 NameVirtualHost *:443 ...
Bei der Definition unseres VHost geben wir an:
# vim /etc/httpd/conf.d/vhosts.conf
- vhosts.conf
... # # webmailer.nausch.org # ssl verschlüsselt # <VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/pki/tls/certs/self-signed-cert.crt SSLCertificateKeyFile /etc/pki/tls/private/private.key ServerName webmailer.nausch.org:443 ServerAdmin webmaster@nausch.org ...
Anschließend starten wir unseren Webmailer einmal durch, damit dieser unsere Änderungen übernehmen kann.
Paketfilter
Damit unser Webserver Anfragen auf Port 443 auch annehmen kann, öffnen wir noch den Port im Paktefilter.
# vim /etc/sysconfig/iptables
- A INPUT -i eth3 -p tcp -m state –state NEW -m tcp –dport 443 -j ACCEPT
Ein restart unserer Firewall öffnet schließlich den Port.
# service iptables restart
Deeplinks unterbinden
Überaus nette Zeitgenossen meinen zu Weilen, Inhalte eines Webservers für eigene Zwecke ohne Authorisierung zu verwenden. In der Regel werden dabei Graphiken geklaut. Dies unterbinden wir durch eine kleine Änderung in unserer Konfiguration.
VHost anpassen
In unserer VHostdefinition „erlauben“ wir die Verwendung der .htaccess durch folgenden Eintrag in der _Directory_Directive_.
AllowOverride All
Anschließend starten wir unseren Apache-Webserver einmal durch.
.htaccess
In unserem V-Host Verzeichnis legen wir uns nun eine Datei .htaccess an.
# vim .htaccess
- .htaccess
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://meine.domäne.de/.*$ [NC] RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png)$ RewriteRule ^.*$ - [F]
Erfolgskontrolle
Wenn wir nun mit unserem Browser der Wahl die Seite unseres Content-Diebes aufrufen, können wir nun feststellen, dass in dem gezeigten Beispiel, die Deeplinks auf Bilder in unserem Webangebot erfolgreich unterbunden werden!