Webserver mit Apache: Difference between revisions
Line 187: | Line 187: | ||
(sub.class1.server.ca.pem natürlich durch den aktuellen Namen des Zwischenzertifikats ersetzen) |
(sub.class1.server.ca.pem natürlich durch den aktuellen Namen des Zwischenzertifikats ersetzen) |
||
s.a. http://www.startssl.com/?app=25#31 |
Revision as of 13:56, 16 April 2016
Die am häufigsten genutzte Webserver-Software ist der Apache. Abgesehen davon, dass er relativ einfach zu konfigurieren ist, bringt er den Vorteil, dass die wichtigsten Module (z.B. php) bei der Standard-Installation bereits eingebunden sind. Nachteilig sind die vielen Exploits auf diesen weit verbreiteten Webdienst, also Versionsstand aktuell halten! Zum Entstehungszeitpunkt dieses Dokuments war die aktuellste Version der apache2. Wir verlassen uns aber nicht auf diese Aussage, sondern prüfen den Versionsstand selbst nach mit
# aptitude search apache
Danach installieren wir die aktuellste Version:
# aptitude install apache2
Nach der Installation läuft der Dienst auch schon. Überprüfung mit
# ps auxw | grep apache
Konfigurationsdateien
Diese befinden sich im Verzeichnis /etc/apache2. Die wichtigste Datei ist die apache2.conf. Diese verweist auf weitere Dateien und Unterverzeichnisse. Wer z.B. möchte, dass sein Webserver auf einem anderen Port als 80 lauscht, wird in der Datei ports.conf fündig.
Wohin mit den Webseiten
Der Standardordner für Webseiten ist das Verzeichnis /var/www/. Wer weitere/andere Verzeichnisse festlegen will, kann das in der Datei sites-available/default im Abschnitt DocumentRoot tun. Wir wollen in unserem Fall die Standardwebseite im Verzeichnis /var/www haben. Zu diesem Zweck ändern wir in der Datei sites-available/default den Eintrag
RedirectMatch ^/$ /apache2-default/
in
RedirectMatch ^/$ /index.html
(setzt natürlich voraus, dass mit einer Datei index.html begonnen wird)
Neustart des Apache nach Konfigurationsänderungen erfolgt mittels
# /etc/init.d/apache2 reload
Virtual Hosting
Mal angenommen, ihr entschließt euch, mehrere Domains auf einem Webserver zu hosten. Dafür gibt es die Virtual-Host-Einträge in der Datei sites-available/default. In unserem Fall wollen wir 2 Domains hosten, example.de unter /var/www/kdxxl und nomorebluescreen.com unter /var/www/nmbs. Zu diesem Zweck wird die Datei sites-available/default um den Eintrag ServerName ergänzt.
NameVirtualHost * <VirtualHost *> ServerName www.example.de
Dann wird der ganze Abschnitt kopiert und der ServerName-Eintrag für die 2. Domain angepasst:
NameVirtualHost * <VirtualHost *> ServerName www.nomorebluescreen.com (...) </Virtual Host>
Die entsprechenden Namen müssen natürlich im DNS (oder zu Testzwecken auch in der /etc/hosts) hinterlegt sein!
Test
Standardeinstellungen: Ein Connect mit dem Browser auf die IP des Webservers sollte die eingestellte Indexseite oder den Apache-Default „It works!“ zeigen. Virtual Hosting: Nach Eingabe der unterschiedlichen Servernamen sollten die entsprechenden Webseiten zu sehen sein.
Ein einfacher Configcheck geht mit
apache2ctl -t
Hier sollte "Syntax OK" zurückkommen.
Logfiles
Diese befinden sich im Verzeichnis /var/log/apache2
php einbinden
Dies ist zumindest unter Debian sehr trivial, weil nur das Paket php installiert werden muss. Mit
# aptitude search php
informieren wir uns über die aktuelle Version. Unter Etch ist das php5. Der Neustart des apache wird während der php-Installation übernommen. Hier ein Beispiel für ein schlichtes Testscript:
<?php phpinfo(); ?>
Bei Ausführung desselben ist im Browser folgende Auflistung zu sehen
Directory Listing erlauben
Wenn in einem Unterverzeichnis von DocumentRoot eine Index-Datei (index.html, index.php, ... ) fehlt, bekommt der Benutzer normalerweise eine Fehlermeldung
Forbidden You don't have permission to access /images/ on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Wenn man stattdessen möchte, dass der Benutzer alle Dateien aufgelistet bekommt, muss man folgendes einrichten
<Directory /var/www/images> Option +Indexes </Directory>
Falls die Option auf alle Verzeichnisse zutreffen soll, die den String „images“ enthalten, macht man besser einen DirectoryMatch
<DirectoryMatch images> Option +Indexes </DirectoryMatch>
Security
.htaccess und .htpasswd
Zum Passwortschutz einzelner Ordner bieten sich o.g. Dateien an. Die .htaccess beinhaltet, wer sich überhaupt wie anmelden darf, die .htpasswd beinhaltet die Passwörter
Beispiel für eine .htaccess:
AuthType basic AuthName "Access limited" AuthUserFile /var/www/download/.htpasswd Require valid-user
Die .htpasswd wird mit folgendem Command erzeugt
htpasswd -c <dateiname> <username>
Dann erfolgt eine Eingabeaufforderung für das Passwort. Vorhandene User in einer htpasswd ändert man durch Weglassen der Option -c
Die .htaccess schützt automatisch auch alle Unterverzeichnisse durch ein Passwort. Wenn man das nicht will, muss man in seiner Config für jedes der Verzeichnisse eine Ausnahme generieren, z.B.
<DirectoryMatch "/fotos/fotoclub/example/images/"> Satisfy any </DirectoryMatch>
Fail2ban
Zum Ausbremsen von Brute-Force-Angriffen hilft fail2ban, ein Tool, das zu häufige Fehlversuche beim Anmelden mit einer IP-Tables-Regel auf die zugehörige Source IP quittiert.
Beispiel
Erstmal das Paket „fail2ban" installieren, dann ins Verzeichnis /etc/fail2ban wechseln.
Die Optionen in der fail2ban.conf sind normal bereits auf sinnvolle Werte gesetzt. Gegebenenfalls lässt sich bei Problemen noch das Loglevel raufsetzen
loglevel = 4 # default=3
Achtung: nach dem Debuggen wieder auf default (=3) setzen. Die Logfiles werden sonst sehr schnell sehr groß!
Nun kann man in der jail.conf die unterschiedlichen jails für die einzlenen Dienste einrichten, also für apache:
[apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 10 bantime = 300
Bei den allgemeinen Optionen kann man Excludes für einzelne IPs oder Netze angeben
ignoreip = 127.0.0.1/8 192.168.99.0/24
Achtung: Als Trenner ein Space benutzen. Kommas o.ä. werden zwar akzeptiert, danach funktioniert aber die Banaction nicht. Bei „banaction“ sollte im allgemeinen Teil „iptables-multiport" eingestellt sein. Dienst neu starten, fertig.
Erfolgskontrolle
n- mal falsch anmelden und „iptables -L -n -v“ ausführen (zum testen evtl. eine etwas kürzere bantime wählen)
Debugging
Bei Problemen kann man den Dienst auch im Vordergrund starten:
# fail2ban-server -f
und in einer anderen Shell
# fail2ban-client reload
Verschlüsselte Webseiten
Feind hört mit (Gerüchten zufolge zuweilen auch Freund). Also am besten nichts im Klartext übers Netz schicken. Verschlüsselt wird bei apache üblicherweise mit TLS, die Echtheit (Authentizität) der Webseite wird durch ein Zertifikat überprüft. Wer geschäftlich eine Seite (Webshop o.ä.) betreibt, wird sein Zertifikat höchstwahrscheinlich durch eine offizielle Zertifizierungsstelle (Certificate Authority) signieren lassen, Privatanwender signieren i.d.R. selbst.
Schritte von der Zertifikatserstellung zur verschlüsselten Webseite:
1. Verzeichnis für Zertifikate anlegen
mkdir /etc/apache2/ssl/
2. Request, Key und gleichzeitig Zertifikat erstellen
openssl req -x509 -nodes -days 720 -newkey rsa:4096 -keyout /etc/apache2/ssl/www.example.de.key -out /etc/apache/ssl/www.example.de.crt
Darauf achten, dass bei FQDN unbedingt der Servername eingetragen wird, unter dem der Webserver erreichbar ist (i.d.R. identisch mit dem Wert für ServerName im apache)
Alternative Cert Request für offizielle CA erstellen
1. Key erstellen
openssl genrsa -out www.example.de.key 4096
2. Zertifikats-Request erstellen
openssl req -new -key www.example.de.key -out www.example.de.csr
3. Das .csr file an die Zertifizierungsstelle schicken
in der Regel kommt z.B. ein File namens www.example.de.crt zurück
4. Überprüfen des Zertifikats:
openssl x509 -in www.example.de.crt -text -noout
5. Apache konfigurieren
5.1. mod_ssl aktivieren
cd /etc/apache2/sites-enabled/ ln -s ../mods-available/ssl.conf ln -s ../mods-available/ssl.load
5.2. Virtual-Host auf Port 443 einrichten
<VirtualHost *:443> ServerAdmin webmaster@example.de ServerName www.example.de:443 ServerAlias mail.example.de:443 SSLEngine on SSLCertificateFile /etc/apache2/ssl/www.example.de.crt SSLCertificateKeyFile /etc/apache2/ssl/www.example.de.key </VirtualHost>
5.3. Redirects
Wer es nicht dem Zufall überlassen will, ob der Benutzer im Browser http:// oder https:// eingibt, kann eine automatische Weiterleitung zur verschlüsselten Seite einrichten:
a2enmod rewrite
Dann im VirtualHost:80-Abschnitt folgendes eintragen (z.B. wenn „download“ im URL-Name dann auf https umleiten)
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?download(.*) https://%{SERVER_NAME}/download/$1 [R,L]
Alternative startssl
Wer eine gratis-CA nutzen, will, um zu einem öffentlich signierten Zertifikat zu kommen, kann sich über http://startssl.com registrieren. Hier sind keine openssl-Commands nötig, man klickt sich seine Zertifikate zusammen, pastet sie in Textdateien und fügt sie wie gehabt in seine apache-Config ein. Achtung: Damit das Ganze funktioniert, muss man sich hier ein Zwischenzertifikat (intermediate certificate) herunterladen und seine apache-Config durch folgende Anweisung erweitern:
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
(sub.class1.server.ca.pem natürlich durch den aktuellen Namen des Zwischenzertifikats ersetzen)