Webserver Apache
Willemers Informatik-Ecke
Wer einen Webserver auf der Basis von Windows aufsetzt, demonstriert damit, dass er Angst hat, sich mit Linux zu befassen. Ein Linux-Server ist lizenzfrei, wartungsärmer und schon allein deshalb performanter, weil nicht ständig ein Virenscanner mitläuft. Darüber hinaus sind die Software-Quellen sicher und ein Update deutlich unproblematischer.

Da es also keinen sachlichen Grund für einen Windows-Server gibt, befasst sich diese Seite auch nicht mit Apache in einer Windows-Umgebung.

Installation

Jedes Linux hat Apache in seinem Repository. Da das Repository die denkbar sicherste Quelle ist, sollte der Apache von dort installiert werden.

Debian, Ubuntu und Linux Mint verwenden das Tool apt-get für die Installation seiner Pakete. Das Apache-Paket heißt apache2. Die Installation erfolgt mit dem Befehl:

apt-get install apache2
Im weiteren Verlauf der Seite wird von einer Debian-Installation ausgegangen, die auch der unter einem Ubuntu-Server entspricht. Einige Linux-Versionen unterscheiden sich in Details.

Red Hat und CentOS

Red Hat und CentOS verwenden das Tool yum und das Apache-Paket heißt dort httpd, weil Apache ein HTTP-Server (oder Daemon) ist.
yum install httpd
Entsprechend heißt das Konfigurationsverzeichnis bei Red Hat und CentOS auch /etc/httpd.

SUSE und OpenSUSE

Installation unter SUSE

Umgebung und Pfade

Test und Neustart

Ob der Apache auf dem lokalen Computer läuft, lässt sich einfach durch einen dort gestarteten Browser, beispielsweise Firefox prüfen. Man gibt in die Adressleiste einfach localhost ein und es meldet sich die Standardseite, die von Apache bei der Installation hinzugefügt wird.

Bei Änderungen an der Konfiguration muss der Apache neu gestartet werden. Dazu verwendet man das Kommando:

systemctl restart apache2
Im Allgemeinen ist es auch noch möglich, die System-V-Startskripte zu verwenden.
/etc/init.d/apache2 restart

Konfigurationsdateien für Websites

Die Konfiguration eines Apachen erfolgt im Verzeichnis /etc/apache2.

Für jede Präsenz wird typischerweise eine eigene Konfigurationsdatei erstellt. und im Verzeichnis /etc/apache2/sites-available abgelegt.

Damit die Konfigurationsdatei aber wirksam wird, muss sie im Verzeichnis /etc/apache2/sites-enabled erscheinen. Anstatt die Dateien zu verschieben, wird üblicherweise ein symbolischer Link auf die jeweilige Datei des Verzeichnisses sites-available angelegt. Änderungen in einer der beiden Verzeichnisse gelten so für beide und die Konfiguration der Site läuft nicht auseinander. Ein solcher symbolischer Link wird wie folgt angelegt:

cd /etc/apache2/sites-enabled
ln -s ../sites-available/meineseite
Die Struktur der Verzeichnisse sieht folgendermaßen aus:
/etc/apache2
             sites-enabled
             sites-available
Dateien in den enabled-Verzeichnissen sind normalerweise symbolische Links auf Dateien im parallelen available-Verzeichnis.

Geltungsbereiche

Für jede Website wird sinnvollerweise eine eigene Konfigurationsdatei angelegt. Sie beginnt mit dem Schlüsselwort VirtualHost. Ihm folgen der Hostname, ein Doppelpunkt und die Portnummer.
<VirtualHost *:80>
    ... Direktiven ...
</VirtualHost>
Die Direktive DocumentRoot legt fest, wo sich die HTML-Dateien befinden. Ihr folgt also der Pfad, typischerweise liegt er unterhalb von /var/www.

Jeder Pfad kann einzeln konfiguriert werden. Dazu wird ein Bereich mit dem Schlüsselwort Directory gekennzeichnet. Es folgt der Pfad des Aufrufs. Erfolgt der Aufruf per www.firma.de/produkte, kann der Bereich der Produkte gesondert behandelt werden, indem Folgendes definiert wird:

<Directory /produkte>
    ... Direktiven ...
</Directory>

Direktiven

Module

Apache kann durch Module erweitert werden. Am bekanntesten dürfte das Interpretermodul für die Sprache PHP sein. Für dieses, wie für alle anderen Module, gibt es je eine Datei php.conf und eine Datei php.load. Die erstere konfiguriert das Modul und ist modulspezifisch, die zweite Datei gibt an, wo sich das Modul befindet und wie es geladen wird.

Auch die Module werden in zwei Verzeichnissen enabled und available abgelegt und werden analog zu sites verwaltet.

/etc/apache2

             mods-enabled
             mods-available

Private Konfiguration mit .htaccess

Wurde in der Konfiguration die Direktive AllowOverride freigeschaltet, kann im Datenverzeichnis eine Datei .htaccess abgelegt werden, die Konfigurationen auf Verzeichnisebene erlaubt. Das ist insbesondere interessant, wenn man eine Webpräsenz bei einem Provider hat, dessen Apache sich der eigenen Konfiguration entzieht.

Eine .htpasswd-Datei wird mit dem Befehl htpasswd gepflegt. Der folgende Befehl trägt einen Benutzer paul in der Datei /var/www/sicher/.htpasswd ein. Er fordert anschließend die doppelte Eingabe des Passworts auf der Konsole ein.
htpasswd -c /var/www/sicher/.htpasswd paul

HTTPS-Der verschlüsselte Zugriff

Bei der HTTP-Kommunikation über den Port 80 werden alle Daten im Klartext übertragen. Das ist insbesondere bei der Eingabe von Passwörtern nicht gut. Für einen verschlüsselten Transport wird HTTPS verwendet, das über den Port 443 kommuniziert.

HTTPS bietet gegenüber HTTP zwei wichtige Eigenschaften:

Der Server sendet dem Client, also dem Browser, bei Verbindungsaufnahme ein Zertifikat, das im Grunde ein öffentlicher Schlüssel ist. Dieser Schlüssel enthält vor allem den Domain-Namen. So kann der Client schauen, ob Zertifikat und Domain-Namen zusammenpassen. Auf der Basis dieses Zertifikats kann eine Verschlüsselung stattfinden.

Allerdings muss dem Browser das Zertifikat bzw. dessen Aussteller bekannt sein. Da nicht jeder Browser alle Zertifikate dieser Welt kennen kann, gibt es Zertifikatsstellen (CA - Certificat Authority), die Zertifikate quasi zertifizieren.

Für das eigene Netzwerk kann man die CA auch selbst erstellen. Das ist bei Intranet-Anwendungen durchaus sinnvoll, weil die meisten Browser auf Zertifikate ohne bekannte CA sehr aufgeregt reagieren, was sich leicht auf die Anwender überträgt, die mit Warnungen überhäuft werden.

Anlegen eines CA-Zertifikats

Im ersten Schritt wird ein CA-Zertifikat erstellt. Dieser wird zur Basis des eigentlichen Zertifikats. Das CA-Zertifikat muss dem Browser untergeschoben werden, damit er das Zertifikat des Servers akzeptiert.

Ein Zertifikat ist asymetrisch, besteht also aus einem privaten und einem öffentlichen Teil. Zunächst soll der private Schlüssel, der auch als Key bezeichnet wird, erstellt werden.

openssl genrsa -aes256 -out ca-key.pem 2048
Bei der Erzeugung muss eine Passphrase eingegeben werden. Auf diese Weise wird verhindert, dass allein der Besitz des Zertifikats ausreicht, um davon Zertifikate zu erzeugen.

Im nächsten Schritt wird der öffentliche Teil des CA-Zertifikats erstellt. Dieser muss den privaten Key über die Option -key aufnehmen. Der Befehl lautet:

openssl req -x509 -new -nodes -key ca-key.pem -out ca-pub.pem -sha512
Zunächst muss die Passphrase angegeben werden, die soeben bei der Erstellung des privaten Keys festgelegt wurde. Anschließend müssen folgende Parameter für das öffentliche CA-Zertifikat eingegeben werden: Die Datei ca-pub.pem wird an die Browser verteilt. Beim Firefox wird das über die drei waagerechten Striche, die neuerdings ein Menü darstellen sollen und dann über folgende Schritte eingefügt. Dann geht es weiter mit:
  1. Einstellungen|Erweitert|Zertifikate
  2. Dort wählen Sie den Button Zertifikate anzeigen.
  3. Klicken Sie auf den Reiter Zertifizierungsstellen.
  4. Dort wählen Sie den Button Importieren. In der nun erscheinenden Dateiauswahlbox können Sie die Datei auswählen.

Erzeugen eines Zertifikats aus einem CA-Zertifikat

Auch für das Zertifikat muss zunächst ein privater Key erzeugt werden.
openssl genrsa -out zertifikat-key.pem 4096
Der private Key wird als Eingabedatei für den öffentlischen Teil des Zertifikats herangezogen:
openssl req -new -key zertifikat-key.pem -out zertifikat.csr -sha512
Auch hier werden die Eingaben von oben verwendet. Dieses Mal beziehen sie sich allerdings auf das Zertifikat und nicht die Zertifizierungsstelle. Wichtig ist hier der Common Name, da dieser der URL entsprechen muss, die später aufgerufen werden soll.

Des weiteren wird der Anwender nach einem »challenge password« und einem »company name&laro;. Dies kann leer gelassen werden, wird ansonsten für den Widerruf des Zertifikats benötigt.

Aus der so entstandenen Datei zertifikat.csr kann unter Zuhilfenahme des CA-Zertifikats und natürlich der Passphrase nun der öffentlichen Teil des Zertifikats erzeugt werden. Dazu verwenden Sie den folgenden Befehl:

openssl x509 -req -in zertifikat.csr -sha512 -CA ca-pub.pem -CAkey ca-key.pem -CAcreateserial -out zertifikat-pub.pem
Damit entsteht nun die öffentliche Zertifikatsdatei. Diese muss beim Webserver hinterlegt werden.

In einigen Fällen kann die Meldung »unable to write 'random state'« erscheinen. Diese Situation entsteht, wenn die Datei .rnd im Heimatverzeichnis nicht dem Benutzer gehört. Es lässt sich leicht durch den folgenden Befehl bereinigen:
rm -r ~/.rnd
Anschließend den openssl-Befehl noch einmal aufrufen.

Bei einigen Webservern kann der öffentliche CA-Schlüssel nicht separat eingebunden werden. In diesen Fällen ist es möglich, den öffentlichen CA-Schlüssel direkt an das öffentliche Zertifikat anzuhängen. Das funktioniert mit einem einfachen Linux-Standardbefehl:

cat ca-pub.pem >> zertifikat-pub.pem

Siehe auch:

Konfigurieren des Apachen

Für den Apachen liegt nach der Installation bereits eine Default-Konfiguration für SSL unter /etc/apache2/sites-available/default-ssl.conf vor. Diese Konfiguration muss nur angepasst und aktiviert werden. Abgesehen von Kommentaren enthält sie folgende Einträge:
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    </VirtualHost>
</IfModule>
Zunächst prüft die Konfiguration, ob das Modul mod_ssl installiert ist. Das ist der Fall, wenn das Modul installiert wurde. In der Folgezeile der Konfiguration wird der Zugriff für den Port 443 zugelassen, dem Standard-Port von HTTPS. Die anderen Einträge unterscheiden sich nicht von der Standardkonfiguration, nur die mit SSL beginnenden Direktiven sind neu. Sie sollten auf die erstellten Dateien verweisen. Und lauten anschließend so:
SSLCertificateFile    /etc/apache2/ssl/zertifikat-pub.pem
SSLCertificateKeyFile /etc/apache2/ssl/zertifikat-key.pem
...
SSLCertificateChainFile: /etc/apache2/ssl/ca-pub.pem
Natürlich müssen zuvor die Dateien in die angegebenen Verzeichnisse geschoben werden.

Die so angepasste Datei liegt im Verzeichnis sites-available, muss aber noch im parallelen Verzeichnis sites-enabled auftauchen. Das macht man nach guter UNIX-Sitte mit einem symbolischen Link:

cd /etc/apache2/sites-enabled
ln -s ../sites-available/default-ssl.conf 001-ssl.conf
Das Apache-Modul für mod_ssl wird, falls noch nicht vorhanden, installiert.
apt install libapache2-mod-gnutls
Das Modul SSL wird freigeschaltet.
a2enmod ssl
Nach allen Konfigurationsänderungen muss der Apache neu gestartet werden:
systemctl restart apache2