Installation eines Apache 2.4 Webservers
Der Webserver sollte nach Installation des Debian Systems schon vorhanden sein und laufen. Das kann man testen,
indem ein Webbrowser geöffnet wird und die IP-Adresse oder einfach localhost als URL eingegeben wird.
Standardmäßig sucht apache eine index.html Seite. Ebenso standardmäßig richtet apache nach der Installation auch schon eine Testseite gleichen Namens ein, die dann angezeigt wird.
Sowas wie das hier:

Wo liegt Apache?
Konfigurationsverzeichnis: /etc/apache2/
Hauptkonfigurationsdatei: /etc/apache2/apache2.conf
Web-Inhaltsverzeichnis (DocumentRoot): /var/www/html/
Logfiles: /var/log/apache2/
Ausführbare Datei (Binary): /usr/sbin/apache2
Wichtige Unterverzeichnisse unter /etc/apache2/:
sites-available/: Konfigurationsdateien für virtuelle Hosts (vHosts), die verfügbar sind.
sites-enabled/: Symlinks auf Dateien in sites-available/, die aktuell aktiv sind.
mods-available/ und mods-enabled/: Verwaltung von Apache-Modulen.
conf-available/ und conf-enabled/: Zusätzliche Konfigurationsdateien
Externes Laufwerk einhängen?
Es kann praktisch erscheinen, ein externes Laufwerk einzuhängen, auf dem ein Teil oder der ganze Webinhalt gespeichert sind. Dann kann man ggf. später einfach umziehen oder nur temporär Inhalte anstöpseln oder wenn man der billigen internen SSD nicht vertraut, oder, oder... Die Fritzbox bietet ja sowas ähnliches auch an.
Die Nachteile sollen aber auch gleich benannt werden:
- USB-Sticks und SD-karten sind auch nicht für den Dauergebrauch gedacht.
- Also dann doch externe Festplatte. Dann bitte USB3 wegen der Geschwindigkeit; ist aber dennoch recht langsam im Vergleich zu interner SATA Platte o.ä.
- Es baumelt immer was am Server (und braucht ggf. auch nochmal eine eigene Spannungsversorgung?)
- Datensicherung? Die sollte man sowieso machen. Ein USB-Anschluss ist also schonmal belegt und man muss zum Sichern einen weiteren USP-Anschluss zur Verfügung haben (oder sichert übers Netz). Wenn man der internen Platte oder SSD nicht traut, muss man sowieso alle Nase lang Daten sichern. Dann kann man in der zwischenzeit bis die SDD kaputt geht diese doch trotzdem nutzen; und zwar schnell und mit weniger Konfigurationsaufwand.
Wenn es also unbeding sein soll, dann die apache2.conf wie folgt ergänzen:
Alias "/var/www/html/Mein_externes_Verzeichnis" "media/usb/STICKNAME"
Das hängt den Stick mit der Datenträgerbezeichnung(!) STICKNAME in das Webverzeichnis (/var/www/html) als Verzeichnis Mein_externes_Verzeichnis ein. Mit http://Meine_domain/Mein_externes_Verzeichnis/index.html greift man dann de facto auf index.html auf dem hauptverzeichnis des USB-Sticks zu.
<Directory /var/www/html/geschuetztes-verzeichnis>
AuthType Basic
AuthName "Geschützter Bereich"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
PHP nachinstallieren
Da PHP noch nicht installiert ist, muss es nachinstalliert werden:
sudo apt update sudo
apt install libapache2-mod-php
sudo systemctl restart apache2
Bei mir lief php aber auch ohne Neustart von Apache sofort nach der Installation der PHP Pakete an.
Austesten:
Eine info.php Datei im Web-Verzeichnis erstellen (touch info.php) mit <?php phpinfo(); ?> .
Dateirechte am besten mit mc mit chmod einstellen auf 644 und diese Datei im Browser über localhost/info.php aufrufen.
Es sollte nun eine php Info seite im Browser erscheinen.
Sowas wie das hier:

Zugriffsbeschränkungen einstellen
Der Zugriff auf Webseiten oder Verzeichnisse kann beschränkt werden auf Basis der IP-Adresse, des hostnamens (oder Teilen davon), der geografischen Herkunft, anderer Umgebungsvariablen wie Uhrzeit..., des user agents (aka des Browsers); oder eben auch aufgrund eines Benutzernamens und Passwortes, die einzugeben sind.
Der Zugriff kann basierend auf obigen Kriterien erteilt oder auch explizit entzogen werden. Mehr dazu in der Apache-Dokumentation.
Die Zugriffssteuerung erfolgt entweder in der apache2.conf Datei (frühere Apache Versionen verwendeten httpd.conf) oder im jeweiligen zu schützenden Verzeichnis über eine .htpasswd und eine .htaccess Datei. Während früher gerne jedes einzelne Verzeichnis geschützt wurde, wird heute empfohlen die konfiguration direkt in der apache2.conf durchzuführen. Neben Sicherheitsaspekten gibt dies auch Performance-Vorteile. Siehe hierzu .htaccess in der Apache Dokumentation.
Zugriffsbeschränkungen ermöglichen
Hierzu muss die Basic Authentication (mod_auth_basic) aktiviert werden:
sudo a2enmod auth_basic welches für die Basic Authentication verantwortlich ist und
sudo a2enmod authn_file, welches die Benutzer aus einer Datei verwaltet.
Danach muss apache mit sudo systemctl restart apache neu gestartet werden.
Nun muss eine oder mehrere Passwortdateien erstellt werden; je nachdem, wie und wo man seine Verzeichnisse absichern und wo die Zugangsdaten liegen sollen. Wenn z.B. im Verzeichnis /etc/apache2 eine passwortdatei namens .htpasswd erzeugt werden soll, dann
sudo htpasswd -c /etc/apache2/.htpasswd benutzername, wobei benutzername durch den gewünschten Namen zu ersetzen ist. Anschließend wird man aufgefordert, ein zugehöriges Passwort festzulegen.
Das Flag -c wird nur beim erstmaligen Anlegen (create) der Datei benötigt. Weitere Benutzer werden
dann entsprechend ohne -cwie folgt angelegt:
sudo htpasswd /etc/apache2/.htpasswd weiterer_benutzer
Danach muss die Apache Konfiguration angepasst werden; entweder die .htaccess Datei im jeweiligen Verzeichnis
oder die virtual host Datei (unter /etc/apache2/sites-available/meine_seite.conf) oder
die apache2.conf.
in der apache2.conf oder meine_seite.conf sieht das dann so aus:
<Directory /var/www/html/geschuetztes-verzeichnis>
AuthType Basic
AuthName "Geschützter Bereich"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
in einer .htaccess Datei, die im geschützten Verzeichnis liegt, sollte dann sowas stehen:
AuthType Basic
AuthName "Geschützter Bereich"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Dazu muss sichergestellt werden (in der apache2.conf oder /etc/apache2/sites-available/meine_seite.conf), dass .htaccess auch wirklich aktiviert ist:
<Directory /var/www/html>
AllowOverride All
</Directory>
Danach apache neu starten: sudo systemctl restart apache2
Sicherheitshinweis (s. auch weiter unten)
Basic Authentication sendet Anmeldedaten Base64-codiert, die leicht dekodiert werden können. Daher am besten immer https verwenden, um die Daten zu verschlüsseln. Die Passwort-Datei sollte außerhalb des öffentlichen Webverzeichnisses liegen und nur von Apache lesbar sein:
sudo chmod 640 /etc/apache2/.htpasswd linitiert die Benutzerrechte entsprechend (Nur Benutzer darf lesen und schreiben; alle anderen nur ausführen).
sudo chown www-data:www-data /etc/apache2/.htpasswd legt den jetzigen Benutzer (root, da mit sudo ausgeführt) als owner fest.
CGI oder SSI aktivieren
Das geht über Options in der apache2.conf oder .htaccess Datei. Siehe hierzu ebenfalls .htaccess oder zu SSI in der Apache Dokumentation.
Perl und/oder Python?
Das kommt noch...
Ans Netz gehen
Nun muss der Webserver noch von außen erreichbar sein. Eine Voraussetzung dafür ist, dass der Router von außen entweder immer mit der gleichen vom ISP (Internet Service Provider; z.; Telekom, Vodafone...) vergebenen IP angesprochen werden kann, oder dass DynDNS eingerichtet ist. (Separates Kapitel)
Anschließned muss der Router die ports für http (80) bzw. https (443) durchlassen. Dazu müssen im Router Freigaben eingerichtet werden. Bei der Fritzbox z.B. unterInternet Freigaben
SSL aktivieren
Nachschauen, ob SSL instelliert ist: a2query -m ssl oder apache2ctl -M | grep ssl
Dann sollte sowas kommen: ssl_module (shared).
Falls das Modul nicht aktivist, dann
sudo a2enmod ssl und anschließend apache neu starten:
sudo systemctl restart apache2
Apache absichern
Konfigurationsdatei auf Syntaxfehler testen
sudo apache2ctl configtest
Http1.0 ausschalten
Gegen session hijacking und man in the middle attacks:
Apache Module rewrite aktivieren
sudo a2enmod rewrite
apache2.conf anpassen:
sudo nano /etc/apache2/apache2.conf oder mit mc editieren.
Dazu folgende Direktive einfügen:
RewriteEngine On
RewriteCond %{THE_REQUEST} !HTTP/1.1$
RewriteRule .* - [F]
Antwortheader minimieren
Den Antwortheader minimieren, um möglichst wenig Versionsinformation zurückzugeben. Dazu das Module mod-headers aktivieren:
sudo a2enmod headers
Folgende Änderungen in der security.conf (liegt unter /etc/apache2/conf-available/security.conf) vornehmen:
ServerTokens OS ändern zu ServerTokens Prod und
ServerSignature On ändern zu ServerSignature Off
Strict Transport Security (HSTS):
Hierdurch werden alle http Anfragen auf https Verbindungen umgeleitet. mod_headers.so muss aktiviert sein; und dann die apache2.conf entsprechend ändern:
Im Abschnitt <Directory /> folgendes hinzufügen:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
weiteres unter dieser Webseite
Cross site tracking unterbinden
In der security.conf:
TraceEnable Off
Cookie Sicherheit und Secure Flag
Das Modul mod_headers.so muss aktiviert sein:
sudo a2enmod headers
Dann apache2.conf entsprechend verändern im Abschnitt <Directory />:
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Anzahl der Verbindungen reduzieren
z.B. von 100 runter auf 15. Hierzu in der apache2.conf:
MaxKeepAliveRequests 100 ändern zu MaxKeepAliveRequests 15