19.04.2023

Apache Webserver

Apache Webserver
Samba Server
eMail-Server
Kerberos einrichten
OpenSSH Server / Client
DSL Konfiguration unter Linux
NTP Server / Client
DNS Server
Subversion
iSCSI
LDAP-Server
Radius-Server
OpenSSL-Server einrichten
NNTP Server (NEWS-Server) INN und Leafnode
DHCP-Server einrichten
SNMP Service einrichten
Stunnel einrichten
MySQL-Server einrichten
Datensicherung auf Bandlaufwerk
Audio CDs in WAV umwandeln
CDs und DVD erstellen
Grafiken bearbeiten erstellen
FAX Versand und Empfang
Web und FTP Sites syncronisieren
Verschlüsselung von E-Mails und Dokumenten
Programm Übersicht
Datenrettung
Linux Terminalserver
PXE Boot
sonstige Programme

Navigation:

Links:
Download: Apache Server Anleitung
Dokumentation zum Apache HTTP Server Version 2.4
Dokumentation zum Apache HTTP Server Version 2.2
Liste der Error Codes

SSL TestPages:
SSLLabs - SSL Server Test

Seitenanfang

Kommandozeile

die Programmdatei für den Server heist unter Debian apache2, wenn man es aus den Quellen übersetzt ist es httpd und in anderen Distributionen kann der Server auch noch anders benannt sein.

Befehl Erklärung
apache2 -v zeigt Versionsangaben an
apache2 -V gibt Informationen, über die Parameter die beim Kompilieren genutzt wurden
apache2 -l im Server statisch integrierte Module (wie apache2ctl -l)
apache2 -L zeigt alle Optionen die Apache mit den derzeit eingebundenen Modulen versteht, wenn die passenden Optionen nicht dabei sind, muss man erst das Modul dafür laden. (wie apache2ctl -L)
apache2ctl -t -D DUMP_VHOSTS zeigt konfigurierte virtuelle Server an.
apache2ctl -t -D DUMP_MODULES zeigt geladene Module an
apache2ctl -t Syntaxprüfung der Konfigurationsdateien (wie apache2ctl configtest)
apache2ctl -S VirtualHost und Laufzeit Parameter anzeigen
apache2ctl start Apache Web Server starten
apache2ctl stop Apache Web Server stoppen
apache2ctl status Apache Web Server Status anzeigen
apache2ctl graceful macht einen Neustart des Servers, ähnlich der Option restart. Im Gegensatz zu restart werden bestehende Verbindungen nicht getrennt
apache2ctl -h Liste weiter möglichen Optionen
service apache2 start (Upstart) Apache2 Server starten
service apache2 stop (Upstart) Apache2 Server stoppen
service apache2 restart (Upstart) Apache2 Server neu starten/geänderte Konfiguration neu laden
systemctl start apache2.service (Systemd) Apache2 Server starten
systemctl stop apache2.service (Systemd) Apache2 Server stoppen
systemctl restart apache2.service (Systemd) Apache2 Server neustarten
systemctl status apache2.service (Systemd) Apache2 Server Status anzeigen
journalctl -f -u apache2 Log permanent überwachen und nach Meldungen von Apache2 filtern
a2enmod include Modul einbinden (im Beispiel das SSI Modul), danach den Server neu starten
a2dismod autoindex Modul deaktivieren, danach den Server neu starten
a2ensite <Site> Site aktivieren, danach den Server neu starten
a2dissite <Site> Site deaktivieren, danach den Server neu starten
   
Seitenanfang

Apache HTTP Server

Apache2 ist Modular aufgebaut um die Fähigkeiten des Betriebssystems besser nutzen zu können. Multi-Processing Modules (MPM) Versionen

Prefork
Laufzeitverhalten des Apache 1.3, der Hauptprozess startet eine in der Konfigurationsdatei festgelegte Anzahl Kindprozesse die wiederum je Kindprozess einen einzigen Thread haben.

Perchild
ähnlich dem mpm_worker, ein Hauptprozess startet eine festgelegte Anzahl Kindprozesse, mit wiederum einer flexible Anzahl an Threads. Im Gegensatz zu mpm_worker können einzelne Kindprozesse unter verschiedenen Benutzernamen und Gruppenkennungen laufen

Worker
ein Hauptprozess startet eine Vielzahl von Kindprozessen die wiederum eine definierte Anzahl an Threads starten.

Verzeichnisse / Dateien Beschreibung
/etc/apache2 Konfigurationsverzeichnis
/etc/apache2/conf.d für Erweiterungen der StandardKonfiguration
/etc/apache2/mods-available verfügbare Module
/etc/apache2/mods-enabled eingebundene Module
/etc/apache2/sites-available verfügbare Sites
/etc/apache2/sites-enabled eingebundene Sites
/etc/apache2/ssl SSL Verschlüsselung
/var/lock/apache2 Sperrdateien z.B. für WebDav die DAVLock
   
Basis-Modul Beschreibung
mod_access, mod_auth Rechner und Benutzerbasierte Zugriffskontrolle, allow-deny .htaccess Mechanismus
mod_actions, mod_cgi / mod_cgid Scripte als Handler oder CGI-Anwendung ausführen, mod_cgid wird automatisch bei MPM ausgewählt
mod_alias, mod_dir, mod_userdir URL-Abbildung und Verzeichnishandling, Ein- Ausblenden bestimmter Verzeichnise in das Document_Root
mod_asis Dateien mit eigenen Header senden
mod_autoindex automatische Indexerstellung für Verzeichnisse
mod_env, mod_setenvif Beeinflussung von Umgebungsvariablen
mod_imap serverseitige Image-Maps
mod_include Server Site Includes (SSI)
mod_log_config Protokollierung
mod_mime, mod_negotiation Auswahl und Zuordnung von MIME Type, Sprache und Kodierung
mod_status Serverüberwachung
http Unterstützung für das HTTP Protokoll
weiter Module
mod_setenvif  
mod_php5 PHP Sprache
mod_negotiation für den Mehrsprachigen Betrieb einer Seite, wir auch für die Apache Standardseite benötigt
vhost_alias VirtualHost, NameVirtualHost
proxy Grundlage für die Proxy-Funktionen
proxy_http HTTP Proxy-Funktionen
proxy_ftp FTP Proxy-Funktionen
proxy_connect HTTPS Proxy Tunnel
deflate GZip Komprimierung aktivieren
http2 HTTP/2 Protokoll aktivieren

Apache Module

Server:/ # rpm -qa | grep apache
apache2-mod_php4-4.3.10-14.4
apache2-mod_perl-2.0.0-4
apache2-2.0.53-9
apache2-mod_python-3.1.3-42
apache2-example-pages-2.0.53-9
apache2-doc-2.0.53-9
apache2-prefork-2.0.53-9

 

PHP Module
php5-exif-5.0.3-14.4
php5-imap-5.0.3-14
apache2-mod_php5-5.0.3-14.4
php5-5.0.3-14.4
php5-ctype-5.0.3-14
php-doc-5.0.3-3
php5-bz2-5.0.3-14
php5-zlib-5.0.3-14
php5-gettext-5.0.3-14
php5-mysql-5.0.3-14
php5-iconv-5.0.3-14
php5-mcrypt-5.0.3-14
php5-mbstring-5.0.3-14

Die wichtigsten Apache Module mod_access.so, mod_alias.so, mod_auth.so, mod_dir.so, mod_log_config.so, mod_mime.so, mod_setenvif.so, libphp5.so

Konfiguration unter Debian im Verz. /etc/apache2/apache2.conf, http.conf und weitere.

HTTP2 im Apache aktivieren

a2enmod http2
apachectl restart
<VirtualHost *:443>
	...
        Protocols               h2 http/1.1
	...
</VirtualHost>
Seitenanfang

Allgemeine Anleitung

- Benutzer und Gruppe unter der der Server läuft, es darf niemals "root" sein, mit wenigen Rechten und ohne Login-Shell

groupadd www-data
useradd -g www-data -d /dev/null -s /bin/false www-data

- Login-Shell ändern, wenn der Apache mithilfe eines Paketes installiert wurde.

chsh -s /bin/false www-data

Apache Grundkonfiguration

# FQDN des Servers möglich sind, der angegebene Port wird
# durch den Parameter Listen überschrieben.
# host.domain.tld | host.domain.tld:Port | IP | IP:Port
ServerName host.domain.tld

# E-Mailadresse des Administrators
# wird bei Fehlermeldungen gezeigt
ServerAdmin admin@domain.tld

# Einstellungen über den Umfang der Informationen
# die der Server ausgibt.
# Minimal | ProductOnly | OS | Full
ServerTokens ProductOnly

# Art und Weise wie der Server seinen Namen
# bestimmt
# ON | OFF | DNS
UseCanonicalName Off

# persistente Verbindung aktiv | deaktiv
# ON | OFF
KeepAlive On

# Wartezeit bis zur nächsten Verbindung
# in Sekunden
KeepAliveTimeout 15

# Ports und IP die an den Server gebunden werden
# auch IPv6 möglich
# IP:Port | Port | [IPv6]:Port | [IPv6]
Listen 80

# Benutzername und Gruppe mit den der
# Apache läuft
User www-data
Group www-data

# Einstellung für den VirtualHost
#
NameVirtualHost *
<VirtualHost *>
 ServerName www.domain.tld
 ServerAlias *.domain.tld
 ServerAdmin admin@domain.tld
 DocumentRoot /www/domain.tld
 CustomLog /log/domain.log combined
 ErrorLog /log/domain.err
 LogLevel notice
</VirtualHost>

# Sicherheitseinstellung
# Zugriff auf RootEbene verhindern
<Directory />
 Options None
 AllowOverride None
 Order deny,allow
 Deny from all
</Directory>

 

Ressourcenbeschränkung
Container-Direktiven Directory, Location, Files für die Zugriffskontrolle.

Directory ein Verzeichnis im Dateisystem des Webservers.
Location eine URL (ist relativ zu DocumentRoot "Location / = DocumentRoot").
Files Name einer Datei, die in verschiedenen Verzeichnissen liegen können.

# Alle User vom Server aussperren
<Directory />
	Options none
	AllowOverride none
	Order deny,allow
	Deny from all
</Directory>
# Zugriff auf ein Verzeichnis erlauben, für localhost, ein Netzwerk und die Domain die auf ".local" endet.
<Directory /srv/www>
	Deny from all
	# Allow from .domain.tld
	Allow from 192.168.2.0/24 .local
	Allow from 127.0.0.1
</Directory>
Bei der Angabe von Optionen, kann man mit vorangestellten Minus (-), Plus (+) oder ohne vorangestellten Zeichen arbeiten
#fügt "Indexes" zu den aktuellen Optionen hinzu
Options +Indexes
#entfernt "Indexes" zu den aktuellen Optionen hinzu
Options -Indexes
#macht "Indexes" zur einzig aktuellen Option (deaktiviert alle anderen)
Options Indexes

- mögliche Optionen für Apache Ressourcen

All Alle Optionen außer MultiViews. Dies ist die Voreinstellung.
ExecCGI Die Ausführung von CGI-Skripten, welche mod_cgi verwenden, ist erlaubt
FollowSymLinks Der Server folgt symbolischen Links in diesem Verzeichnis.
SymLinksIfOwnerMatch Der Server folgt nur symbolischen Links, bei denen die Zieldatei bzw. das Zielverzeichnis der gleichen Benutzerkennung gehört, wie der Link.
Includes Server Side Includes, die von mod_include bereitgestellt werden, sind erlaubt, auch #exec cgi. Vorsicht !!!
IncludesNoExec SSI erlaubt, #exec cmd und #exec cgi sind jedoch deaktiviert. Es ist aber noch möglich, CGI-Skripte aus ScriptAlias-Verzeichnissen mittels #include virtual einzubinden.
Indexes Wenn eine URL, die auf ein Verzeichnis zeigt, in dem sich keine durch "DirectoryIndex" definierte Indexdatei (z.B. index.html) befindet, dann liefert mod_autoindex eine formatierte Auflistung des Verzeichnisses zurück. sollte vermieden werden !!!
MultiViews "MultiViews" sind bei der Verwendung von mod_negotiation erlaubt. z.B. mehrere Sprachen.


Nutzerverzeichnis
- wenn keine Nutzerverzeichnisse bereitgestellt werden müssen, sollten sie ganz deaktiviert werden
UserDir disable

- Nutzerverzeichnis für einige Nutzer zulassen.
UserDir disable
UserDir enable username1, username2

- wenn alle Nutzer zugelassen sind, sollte "root" und andere Systemuser deaktiviert werden
UserDir enable
UserDir disable root

Seitenanfang

SSI

Für ein paar Dateien Includes zulassen

<Location /ssi_dir>
Options IncludesNoExec
</Location>
- wenn man HTML-Dateien von SSI-Dateien unterscheiden möchte, kann man dies durch einen speziellen Suffix .shtml oder stm erreichen und mit dem MIME-Typ für zu parsenden Inhalt verknüpfen
AddType application/x-server-parsed .shtml .stm

oder den Apache - Handler direkt zuweisen
AddHandler server-parsed .shtml .stm

- wenn SSI in den HTML-Dateien enthalten ist, muss man die Dateien auch Parsen lassen
AddHandler server-parsed .html .htm .shtml .stm

- Apache anweisen nach einem gesetzten Execute-Bit einer Datei zu suchen und nur diese dann zu parsen, so kann man statische und zu parsende HTML-Dateien in einem Verzeichnis mit identischem Suffix aufbewahren.
 <Location /ssi_dir>
	Options +IncludesNoExec
	XBitHack full
 </Location>
Seitenanfang

WebDav

- Webdav Module einbinden und Apache Server neu starten

a2enmod dav dav_fs
service apache2 restart

- Beispiel vhost Datei, Location definiert ein Virtuelles Verzeichnis auf dem Server, das für den InternetBrowser existiert, gegenüber Directory ein physikalisches Verzeichnis angibt.

#
#	WebDAV
#
Alias	/webdav			/var/www/
<Location "/webdav/">
	Dav			On
	AuthType		Basic
	AuthName "WebDAV Zugang"
	AuthUserFile /etc/apache2/dav.htpasswd
	<LimitExcept GET OPTIONS>
		Require valid-user
	</LimitExcept>
	Allow from dav.domain.tld
#	Options None
	Options +IncludesNoExec
</Location>

<VirtualHost *:80>
	ServerName		dav.domain.tld
#	ServerAlias		webdav.domain.tld
	DocumentRoot		/var/www
	CustomLog		/var/log/apache2/webdav.log vhost_combined
	ErrorLog		/var/log/apache2/webdav.err.log
	LogLevel		info
</VirtualHost>

<VirtualHost *:443>
	ServerName		dav.domain.tld
	DocumentRoot		/var/www
	SSLEngine		on
	SSLCertificateFile	/etc/apache2/ssl/dav.domain.tld.crt.pem
	SSLCertificateKeyFile	/etc/apache2/ssl/dav.domain.tld.key
	SSLCACertificateFile	/etc/apache2/ssl/ca.crt.pem
</VirtualHost>

- Anlegen der User-Passwort Datei für den Zugriff

htpasswd2 -c /etc/apache2/dav.htpasswd user1

die Datei /etc/apache2/dev.htpasswd wird angelegt und Benutzer "user1" wird eingetragen, weitere User anlegen mit:

htpasswd2 /etc/apache2/dav.htpasswd user2"

Zugriff auf WebDAV

- Gnome3

davs://dav.domain.tld/webdav

- KDE Zugriff über HTTP oder HTTPS

webdav://dav.domain.tld/webdav
webdavs://dav.domain.tld/webdav

- per Kommandozeile

cadaver
open http://localhost/
pwd
ls
cat <filename>
get <filename>
lock <filename>
...
put <filename>
unlock <filename>
quit

- Windows
Netzwerkumgebung | Netzlaufwerk verbinden | Verbindung mit einer Website herstellen...

http://dav.domain.tld/webdav

Registry Änderungen für den Zugriff unter Windows (WinXP Server 2003) MS-Artikel

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters]
"UseBasicAuth"=dword:00000001

Registry Änderungen für den Zugriff unter Windows 7

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters]
"BasicAuthLevel"=dword:00000002

Fehlermeldungen

[error] [client xxx] The locks could not be queried for verification against a possible "If:" header.  [500, #0]
[error] [client xxx] Could not open the lock database.  [500, #400]
[error] [client xxx] (21)Is a directory: Could not open property database.  [500, #1]

Die LockDatenbank-Datei DAVLock wird unter Debian/ubuntu im Ordner /var/lock/apache2/ durch den ApacheServer automatisch angelegt. Dies ist in der dav_fs.conf definiert.

# /etc/apache2/mods-enabled/dav_fs.conf
DAVLockDB ${APACHE_LOCK_DIR}/DAVLock

Der WebDavServer muss Zugriff auf die Passwortdatei habe, sonst kann diese zur Authentifizierung nicht herangezogen werden und die Nutzer können nicht zugreifen.

chown root:www-data /etc/apache2/.htpasswd
chmod 640 /etc/apache2/.htpasswd

 

 

Seitenanfang

Steuerung über .htaccess Datei

Ein Verzeichnis auf dem Web Server anlegen, das geschützt werden soll und in diesem die Datei .htaccess erstellen. Nach möglichkeit die Passwort Datei nicht im Webspace liegen lassen, da diese sonst heruntergeladen werden kann.

- Passwortabfrage mit .htaccess

AuthType Basic
AuthName "Webalizer Zugang"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

Erstellt die Passwortdatei /etc/apache2/.htpasswd Datei, für den Benutzer "user" mit verschlüsseltem Passwort, weitere Benutzer kann man ohne die Option -c hinzufügen.

htpasswd -c /etc/apache2/.htpasswd user

- über die .htaccess PHP5 aktivieren, die Datei dann im Verzeichnis des Webservers ablegen.

AddType x-mapp-php5 .php
AddHandler x-mapp-php5 .php

In der default-server.conf von Suse den Parameter AuthConfig setzen, da sonst die .htaccess nicht beachtet wird.

# default-server.conf
...
# AllowOverride None
AllowOverride AuthConfig
...

SSI für .html Seiten mit Hilfe der .htaccess aktivieren, dazu muss die .htaccess Datei in der Wurzel (Root) des Webservers erstellt werden.

AddHandler server-parsed .html
Seitenanfang

Apache mit SSL

Zertifikat mit OpenSSL erstellen
Mozilla SSL Configuration Generator

- CA Certifikat erstellen

mkdir /etc/apache2/ssl
chmod 700 /etc/apache2/ssl
openssl req -new -newkey rsa:2048 -days 7300 -x509 -nodes -sha1 -subj "/CN=MyCA" -keyout ca.key -out ca.crt.pem

Zertifikate erstellen

- für mehrere Domains

openssl req -new -newkey rsa:2048 -nodes -subj "/CN=www.domain1.tld" -keyout domain1.key | openssl x509 \
 -req -days 3650 -CA ca.crt.pem -CAkey ca.key -CAcreateserial -sha1 -out domain1.crt.pem
openssl req -new -newkey rsa:2048 -nodes -subj "/CN=www.domain2.tld" -keyout domain2.key | openssl x509 \
 -req -days 3650 -CA ca.crt.pem -CAkey ca.key -sha1 -out domain2.crt.pem

- Wildcard Zertifikat

openssl req -new -newkey rsa:2048 -nodes -subj "/CN=*.domain.tld" -keyout wildcard.domain.tld.key | openssl x509 \
 -req -CA ca.crt.pem -CAkey ca.key -CAcreateserial -sha1 -out wildcard.domain.tld.crt.pem

- MultiDomain Zertifikat

Datei multidomain.cnf erstellen, der CN Name der im Zertifikat als erstes angegeben wird (-subj "/CN=www.domain.tld"), muss auch in der multidomain.cnf mit angegeben werden.

# multidomain.cnf
subjectAltName=DNS:www.domain.tld,DNS:ftp.domain.tld,DNS:webdav.domain.tld,DNS:mail.domain1.tld
openssl req -new -newkey rsa:2048 -nodes -subj "/CN=www.domain.tld" -keyout multidomain.tld.key | openssl x509 \
-req -days 3650 -CA ca.crt.pem -CAkey ca.key -CAcreateserial -sha1 -extfile multidomain.cnf \
-out multidomain.tld.crt.pem

2. Variante MultiDomain Zertifikat, alle Domains sind als Common Name angegeben

openssl req -new -newkey rsa:2048 -nodes -subj "/CN=www.domain.tld""/CN=ftp.domain.tld""/CN=mail.domain1.zzz" \
"/CN=host.domain2.zzz" -keyout multidomain.key | openssl x509 -req -days 3650 -CA ca.crt.pem -CAkey ca.key \
-CAcreateserial -sha1 -out multidomain.crt.pem

- Konfiguration anpassen

# /etc/apache2/sites-enabled/vhost
...
SSLEngine on
# Signiertes Server Zertifikat
SSLCertificateFile     /etc/apache2/ssl/domain1.crt.pem
# Privater Server Schlüssel
SSLCertificateKeyFile  /etc/apache2/ssl/domain1.key
# CA Zertifikat
SSLCACertificateFile   /etc/apache2/ssl/ca.crt.pem
...

- Module VirtualHost und SSL aktivieren und Apache Server neu starten

a2enmod vhost_alias ssl
service apache2 restart

- Apache mit SSL prüfen

apache2ctl -S

VirtualHost Konfiguration

<VirtualHost *:80>
	ServerName		www.domain1.tld
	DocumentRoot		/var/www/domain1
	ServerAlias		domain3.tld domain4.tld
	CustomLog		/var/log/apache2/vhost.log combined
	ErrorLog		/var/log/apache2/vhost.err.log
	LogLevel		notice
</VirtualHost>

<VirtualHost *:443>
	ServerName		www.domain1.tld
	DocumentRoot		/var/www/domain1
	SSLEngine		on
	SSLCertificateFile	/etc/apache2/ssl/domain1.crt.pem
	SSLCertificateKeyFile	/etc/apache2/ssl/domain1.key
	SSLCACertificateFile	/etc/apache2/ssl/ca.crt.pem
</VirtualHost>

<VirtualHost *:443>
	ServerName		www.domain2.tld
	DocumentRoot		/var/www/domain2
	SSLEngine		on
	SSLCertificateFile	/etc/apache2/ssl/domain2.crt.pem
	SSLCertificateKeyFile	/etc/apache2/ssl/domain2.key
	SSLCACertificateFile	/etc/apache2/ssl/ca.crt.pem
</VirtualHost>
#/etc/apache2/mods-enabled/ssl.conf
<IfModule mod_ssl.c>
SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/urandom 512
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
SSLSessionCacheTimeout 300
SSLMutex  file:${APACHE_RUN_DIR}/ssl_mutex

# enable only secure protocols: SSLv3 and TLSv1, but not SSLv2
SSLProtocol all -SSLv2 -SSLv3

# HSTS Header ink. SubDomain
# Modul Headers laden !!! a2enmod headers !!!
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# (Debian Default) SSLCipherSuite HIGH:MEDIUM:!ADH:!MD5
SSLCipherSuite 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:ECDH+AESGCM:\
ECDH+AES:ECDH:HIGH:MEDIUM:!RC4:!3DES:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP'

SSLHonorCipherOrder On
SSLCompression Off

</IfModule>

!!! für den Parameter Header always set Strict-Transport-Security ist das Modul Headers notwendig !!!

a2enmod headers

- alle Aufrufe des vHosts auf Port 80 auf SSL umleiten, nur noch die SSL Version der Seite ist aufrufbar.

<VirtualHost *:80>
Redirect permanent / https://SERVER_NAME/
</VirtualHost>
Seitenanfang

HTTP Strict Transport Security (HSTS)

Wiki - HTTP Strict Transport Security

 

# /etc/apache2/mods-enabled/ssl.conf
...
# HSTS Header ink. SubDomain
# Modul Headers laden !!! a2enmod headers !!!
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
...

- Einstellung testen

# curl -I https://www.domain.tld
HTTP/1.1 200 OK
Date:
Server: Apache
Strict-Transport-Security: max-age=31536000; includeSubDomains
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Type: text/html
Seitenanfang

Perfect Forward Secrecy (PFS)

Wiki - Perfect Forward Secrecy
Apache und OpenSSL für PFS konfigurieren

ECDHE und DHE sollten an den Anfang der SSLCipherSuite gesetzt werden, wenn man PFS unterstützen möchte.

# /etc/apache2/mods-enabled/ssl.conf
...
SSLCipherSuite 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:ECDH+AESGCM:\
ECDH+AES:ECDH:HIGH:MEDIUM:!RC4:!3DES:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP'
...

- PFS testen

openssl s_client -cipher 'ECDHE:DH' -connect www.domain.tld:443
Seitenanfang

HTTP Public Key Pinning (HPKP)

Wiki - HTTP Public Key Pinning
Let’s Encrypt Praxis

Absichern des HTTPS-Protokolls gegen Man-in-the-Middle-Angriffe mit gefälschten, jedoch von einer anerkannten Zertifizierungsstelle (CA) signierten Zertifikaten.

 

openssl rsa -pubout -in /PFAD/ZUM/SCHLÜSSEL.KEY -outform der | openssl dgst -sha256 -binary | base64
Seitenanfang

TLS 1.3

Was die anstehende Version TLS 1.3 bringt
The Transport Layer Security (TLS) Protocol Version 1.3 (DRAFT)

 

Seitenanfang

Server-Name-Indication (SNI)

ab Version 2.2.12 ist es mit SNI möglich mehrere virtuelle SSL Hosts auf einer IP laufen zu lassen.

- testen ob SNI verfügbar ist

grep -cU TLS_SNI /usr/lib/apache2/modules/mod_ssl.so

oder bei einem monolithischen apache2

grep -cU TLS_SNI /usr/sbin/apache2

als Ausgabe muß ein Wert größer 0 erscheinen, wenn SNI verfügbar sein soll.

- prüfen ob SSL die Vorraussetzungen erfüllt, das Ergebnis sollte wieder größer 0 sein.

grep -cU SSL_get_servername /usr/lib/libssl.so
Seitenanfang

SSL-Verbindung testen

 

openssl s_client -connect domain.tld:443 -tls1

einige openssl s_client Parameter

-ssl2          - just use SSLv2
-ssl3          - just use SSLv3
-tls1_2        - just use TLSv1.2
-tls1_1        - just use TLSv1.1
-tls1          - just use TLSv1
-dtls1         - just use DTLSv1
-fallback_scsv - send TLS_FALLBACK_SCSV

-no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol

 

Seitenanfang

Apache 2.x als ReverseProxy

IPv6 über ReverseProxy
mod_proxy Beschreibung

Module die aktiviert werden müssen
mod_proxy
mod_proxy_http

a2enmod proxy_http

Konfigurationsdatei
/etc/apache2/mods-enabled/proxy.conf

Virtualhost definieren
/etc/apache2/sites-enabled/

ohne Authentifizierung

<VirtualHost www.domain.tld>
 ServerName www.domain.tld
 ServerAlias host.domain.tld
 CustomLog /var/log/apache2/www.domain.tld.log combined
 ErrorLog /var/log/apache2/www.domain.tld.err.log
  <Proxy *>
   Order deny,allow
   Allow from all
  </Proxy>
 ProxyPass / http://host2.domain.tld/
 ProxyPassReverse / http://host2.domain.tld/
 ProxyRequests off
</VirtualHost>

mit Authentifizierung

<VirtualHost www.domain.tld>
 ServerName www.domain.tld
 ServerAlias host.domain.tld
 CustomLog /var/log/apache2/www.domain.tld.log combined
 ErrorLog /var/log/apache2/www.domain.tld.err.log
  <Proxy *>
   Order deny,allow
   Allow from all
   AuthType Basic
   AuthName "ProxyPasswort"
   AuthUserFile /etc/apache2/htpasswd
   require valid-user
  </Proxy>
 ProxyPass / http://host2.domain.tld/
 ProxyPassReverse / http://host2.domain.tld/
 ProxyRequests off
</VirtualHost>

 

Seitenanfang

Webalizer

- Installation

apt-get install webalizer geoip-database

wenn die GeoIP- Datenbank fehlt kommt folgende Fehlermeldung beim Aufruf von webalizer

Error Opening file /usr/share/GeoIP/GeoIP.dat

Konfigurationsdatei (default) /etc/webalizer.conf

- Verzeichnis für die Konfiguratinsdateien anlegen.

mkdir /etc/webalizer

Einstellungen in der .conf vornehmen, nach Vorlage der /etc/webalizer.conf sind folgende Parameter anzupassen. Der Parameter Quiet yes gibt an des nach dem ausführen von webalizer keine Mail über den Status gesendet wird, Standard ist Quiet no.

LogFile /path/zur/logdatei
Hostname domain.tld
OutputDir /path/des/Statisticverzeichnisses
Quiet yes

alle .conf Dateien im angegebenen Verzeichnis werden mit folgenden Script abgearbeitet. Am einfachsten speichert man diesen Script unter "/etc/cron.daily" oder "/etc/cron.hourly" je nachdem wie oft die Statistic erneuert werden soll.

#!/bin/sh
#	Webalizer Script
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

for a in /etc/webalizer/*.conf; do webalizer -c $a; done
Seitenanfang

PHP

PHP absichern mit Suhosin

/etc/php5/conf.d/suhosin.ini - Konfigurationsdatei (Debian)
/etc/php.d/suhosin.ini - Konfigurationsdatei (Fedora)

<VirtualHost *>
<Directory /path/zum/verzeichnis>
 ...
php_admin_value
suhosin.memory_limit= 128M
 ...
</Directory>
</VirtualHost>

Suhosin Konfiguration vor dem Einsatz testen, es werden alle Eingriffe von Suhosin im LOG protokolliert.

suhosin.simulation = yes
suhosin.log.syslog.facility = LOG_LOCAL7

Syslog Konfiguration anpassen, das Suhosin LOG auch nach local7 geschrieben wird.

# /etc/rsyslog.conf
...
local7.* /var/log/suhosin.log
...
Seitenanfang

Logging

- Loggen einrichten
UserAgent - ist die vom Client übergeben Angabe zum verwendeten Browser und des verwendeten Betriebssystemes

Opera/7.53 (X11; Linux i686; U)  [de]

Referer - ist die HTLM Seite die vor der aktuellen Seite abgefragt wurde, also von der Seite von der der Nutzer kommt.

Apache loggt nur bei der Angabe von "NCSA combined" den User-Agent sowie den Referer, falls diese Werte vom Client übergeben werden.

# Common Log Format with Virtual Host
LogFormat "%v %h %l %u %t \"%r\" %s %b" vcommon
#
# Common Log Format (CLF)
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#
# NCSA extended/combined log format
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
#
# Referer log format
LogFormat "%{Referer}i -> %U" referer
#
# Agent (Browser) log format
LogFormat "%{User-agent}i" agent
CustomLog logs/access.log common
CustomLog logs/access.log combined

Über LogFormat werden Aliasse erzeugt und mit CustomLog wird die Logdatei bestimmt und deren Format über den Alias gewählt.

%h: remote host
%l: remote username
%u: HTTP authenticated username
%t: time
%r: HTTP-Request
%s: HTTP-Status
%b: bytes

Apache Fingerprint abschalten

- in der Datei apache2.conf oder http.conf den Eintrag je nach wunsch ergänzen.

ServerTokens Prod

möglich ist z.B.

ServerTokens Prod
Server sends (e.g.): Server: Apache
ServerTokens Major
Server sends (e.g.): Server: Apache/2
ServerTokens Minor
Server sends (e.g.): Server: Apache/2.0
ServerTokens Min
Server sends (e.g.): Server: Apache/2.0.41
ServerTokens OS
Server sends (e.g.): Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified)
Server sends (e.g.): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

 

Seitenanfang

Apache 2.4

Neuerungen

- Konfigurations-Dateien die vorher in /etc/apache2/conf.d wurden nach /etc/apache2/conf-available/ verschoben

/etc/apache2/conf-available/
/etc/apache2/conf-enabled/
a2enconf <ConfFile>
a2disconf <ConfFile>

- Zugriffsrechte für den DocumentRoot der Site setzen

Fehlermeldung:
[authz_core:error] [pid xxx:tid xxx] [client 127.0.0.1:54075] AH01630: client denied by server configuration: /var/www/

Apache Require Directive

<Directory /srv/www/site>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
<VirtualHost *>
 ...
 DocumentRoot /srv/www/site
 ...
</VirtualHost>

- der Parameter NameVirtualHost wird nicht mehr genutzt

# ports.conf
...
NameVirtualHost *
...

- Dateien unter /etc/apache2/sites-available werden nur noch .conf Extension berücksichtigt.

# /etc/apache2/apache2.conf
...
IncludeOptional sites-enabled/*.conf
a2ensite default
a2dissite default
Seitenanfang

Apache Fehlermeldungen

Liste der Error Codes

vServer

mit dem Paket "apache2-mpm-worker" gibt es Probleme auf einem vServer
Fehlermeldung: "Cannot allocate memory: apr_thread_create"

Lösung: Paket apache2-mpm-prefork installieren

apt-get install apache2-mpm-prefork

CGI Scripte können nicht ausgeführt werden

[error] [client xxx] (13)Permission denied: exec of '/var/www/cgi-bin/search.pl' failed
[error] [client xxx] Premature end of script headers: search.pl

Zugriff für den Apache Server setzen und die Scripte ausführbar machen.

chown -R www-data:www-data /var/www/
chmod 750 /var/www/cgi-bin/*.pl

WebDAV Fehler unter ubuntu mit Apache Version (2.4.7-1ubuntu4.4 trusty)

Apache Bugzilla

Zugriff über WebDAV auf ein Verzeichnis, das eine index.html enthält funtioniert nicht.

Fehlermeldung von cadaver

Could not access /dav/ (not WebDAV-enabled?):
405 Method Not Allowed

Fehlermeldung im Apache Log "PROPFIND /dav/ HTTP/1.1" 405

Abhilfe:

<Location "/dav/">
   ...
   <Limit PROPFIND>
        DirectoryIndex never-encounterable-file-name.html
   </Limit>
</Location>
service apache2 restart

Apache 2.4 Error AH02292

AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server 
name indication support (RFC 4366)

Server Name definieren, der bei einer Fehlermeldung angezeigt werden soll.

# /etc/apache2/conf-available/fqdn.conf
ServerName domain.tld
a2enconf fqdn
service apache2 restart

!!! als ServerName nicht den Namen eines VirtualHost nehmen !!!

Apache 2.4 Error AH02200, AH01914, AH01382 und AH01991

- beim starten des Apache Servers
AH02200: Loading certificate & private key of SSL-aware server 'www.domain.tld:443'
AH01914: Configuring server dav.su4me.de:443 for SSL protocol

- bei der Verbindung mit Browser oder cardaver (WebDAV Client)
AH01382: Request header read timeout
AH01991: SSL input filter read failed.

Lösung:

die Fehler sind nur LOG-rauschen, haben keine Auswirkungen. Um sie aus den LOGs zu bekommen kann man den LogLevel erhöhen von debug oder info auf notice.

<VirtualHost *:443>
	...
	LogLevel notice
</VirtualHost>
Seitenanfang

UserAgent Sperre einrichten

- Sperre über Apache .conf Datei einrichten

# /etc/apache2/sites-available/<website>.conf
# Bot block Variablen definieren
SetEnvIfNoCase User-Agent ^$ bad_bot		# blocken, wenn kein User-Agent angegeben ist
SetEnvIfNoCase User-Agent "^AhrefsBot" bad_bot
SetEnvIfNoCase User-Agent "^MJ12bot" bad_bot
SetEnvIfNoCase User-Agent "^Cliqzbot" bad_bot

<Directory "/var/www/html">
...
	<Limit GET POST HEAD>
	 Order Allow,Deny
	 Allow from all
	 Deny from env=bad_bot
	</Limit>
</Directory>

- Sperre über eine .htaccess Datei im WebOrdner einrichten

# .htaccess
# Bot block Variablen definieren
SetEnvIfNoCase User-Agent "^AhrefsBot" bad_bot
SetEnvIfNoCase User-Agent "^MJ12bot" bad_bot
SetEnvIfNoCase User-Agent "^Cliqzbot" bad_bot

<Limit GET POST HEAD>
  Order Allow,Deny
  Allow from all
  Deny from env=bad_bot
</Limit>

- Sperre über die robots.txt im root des WebServers

# Robots.txt
User-agent: MJ12bot
Disallow: /

 

 

 

Seitenanfang

sonstiges

Server Informationen anzeigen

- Modul Info laden und Apache neustarten

a2enmod info
service apache2 restart

- unter den folgenden URLs sind jetzt die Apache Status-Seiten verfügbar, per Default ist der Zugriff nur von localhost aus gestattet.

http://servername/server-info
http://servername/server-status

- alle aktuellen Apache Verbindungen auf Port 80

netstat -n |grep ESTAB|grep '\:80 '

Apache Proxy Server einrichten
- für Debian folgende Links einrichten
ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled

Module die geladen werden müssen:
proxy_module, proxy_connect, proxy_http

in der proxy.conf die Zugriffsrechte setzen unter "Allow from .your_domain.com"

<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass /server2/ http://192.168.2.10:80/
</IfModule>

- jetz kann man unter http://localhost/server2/ auf den Webservers der auf einen anderen Rechner läuft zugreifen.
der Schrägstrich hinter /server2/ ist wichtig, bei der Adresse im Browser genauso wie bei dem Namen in der Option "ProxyPass".
- "ProxyRequests On" wenn der Apache-Server als Proxy für ein Netz dienen soll.
- Wenn die Einstellungen in der proxy.conf gemacht werden gilt das für alle Webseiten die auf den Server laufen, man kann auch einen vhost definieren

<VirtualHost *>
ServerName server2.domain.tld:80
Serveradmin postmaster@domain.tld
ProxyRequests Off
ProxyPass / http://192.168.2.10:80/
ProxyPassReverse / http://192.168.2.20:8080/
</VirtualHost>