Elektronik

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:


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




Impressum und Erklärung zum Datenschutz