Webserver mit Apache PHP und MySQL
Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.
|
Dieses Tutorial beschreibt die Installation und Einrichtung eines Apache-Webservers mit PHP und MySQL auf Debian Wheezy 7.2. Es zielt darauf ab, auf dem eingerichteten System später einen privaten Webblog auf CMS-Basis (Joomla!, WordPress, Drupal etc.) oder ein Forum, wie zum Beispiel phpBB, nutzen zu können. Die Installation von OwnCloud ist anschließend ebenfalls möglich.
Warnung:
|
Basisinstallation
Apache2 installieren
Aus Sicherheits- und Stabilitätsgründen, auch im Hinblick auf PHP, installieren wir die Prefork-Multi-Processing-Modul (MPM)-Variante des Apache-Webservers.
root@debian:~# apt-get install apache2-mpm-prefork
Wenn ihr danach im Browser eurer Wahl die Adresse eures Webservers (lokal) http://localhost/ oder von (extern) http://ip-adresse-eures-servers/ aufruft, sollte die Standardseite des Apache-Webservers erscheinen. Apache wurde erfolgreich installiert und läuft.
PHP5 mit MySQL-Unterstützung und Caching installieren
Da wir jedoch auf PHP-Unterstützung angewiesen sind, installieren wir PHP5 als Apache-Modul mit häufig benötigten PHP-Modulen.
root@debian:~# apt-get install libapache2-mod-php5 php5-mysql php-apc php5-curl php5-gd
- php5-mysql: MySQL-Unterstützung für PHP
- php-apc: APC steht für Alternative PHP Cache (APC), PHP durch Caching beschleunigen
- php5-gd: PHP-Grafikbibliothek
- php5-curl: Dateien von FTP-, Gopher- und HTTP-Servern mittels PHP kopieren (cURL).
Hinweis:
|
MySQL Server mit phpmyadmin-Verwaltung installieren
Wir installieren den MySQL-Server und die Datenbankverwaltung PhpMyAdmin mit folgendem Befehl:
root@debian:~# apt-get install mysql-server-5.5 phpmyadmin
Installation
mysql-server
- Man wird aufgefordert ein Passwort für den administrativen MySQL-Benutzer "root" anzugeben.
phpmyadmin
- PhpMyAdmin fragt, ob es automatisch für einen Webserver eingerichtet werden soll. Hier setzen wir ein Sternchen bei apache2 (Space-Taste).
- Im Anschluss wird man gefragt, ob dbconfig-common die benötigte MySQL-Datenbank für PhpMyAdmin einrichten soll: Hier wählt man ja.
- Das administrative MySQL-Passwort wird danach gefordert werden, also eingeben.
- Es folgt "Bitte geben Sie ein Passwort ein, mit dem sich phpmyadmin beim Datenbankserver anmelden kann. Falls Sie das Feld frei lassen, wird automatisch ein zufälliges Passwort erzeugt." - Kann man also frei lassen.
Fazit
Der Apache- und MySQL-Server läuft. PHP ist installiert. Die Basisinstallation wäre hiermit beendet.
Hinweis: PhpMyAdmin ist unter http://deine-server-adresse/phpmyadmin abrufbar! |
Erweiterte Installation
PhpMyAdmin Zugang sicherer machen
Aus eigener Erfahrung kann ich sagen, dass es eine schlechte Idee ist, PhpMyAdmin unter dem Standard-Alias abrufbar zu lassen.
Folgender Logfile-Auszug von meinem eigenen Debian-Webserver im Internet soll euch zeigen, was ich meine (als Grafik rechts eingebettet).
Aus Sicherheitsgründen sollten wir also den Standard-Pfad, das Standard-Alias, von PhpMyAdmin ändern.
Konfigurationsdatei ändern
Die zu bearbeitende Konfigurationsdatei liegt in /etc/phpmyadmin/apache.conf.
Diese zeigt sich wie folgt:
# phpMyAdmin default Apache configuration
Alias /phpmyadmin /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_flag register_globals Off
php_admin_flag allow_url_fopen Off
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/php$
</IfModule>
</Directory>
Wir ändern die Zeile
Alias /phpmyadmin /usr/share/phpmyadmin
beispielsweise zu
Alias /2SecretConf24ThatNo16OneKnows /usr/share/phpmyadmin
Wir speichern die apache.conf und starten im Anschluss den Apache-Server neu mit
root@debian:~# /etc/init.d/apache2 restart
Der neue Alias oben ist nur ein Beispiel, man könnte es vielleicht noch komplizierter machen, aber eventuell möchte man sich den Namen ja noch merken können. Mit diesem kleinen Eingriff haben wir einen Tick an mehr Sicherheit gewonnen, um PhpMyAdmin vor ungewollten Blicken und möglichen Brute-Force-Attacken zu schützen.
Hinweis: PhpMyAdmin wäre jetzt unter http://deine-server-adresse/2SecretConf24ThatNo16OneKnows abrufbar! |
Tipp: Ich verwende unter Windows den Logfile Betrachter Apache Logs Viewer, er ist sehr übersichtlich und ein regelmäßiger Blick in die Logfiles lohnt, auch im Hinblick auf die Sicherheit!
Apache absichern (Anti-DDoS)
Hier zunächst einige Referenzen[1][2][3].
Timeout Wert ändern
Im Anbetracht von DDoS-Angriffen sollte man den Timeout-Wert in der /etc/apache2/apache2.conf ändern, dieser kommt mit 300 etwas groß daher.
Timeout 45
Bester Apache-DDOS Schutz: mod_evasive
Das Apache-Modul mod_evasive libapache2-mod-evasive bietet den besten Schutz gegen DDoS Angriffe, indem es die Zugriffe auf den Webserver innerhalb einer bestimmten Zeit registriert und einen attackierenden Client für eine gewisse Zeit sperrt.
Installation mit
root@debian:~# apt-get install libapache2-mod-evasive
Im Anschluss erstellt man einen extra Logfile Ordner
root@debian:~# mkdir /var/lock/mod-evasive
Gibt die Rechte für den Ordner an den Benutzer www-data ab:
root@debian:~# chown www-data /var/lock/mod-evasive
Wir brauchen jetzt keine extra-Konfigurationsdatei anlegen.
Wir nutzen die bereits Vorhandene "/etc/apache2/mods-available/mod-evasive.load" mit dem Befehl
root@debian:~# cd /etc/apache2/mods-available
und öffnen diese im Editor unserer Wahl, in meinem Fall nano.
root@debian:~# nano mod-evasive.load
Hinweis: Nano nano ist sehr bequem: Mit Strg+O speichert man bei Nano und mit Strg+X verlässt man den Editor |
Standardmäßig sieht die Datei so aus:
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
Wir ändern sie ab zu
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify webmaster@deinedomainhier.de
DOSLogDir "/var/lock/mod-evasive"
</IfModule>
Die Anführungszeichen beim DOSLogDir sind sehr wichtig. Trage deine E-Mail Adresse bei DOSEmailNotify ein, dann wirst du über jeden Angriff via E-Mail benachrichtigt.
Hinweis: Solltest du schon etwas mehr Traffic auf deiner Homepage haben, viele Bilder und Besucher, dann solltest du den DOSPageCount und DOSSiteCount Wert anpassen. Du könntest mit zu niedrigen Werten auch Web-Crawler aussperren. Aber das merkst du schon an den Benachrichtigungen |
Der Mod sollte standardmäßig aktiviert sein, wir prüfen das mit
root@debian:~# a2enmod mod-evasive
Deaktivieren kannst du mod-evasive mit
root@debian:~# a2dismod mod-evasive
Hinweis: Unter "/usr/share/doc/libapache2-mod-evasive/examples" findet sich ein ein Testscript. Ausführen mit:
root@debian:~# perl test.pl
|
Warnung: Vergiss nicht den Apache-Webserver nach erledigter Arbeit neuzustarten. |
SSH-Server installieren und absichern (Fernwartung)
Wenn man den Server aus der Ferne warten möchte, dann kommt man um die Secure Shell wohl kaum herum. Als großen Vorteil gegenüber Telnet wird hierbei die Verbindung verschlüsselt. Man kann sich damit aus der Ferne einloggen - bei einem Rootserver oder virtuellen Server dürfte SSH wohl zur Standardausstattung gehören.
OpenSSH-Server Installation
Wir installieren den SSH-Server mit
root@debian:~# apt-get install openssh-server
Verbindung zum SSH-Server herstellen
Bei Wheezy ist der SSH-Client standardmäßig installiert, mit dem Befehl
user@debian:~$ ssh -l deinbenutzername deineserveradresse
kannst du eine Verbindung zu deinem SSH-Server herstellen. Via Standard läuft SSH-Verkehr über den Port 22.
Hinweis: Einer der bekanntesten SSH-Clients, den es auch für Windows gibt, ist wohl Putty (Projektseite) |
.
SSH root-Login verbieten
Um den SSH-Server ein Stück sicherer zu machen können wir den direkten Login für den SuperUser "root" deaktivieren. Sei Dir jedoch bewusst darüber, dass du vorher mindestens einen weiteren Benutzer auf deinem System haben solltest. (Damit man sich als Benutzer einloggen kann und mit dem su - Befehl kann man dann auch wieder root-Rechte erlangen.)
Wir editieren die Datei "/etc/ssh/sshd_config" und ändern
PermitRootLogin yes
zu
PermitRootLogin no
Jetzt kann sich der Benutzer Root nicht mehr direkt über den SSH-Server am System anmelden. Man meldet sich ganz normal mit einem Benutzer an und wechselt dann mittels
user@debian:~$ su
in den Root-Account.
Unser Server ist so wieder ein Stück sicherer geworden.
SSH zusätzlich mit Fail2ban absichern
Einleitung
Fail2ban ist ein auf Python basiertes "Intrusion Prevention System", welches Logdateien verschiedenster Webdienste wie SSHD und Apache überwachen und bei auffälligem Verhalten eines attackierenden Client blockieren kann. Näheres lässt sich aus der Wikipedia-Seite von Fail2ban entnehmen.
Fail2ban wollen wir hier nutzen um unseren SSH-Zugang zusätzlich abzusichern.
Fail2ban installieren
fail2ban ist bereits in den Paketquellen enthalten und lässt sich spielend leicht mit
root@debian:~# apt-get install fail2ban whois
installieren. Wir installieren whois mit, um später weitere Informationen zum blockierten Client zu erhalten.
Fail2ban konfigurieren (jail.conf)
Wir wollen jetzt mal einen Blick auf die Hauptkonfigurationsdatei von Fail2ban werfen. Es handelt sich dabei um die Datei "/etc/fail2ban/jail.conf".
Generelle Einstellungen finden sich unter [DEFAULT]
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1/8
bantime = 600
maxretry = 3
backend = auto
#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@localhost
Die wichtigsten Standard-Parameter:
- bantime: Kontrolliert die Blockzeit eines Clients, via Standard 600 Sekunden = 10 Minuten,
- maxretry: Steht für die maximalen Regelverstöße, bis ein Client blockiert wird
- destemail: Hier sollten wir unsere eigene E-Mail Adresse angeben (dazu später mehr)
Hinweis: Die Filter-Einstellungen am Ende der Datei haben immer Vorrang. |
Der nächste Absatz beschäfigt sich mit der Aktion, die bei einem Ban ausgeführt werden soll:
#
# ACTIONS
#
banaction = iptables-multiport
mta = sendmail
Die wichtigsten Parameter:
- banaction: Die Standard-Aktion die ausgeführt werden soll; iptables-multiport kann man so stehen lassen.
- mta: Der MTA, der zum Versenden von Mails verswendet wird (Standard: sendmail)
Ich möchte jetzt auf den destemail-Parameter zurückkommen: Sobald ein Client blockiert wird, könnt ihr euch eine E-Mail mit IP-Adresse samt WHOIS- und Logdatei Auszug zuschicken lassen.
Das macht Fail2ban aber nicht von Haus aus, wir müssen folgende Zeile
action = %(action_)s
abändern zu
action = %(action_mwl)s
Der E-Mail Versand bei einem Client-Ban wäre damit aktiviert. Wir widmen uns jetzt den zu überwachenden Diensten, bei Fail2ban Filter genannt:
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
Wie wir erkennen können, ist der Standard-Filter ssh schon aktiviert. Hier müssen wir nichts ändern. Es gibt jedoch auch noch einen Filter gegen DDoS-Angriffe auf SSH, folgender Abschnitt:
[ssh-ddos]
enabled = false
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 6
"enabled = false" ändern wir hier einfach ab zu "enabled = true".
Wir speichern die Konfigurationsdatei jail.conf. Jetzt müssen wir Fail2ban noch neustarten mittels
root@debian:~# /etc/init.d/fail2ban restart
Euer SSH-Zugang ist jetzt extra abgesichert und ihr erhaltet über jeden Einbruch-Versuch eine E-Mail mit Logfile- und WHOIS-Auszug. Und wir sind damit unserem Ziel "sicherer Server" wieder ein Stück näher gekommen.
Hinweis: Die Konfigurationsdateien der Filter finden sich in "/etc/fail2ban/filter.d" und die der Aktionen in "/etc/fail2ban/action.d" |
Hinweis: Fail2ban führt eine Logdatei unter /var/log/fail2ban.lorg |
Logdateien überwachen mittels Logwatch
Einleitung
Damit man seinen Server unter Kontrolle hat ist es wichtig regelmäßig die Logdateien der laufenden Serverdienste zu checken. Unter /var/log/apache2 liegen beispielsweise die Logdateien des Apache-Servers. Nun wäre es sehr mühsam, sich jeden Tag über SSH einzuloggen und jede einzelne Logdatei via Hand zu kontrollieren.
Eine Menge Arbeit kann man sich mit logwatch sparen, welches täglich eine Zusammenfassung aller Logdateien erstellen und die Zusammenfassung dann an eine hinterlegte E-Mail Adresse schicken kann.
Installation und Konfiguration von Logwatch
Klingt doch gut, oder? logwatch installieren wir mit
root@debian:~# apt-get install logwatch
Im Anschluss bearbeiten wir die Konfigurationsdatei "logwatch.conf":
root@debian:~# nano /usr/share/logwatch/default.conf/logwatch.conf
Dort setzen wir diese Einstellungen
MailTo = root
Output = mail
Format = text
Detail = High
Die folgenden Zeilen sollte man ausklammern:
#Service = "-zz-network" # Prevents execution of zz-network service, which
# prints useful network configuration info.
#Service = "-zz-sys" # Prevents execution of zz-sys service, which
# prints useful system configuration info.
#Service = "-eximstats" # Prevents execution of eximstats service, which
# is a wrapper for the eximstats program.
Wir speichern die Konfigurationsdatei ab.
Cronjob für Logwatch anlegen (Mail-Versand)
Nach kurzer Überlegung fügen wir folgende Zeile in die "/etc/crontab" ein:
0 */3 * * * root /usr/sbin/logwatch --mailto meinname@meinedomain.de>/dev/null 2>&1
Die E-Mail Adresse muss angepasst werden, damit sie auch im richtigen Postfach ankommt. Der Cron-Daemon wird uns jetzt alle 3-Stunden eine Logwatch-Report via E-Mail schicken.
So sieht ein Logwatch-Report aus: Beispiel.
(Referenz zu Logwatch[4] und Cron[5]
Sicherheit
Grundlegendes
Ein paar grundlegende Dinge zur Sicherheit.
- Verwende sicherer Passwörter. In der Wikipedia gibt es einen sehr guten Artikel über Passwörter.
- Halte die Server-Software aktuell. Dazu ein Einzeiler:
root@debian:~# apt-get update && apt-get upgrade
- Nutze sicherheitsrelevante Informationen zu Debian (Foren, Howtos) und trage dich auf der Debian-Mailinglist ein
- Linux-Firewall verwenden (!)
Firewall verwenden
Warnung: Sollte dein Server im Internet erreichbar sein, so verwende bitte eine Firewall. |
Ein einfaches Firewall-Script, welches nur ganz wenig Anpassung benötigt, findet sich hier.
Siehe auch dieser Artikel hier.
Installation von Webanwendungen
Vorbereitung
Warnung: Bevor man irgendeine Webanwendung, sei es OpenCloud, ein beliebiges CMS oder ein Forum auf dem Server laufen lassen möchte, sollte man sich über die Sicherheit seines Server bewusst sein. Besonderer Fokus sollte hierbei wohl auf der Konfiguration des Apache-Webservers liegen, denn dieses Howto beschäftigt sich ja schließlich mit dem Apache-Webserver. Datei- und Zugriffsrechte sind auch nicht zu missachten. |
Über die Sicherheit anderer Serverdienste wie FTP, die ebenso Zugriff auf ein Webverzeichnis des Apache-Servers haben, sollte man sich ebenso im klaren sein. PhpMyAdmin ist ein Angriffspunkt, was die Datenbanken betrifft. SSH, der Hauptfernzugriff auf den Server, ist ein Angriffspunkt.
Unter "Punkt 2. Erweiterte Installation" kann man jedenfalls schon eine Menge für die Sicherheit tun. Ob man den SSH-Zugang dann beispielsweise noch zusätzlich mit einem Zertifikat absichern möchte, bleibt wohl jedem selbst überlassen.
Extrem wichtig ist es eben auch, eine Firewall zu verwenden, wenn der Server mit dem Internet verbunden ist. Das "unter Punkt 3 angegebene Firewall-Script" ist schon eine gute Lösung, soll aber nicht heißen, dass es nicht auch noch besser geht.
Anleitungen innerhalb des Debianforums
Hier können Anleitungen und Howtos zu Webanwendungen vom Debianforum-Wiki gesammelt werden.
Referenzen
- ↑ http://debian-blog.org/apache2-absichern/
- ↑ http://httpd.apache.org/docs/trunk/misc/security_tips.html
- ↑ http://spielwiese.la-evento.com/xelasblog/archives/56-Apache-DOS-Attacken-erschweren-mit-mod_evasive.html
- ↑ http://debian-blog.org/logwatch-installieren-und-einrichten/
- ↑ http://wiki.ubuntuusers.de/Cron