[font='Verdana']
HOWTO
Debian 6.0 System Konfiguration & Absicherung
(LEMP, E-Mail, FTP, OpenPanel, DDoS, Spam, uvm.)
Version 1.0
Hallo zusammen!
In diesem Tutorial erfährt man alles über die Konfiguration und Absicherung eines Debian 6.x Systems. Am Ende wird euer Server folgendes können: nginx Webserver, E-Mail (Postfix, Courier) IMAP/POP3 mit SSL/TLS, FTP mit TLSv1 (vsFTPd), OpenPanel als Administrationsoberfläche für Email, Firewall und Spamfilter. Außerdem Software Protection gegen DDoS, Bruteforce, Spam, SQLInjections, XSS, Bots, etc. (Deflate, Fail2Ban, ZB Block) .
Die Themen:
#1 Einleitung
#2 Grundsätzliches
#2.1 Vorraussetzungen
#2.2 Vorbereitungen
#3 LEMP
#3.1 Was ist LEMP?
#3.2 MySQL
#3.3 PHP
#3.4 nginx
#3.5 nginx Tuning
#4 FTP
#5 OpenPanel
#5.1 Core
#5.2 Zusatzpakete
#6 Absicherung
#6.1 SSH
#6.2 Fail2Ban
#6.3 Deflate
#6.4 Iptables
#6.5 ZB Block
#7 Tipps & Tricks
[#1 Einleitung]
Besonders für Anfänger ist es schwierig ein System richtig einzurichten. Allein aus rechtlichen Gründen ist man als Besitzer eines Root/vServers für alles verantwortlich, umso wichtiger wird eine vernünftige Konfiguration. Es gibt nichts schlimmeres als eine gehackte Website oder irgendwelche Kinder, die versuchen unser System lahmzulegen oder unseren Server als Spam-Schleuder benutzen. Dieses Tutorial richtet sich vor allem an diejenigen, die bisher noch keine Kenntnisse besitzen und Probleme haben, Übersicht und Kontrolle zu behalten.
[#2 Grundsätzliches]
#2.1 Vorraussetzungen
- Grundkenntnisse Linux/Kommandozeile
- Debian 6.0 Minimal 64 bit frisch installiert
- KVM Server
- PuTTY
- Geduld, Tee/Kaffee
Für alle User die Froxlor einsetzen möchten, hier entlang: [HOWTO] Debian 6.x System Konfiguration & Absicherung (LEMP, E-Mail, FTP, OpenPanel, DDoS, Spam, uvm.)
#2.2 Vorbereitungen
VIM - Ein guter Editor und mein Favorit
Dieser Editor besteht aus einem Eingabe- und einem Kommandomodus. Hier eine Auflistung der wichtigsten Funktionen und Befehle:
Alle vim-Kommandos (beginnen mit ":")
[Blocked Image: http://i.epvpimg.com/pCA5g.jpg]
Erweiterung der Sourcelist
Die sources.list beinhaltet eine Liste von Archiven, aptitude sucht im Inventar nach den Paketen die man installieren möchte. Durch aptitude update wird diese Liste geupdatet. Wir müssen eine Fremdquelle hinzufügen, da einige Pakete nicht in der Debian Liste zu finden sind. Dotdeb - The repository for Debian-based LAMP servers bietet aktuelle Pakete für Debian Systeme an, unter anderem neue MySQL, nginx und PHP Versionen.
Inhalt löschen und folgendes einfügen:
deb http://ftp.de.debian.org/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb http://ftp.de.debian.org/debian squeeze-updates main contrib non-free
#Dotdeb.org LAMP Packages:
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
#OpenPanel Package
deb http://download.openpanel.com/deb/ squeeze main
Display More
Ein Schlüssel muss importiert werden, mit dem die Pakete der Quelle unterschrieben sind:
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4EAC69B9
Pakete aktualisieren:
[#3 LEMP]
#3.1 Was ist LEMP?
LEMP unterscheidet sich nicht viel von LAMP. LAMP setzt sich zusammen aus Linux Apache MySQL und PHP. Es wird lediglich das A durch ein E ersetzt, doch was bedeutet das? Statt Apache wird nun nginx, also E verwendet.
Wieso nginx? Apache ist sehr einfach zu konfigurieren, kompatibel zu mehreren Plattformen und standartmäßig auf fast allen Distributionen vorhanden. Leider bringt Apache viele unnötige Erweiterungen mit sich und glänzt nicht gerade mit Performance. Besonders auf vServern stößt man bereits bei kleineren/mittleren Webseiten an die RAM-Limits. Kleinere DDoS Angriffe zwingen den Apache Server sehr schnell in die Knie. nginx ist auf Performance ausgelegt: sehr leichtgewichtig und vor allem schnell! Es gibt kaum Einschränkungen und die Konfiguration ist trotz allen Irrtums sehr einfach gehalten.
#3.2 MySQL
MySQL installieren
Ein sicheres Passwort ist hier selbstverständlich. Die Konfiguration ist nicht nötig, da MySQL standartmäßig schon perfekt abgesichert ist. Da der Server nur auf Anfragen von localhost (127.0.01) reagiert, werden Verbindungen von außen automatisch geblockt. Trotzdem muss keine Änderung vorgenommen werden, denn MySQL unterstützt eine SSH Connection die mittels PuTTY lokal getunnelt werden kann. So kann man ohne Einschränkung wie gewohnt mit dem Programm seines Vertrauens arbeiten. (Mehr dazu unter Tipps & Tricks)
Die Konfigurationsdatei befindet sich in /etc/mysql/my.cnf. Das dazugehörige Init-Script findet man unter /etc/init.d/mysql
#3.3 PHP
PHP installieren
PHP ist auch von Haus aus gut eingerichtet, allerdings empfehle ich einige Einstellungen zu ändern.
Die Konfiguration von PHP-FPM findet man in /etc/php5/fpm/php-fpm.conf, das dazugehörige Init-Script unter /etc/init.d/php5-fpm und die PHP Einstellungen in /etc/php5/fpm/php.ini
Prozesskonfiguration:
Folgende Einträge ändern:
Erklärung: Wenn 10 PHP-Prozesse innerhalb einer Minute abstürzen, so wird der Dienst neugestartet. Der letzte Eintrag legt die Zeit fest, wie lange diese Prozesse auf den Haupt-Prozess warten sollen.
PHP über einen Socket laufen lassen (Mehr dazu unter Tuning)
aus:
wird:
Dienst neustarten, damit die Änderung auch wirksam wird
php.ini absichern:
safe_mode prüft die Berechtigung des Users, bevor eine Aktion gestartet wird.
Diese Einstellung ist veraltet und wurde mit der Version 5.4 entfernt.
Für Berechtigungen ist das Betriebssystem zuständig und hat nichts in PHP verloren
Mit dieser Einstellung kann man Funktionen verbieten.
Einige Funktionen sollten definitv nicht verfügbar sein und werden in der Regel nicht gebraucht.
disable_functions = escapeshellcmd, exec, ini_restore, passthru, popen, proc_nice, proc_open, shell_exec, system
Soll der Webserver den "X-Powered-By" Header senden?
Diese Einstellung ist optional.
PHP-Fehlermeldungen ausschalten, das erschwert Angreifern das Suchen nach Sicherheitslücken.
Zum debuggen sollte diese Einstellung wieder eingeschaltet werden.
Diese Funktion ist für die meisten Sicherheitslöcher verantwortlich. GET und POST werden global verfügbar gemacht und überschreiben andere Variablen mit dem selben Namen.
Möchten wir das? Natürlich nicht.
Standartmäßig dürfen Dateien, die nicht auf unserem Server liegen, geöffnet werden.
Da dies eine massive Sicherheitslücke darstellt, schalten wir es aus.
Ähnlich wie allow_url_open, diese Einstellung erlaubt es sogar Dateien von anderen Servern zu inkludieren. Das möchten wir natürlich auch nicht.
Scripte die mit date() arbeiten, werden euren error.log sehr schnell füllen wenn die timezone nicht definiert wurde.
Weitere Informationen zum Thema Sicherheit unter PHP findet man hier: Link