Webserver mit Apache PHP und MySQL

Aus DebianforumWiki

Wechseln zu: Navigation, Suche
WikiWeb und Mailserver ‹ Webserver mit Apache PHP und MySQL

Getestet.png 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.png Warnung:
  • Sollte der Server vom Internet aus erreichbar sein, wäre es fahrlässig keine Firewall zu verwenden (siehe Punkt 3).
  • Dieses Tutorial beschreibt nicht die Installation auf einem Produktivsystem (Firmenserver oder Vergleichbares), da dort andere oder schärfere Maßstäbe gelten können. Hierüber sollte man sich vorher ausreichend informieren.
  • Der PHP-Sicherheitspatch Suhosin(Paket: php5-suhosin) ist bei Wheezy leider nicht verfügbar (da PHP 5.4.4 leider noch nicht unterstützt), weshalb ich hier auf eine Einrichtung dessen verzichte.

Inhaltsverzeichnis

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
  • Debianpackage.png php5-mysql: MySQL-Unterstützung für PHP
  • Debianpackage.png php-apc: APC steht für Alternative PHP Cache (APC), PHP durch Caching beschleunigen
  • Debianpackage.png php5-gd: PHP-Grafikbibliothek
  • Debianpackage.png php5-curl: Dateien von FTP-, Gopher- und HTTP-Servern mittels PHP kopieren (cURL).
Hinweis.png Hinweis:
  • Die entscheidenden Konfigurationsdateien finden sich dann unter /etc/php5/apache2 und /etc/php5/apache2/conf.d.
  • Die Konfigurationsdateien der PHP-Module liegen unter /etc/php5/mods-available.

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.png 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).

Automatisierte Skripte, eventuell Hacker, versuchen PhpMyAdmin zu orten

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.png 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 Debianpackage.png 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.png Hinweis: Nano Debianpackage.png 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.png 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.png Hinweis: Unter "/usr/share/doc/libapache2-mod-evasive/examples" findet sich ein ein Testscript. Ausführen mit:
root@debian:~# perl test.pl

Warnung.png 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.png 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

Debianpackage.png 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.png 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.png Hinweis: Die Konfigurationsdateien der Filter finden sich in "/etc/fail2ban/filter.d" und die der Aktionen in "/etc/fail2ban/action.d"

Hinweis.png 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 Debianpackage.png 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? Debianpackage.png 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.

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.png 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.png 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

  1. http://debian-blog.org/apache2-absichern/
  2. http://httpd.apache.org/docs/trunk/misc/security_tips.html
  3. http://spielwiese.la-evento.com/xelasblog/archives/56-Apache-DOS-Attacken-erschweren-mit-mod_evasive.html
  4. http://debian-blog.org/logwatch-installieren-und-einrichten/
  5. http://wiki.ubuntuusers.de/Cron
Meine Werkzeuge