1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Webseiten ausliefern

Apache liefert sowohl statische HTML-Seiten als auch dynamisch generierte Inhalte via HTTP aus. Unverschlüsselte Verbindungen werden automatisch auf den mit TLS abgesicherten Port umgeleitet und per HSTS darauf festgenagelt. Browser können Zertifkate via DANE verifizieren.

Pakete installieren

Wir installieren den Apache Webserver und Module für die Authentifizierung und das Ausführen von Webanwendungen.

apt install apache2 libapache2-mod-{auth-{kerb,gssapi},fastcgi,fcgid}

Bei der Fehlersuche hilft oft ein Blick in die Protokolle.

tail -f /var/log/apache2/{access,error}.log

Apache konfigurieren

Debian verteilt die Konfiguration auf mehrere Dateien und Verzeichnisse.

/etc/apache2/apache2.conf
Systemeinstellungen des Daemons (PID-Datei, Benutzer, Prozess-/Thread-Limits)
/etc/apache2/ports.conf
Netzwerkeinstellungen, Portnummern und Adressen
/etc/apache2/conf-enabled/conf-available/
Einstellungen für andere Debian-Pakete
/etc/apache2/mods-enabled/mods-available/
Zusätzliche Module
/etc/apache2/sites-enabled/sites-available/
Virtuelle Hosts

Unverschlüsselte Zugriffe leiten wir sofort um.

/etc/apache2/sites-available/illusioni.de.conf
<VirtualHost *:80> RewriteEngine on RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </VirtualHost>

Der HSTS-Header veranlasst den Browser, immer gleich eine verschlüsselte Verbindung aufzubauen.

<VirtualHost *:443>
	ServerName              illusioni.de
	ServerAlias             *.illusioni.de
	ServerAdmin             webmaster@illusioni.de
	ErrorLog                /var/log/apache2/error.log
	CustomLog               /var/log/apache2/access.log combined
	Header                  always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
	SSLCertificateFile      /etc/letsencrypt/live/illusioni.de/fullchain.pem
	SSLCertificateKeyFile   /etc/letsencrypt/live/illusioni.de/privkey.pem
	Include                 /etc/letsencrypt/options-ssl-apache.conf
	Include                 /etc/powerdns/apache.conf
	Include                 /etc/sogo/apache.conf

Statische Seiten ausliefern

	UserDir                 public_html
	DocumentRoot            /srv/www
	<Location />
		Require             all granted
	</Location>

Dynamische Seiten generieren

Das CGI definiert einen Standard zur Übergabe von Parametern aus HTTP-Kopfzeilen an Programme mittels Umgebungsvariablen. Mit dem Modul cgi lassen sich dynamische Seiten erzeugen.

	ScriptAlias /Path /…/Program
	<Location   /Path>
		Require          all granted
	</Location>

Gute Webanwendungen verarbeiten oft komplette Unterbäume einer URL. Zu diesem Zweck werden die Module fcgid und rewrite aktiviert.

	Alias     /Path /…/Program
	<Location /Path>
		Require          all granted
		Options          +ExecCGI
		SetHandler       fcgid-script
		RewriteEngine    on
		RewriteLogLevel  1
		RewriteLog       /var/log/apache2/rewrite.log
		RewriteBase      "/Path/"
		RewriteRule      ^(.*)$ /…/Program [QSA,L]
	</Location>

Eigenständige FastCGI-Anwendungen laufen als Daemon und werden mit Hilfe des Moduls proxy_fcgi eingebunden.

	ProxyPass /Path fcgi:/localhost:Port

Webanwendungen durchschleifen

Einige Dienste verfügen über einen eingebauten HTTP-Server, die man gerne unter einen hübschen Adresse anbieten möchte.

	ProxyPass        /pdns      http://localhost:8053
	ProxyPass        /rspamd    http://localhost:11334
	ProxyPass        /gitea     http://localhost:3000

Benutzer authentifizieren

Zugriff auf vertrauliche Informationen sollte autorisierten Benutzern vorbehalten sein. Im einfachstern Fall verweist die Konfiguration auf eine separate Benutzer-Datenbank.

	<Location Dir>
		Require                  valid-user
		AuthName                 "Private site"
		AuthType                 Basic
		AuthUserFile             /etc/apache2/passwd
	</Location>

Die Passwörter verwalten wir dann in einer separaten Datenbank.

htpasswd -c /etc/apache2/passwd User

Das Modul authnz_ldap erlaubt eine feine Rechtevergabe durch frei konfigurierbare LDAP-Anfragen. Die Konfiguration kann zum Beispiel fordern, dass der Benutzer Mitglied einer bestimmten Gruppe ist.

	<Location Dir>
		Require                  ldap-group uid=Group,ou=users,dc=illusioni,dc=de
		AuthLDAPURL              "ldap://localhost/dc=illusioni,dc=de?uid?sub?(objectClass=posixAccount)"
		AuthLDAPBindDN           "cn=apache,ou=daemons,dc=illusioni,dc=de"
		AuthLDAPBindPassword     "Password"
	</Location>

Das Modul auth_kerb ermöglicht Single Sign-On mit Kerberos – wenn der Browser dies unterstützt. (Firefox vertraut nur Kerberos-Domänen, die man in about:config unter network.negotiate-auth.trusted-uris einträgt.)

	<Location Dir>
		Require                  valid-user
		AuthName                 "Private site"
		AuthType                 Kerberos
		KrbAuthRealm             ILLUSIONI.DE
		KrbMethodNegotiate       on
		KrbMethodK5Passwd        on
		KrbServiceName           http/durmstrang.illusioni.de
		Krb5Keytab               /etc/krb5/apache.keytab
	</Location>
</VirtualHost>

Daemon neu starten

Wir aktivieren die konfigurierten Webseiten und diverse Module. Vor einem Neustart testen wir immer auf eine korrekte Konfiguration.

a2ensite illusioni.de
a2enmod userdir headers rewrite cgi fcgid proxy proxy_fcgi proxy_http authnz_ldap auth_kerb
apachectl configtest
Syntax OK
systemctl restart apache2

Literatur