Webserver auf Strato Rootserver einrichten und warten (Debian Ubuntu Server)

Viktor Dite, Autor des Beitrags

Von - Publiziert in Webdevelopment Blog über MySQL & PHP
Dipl. Informatiker und Tech-Blogger seit 2006.


Ich stehe wieder vor der Aufgabe einen neuen Server aufsetzen zu müssen weil zwei bestehende auf einen neuen migriert werden sollen. Da bietet es sich ja mal an, die wichtigen Schritte in einem einzigen Beitrag zusammenzufassen um nichts zu vergessen.

Dieser Beitrag geht von einer nackten Ubuntu 14.04 Lts Server Installation auf einem Strato-RootServer aus. Die meisten Schritte können aber 1:1 auch auf anderen Debian Systemen oder Hostern mit Debian System umsetzen.

Bei der Installation des Ubuntu System ist es wichtig, dass der Parallels Plesk nicht mit installiert wird! Plesk ist die Sicherheitslücke überhaupt!

Für die Einrichtung wird ein SSH Client benötigt. Unter Windows nutze ich gern PuTTY. Ansonsten gibt es diese PuTTY Alternativen.

Sicherheitsvorkehrungen

Die folgenden Sicherheitsvorkehrungen sind sehr wichtig und müssen bei jeder Debian Installation eines Strato-Rootservers unbedingt vorgenommen werden, da sonst echte Sicherheitslücken offen bleiben!

Debian/Ubuntu stets aktuell halten

Als aller erstes muss man unbedingt die neusten Updates einspielen!

apt-get Pakete aktualisieren

apt-get update
apt-get upgrade
apt-get dist-upgrade

ROOT User abschalten

Eine manuelle Debian / Ubuntu Installation verbietet normalerweise von Haus aus den Root User. Jeder User, der Rootrechte braucht ist dann mit dem Befehl sudo in der Lage diese zu erreichen.

Die Installation von Strato bildet das jedoch nicht ab. Deswegen muss man den root User per Hand abschalten.

Zuerst muss man einen neuen User anlegen und ihn in die sudo Gruppe eintragen, damit er später per sudo die root Privilegien beziehen kann.

adduser DeinUsername
adduser DeinUsername sudo

Jetzt noch die Datei /etc/ssh/sshd_config editieren und folgendes ändern

PermitRootLogin yes
  zu
PermitRootLogin no

Jetzt kann sich der Benutzer Root nicht mehr direkt über den SSH-Server am System anmelden.
Sollte eich echter root User mal gebraucht werden (wenn sudo nicht ausreicht), dann kann man jetzt einfach mittels

sudo su

in den Root-Account wechseln.

Ab jetzt führe ich alles unter dem neuen User aus. Dazu also den root ausloggen und sich mit dem neuen User einloggen!

Firewall kontrollieren

Die Firewall lässt sich mit

sudo netstat -tulpen | grep -v '127.0.0.1' 

überprüfen. Hier sollte nur tatsächlich benötigte Ports aufgelistet sein.

Firewall einrichten

Unter Ubuntu wird entweder mit iptables gearbeitet oder mit der etwas einfacheren Variante ufw. Zu ufw existiert eine einfache Anleitung auf dem Ubuntu Helpserver oder bei wpcoder.
Prüfe als erstes mit

sudo ufw status 

ob ufw aktiviert ist. Ist bei der Standard Installation von Strato nicht aktiviert. Bevor Du die Firewall aktivierst, musst Du unbedingt den Port 22 für SSH freigeben, sonst kommst Du nach dem aktivieren nicht mehr per SSH auf den Server!

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw default deny
sudo ufw enable

SSH Port ändern!

Die meisten Bruteforce Atacken laufen auf den Port 22. Hier wäre es sehr sinnvoll den Port zu ändern.

Dazu in der Datei /etc/ssh/sshd_config den Eintrag Port 22 zB. in Port 19345 ändern.

Ganz wichtig! Jetzt muss noch der neue Port in der Firewall freigegeben werden, sonst kommst Du nicht mehr auf die SSH Konsole drauf!
sudo ufw allow 19345

Erst dann kann der SSH Daemon neugestartet werden!

sudo restart ssh

Um sich nun mit einem Terminal wieder anzumelden, musst Du den neuen Port mit -p 19345 angeben. Also bspw. ssh username@111.111.111.20 -p 19345

Jetzt noch schnell den alten 22 Port in der Firewall schließen.

sudo ufw deny 22

Hier mal einen herzlichen Dank an Gabriel

Kontrollieren, ob ein FTP Server aktiv ist

Heutzutage sollte NIEMAND mehr einen FTP Server nutzen. Es gab zu viele Hacks und Man-In-The-Middle Atacken, die Server mit offenen FTP Ports kompromittiert haben. Darum sollte man kontrollieren, ob ein FTP Server läuft, oder nicht.

sudo ps aux | grep [f]tp

Hier sollte jetzt nur ein Prozess auftauchen, nämlich SFTP

Webserver installieren

Apache installieren

Apache2 mit Hilfe von apt-get installieren

sudo apt-get install apache2
sudo apt-get install apache2-utils 

Aktuelle PHP5 Release installieren

Folgendes installiert php5 inklusive allen Abhängigkeiten zum Apache2 Server

sudo apt-get install php5 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-curl

Aktuelle MySQL Release installieren

sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install php5-mysql

Jetzt ist der Server bereits mit einer Standard-Seite unter der jeweiligen IP-Adresse des Servers erreichbar. Jetzt müssen noch diverse Konfigurationen und Sicherheitsmaßnahmen unternommen werden.

Webserver einrichten

Apache einrichten

Die Haupt-Konfigurationsdatei einer aktuellen Apache 2 Installation liegt bei Debian in /etc/apache2/apache2.conf

Sollen virtuelle Hosts aufgebaut werden, dann ist jedes virtuelle Host hier einzeln einzurichten: /etc/apache2/sites-availiable/000-default.conf

Virtuelle Hosts zu Apache hinzufügen

Der Einfachheit halber lässt sich nun hier jeder neue Vserver zusäzlich eintragen, so müssen nämlich nur noch ein paar wenige Zeilen ergänzt werden. Jeder neue VHost wird dann nur noch als

<virtualhost *:80>
  DocumentRoot /var/www/default
</virtualhost>

<virtualhost *:80>
  ServerName meinserver.com
  ServerAlias www.meinserver.com
  DocumentRoot /var/www/meinserver.com/htdocs
  <Directory /var/www/meinserver.com/htdocs>
    Options FollowSymLinks
    AllowOverride FileInfo AuthConfig Limit
    Order allow,deny
    allow from all
  </Directory>
</virtualhost>

<virtualhost *:80>
  ServerName mein-zweiter-server.com
  ServerAlias www.mein-zweiter-server.com
  DocumentRoot /var/www/mein-zweiter-server.com/htdocs
  <Directory /var/www/mein-zweiter-server.com/htdocs>
    Options FollowSymLinks
    AllowOverride FileInfo AuthConfig Limit
    Order allow,deny
    allow from all
  </Directory>
</virtualhost>

Hier werden drei virtuelle Server aufgebaut.
– einer, der nur über die IP erreichbar ist
– einer, der über die Domain meinserver.com erreichbar ist
– einer, der über die Domain mein-zweiter-server.com erreichbar ist

Dazu sollte gesagt werden, dass AllowOverride None die Verwendung einer .htaccess Datei ausschließt. Diese Option sollte man nach seinen Bedürfnissen selbst einstellen, jedoch ein AllowOverride All nach Möglichkeit vermeiden, da es ein Sicherheitsrisiko darstellt! FileInfo reicht z.B. aus um u.A. rewrites und redirects durchzuführen. AuthConfig erlaubt die Anmeldung mittels htpasswd/htaccess. Limit erlaubt die Einschränkung auf einzelnen Files mit bspw.:

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

Das ist u.A. wichtig um einige Files im System vom Zugriff komplett zu schützen. So auch die xmlrpc.php einer WordPress Installation.

Für rewrites muss zudem Options FollowSymLinks aktiviert sein.
Fürs rewrites muss noch zusätzlich das Modul mod_rewrite aktiviert werden:

sudo a2enmod rewrite
service apache2 restart

Mehr zu virtuellen Hosts und der Syntax auf der Apache Help Seite und im Ubuntu Wiki

Weitere Sicherheitsvorkehrungen zu Apache, PHP und MySQL

Viele Angriffe auf Webserver passieren, weil man herausfinden kann, welche Version des Apache und von PHP gerade auf den Server läuft. Bots grasen gezielt nach Servern ab, die in einer bestimmten Version verwundbar sind und greifen dann ganz gezielt die bekannte Schwachstelle an. Die folgenden Schritte stammen teilweise von Gabriel

Es ist also sehr wichtig, so wenig Informationen wie möglich nach Außen hin sichtbar zu machen.

Apache2 Webserver-Version verstecken.

Die Datei /etc/apache2/apache2.conf öffnen. Bis ans Ende der Config-File springen und folgendes eingeben:

ServerSignature Off
ServerTokens Prod

PHP-Version unterdrücken.

Öffnen nun mit einem Editor die Datei /etc/php5/apache2/php.ini und suche den Eintrag „expose_php On“. Ersetze nun On durch Off.

expose_php Off

PHPInfo deaktivieren.

In der selben Datei den Eintrag „disable_functions“ aufsuchen.
Nun folgendes eintragen: disable_functions = phpinfo, weitere Funktionen die deaktiviert werden sollen. Anschließend den Webserver neustarten.

disable_functions = phpinfo

Apache gegen DDoS Attacken sichern

Ein beliebtes Mittel einen Server lahmzulegen sind DDoS Attacken (Verteilte Dienstblockade oder Distributed Denial of Service). Dagegen kann man ein paar Vorkehrungen

MySQL einrichten

Um die folgenden Befehle auszuführen musst Du Dich mit

mysql -uroot -p

an MySQL mit den Logindaten, die Du bei der Installation gewählt hast anmelden..

Neuen MySQL User anlegen

CREATE USER 'DeinNeuerBenutzer'@'localhost' IDENTIFIED BY 'DasPassword';

Die Ausgabe sollte in etwas wie folgt lauten: Query OK, 0 rows affected (0.00 sec)

Der User hat jetzt noch gar keine Rechte. Du musst ihm Rechte für die notwendigen Datenbanken einräumen:

MySQL User Rechte für Datenbank zuweisen

GRANT ALL PRIVILEGES ON DeineDatenbank.* TO 'DeinNeuerBenutzer'@'localhost';

Jetzt bekommt der User DeinNeuerBenutzer den kompletten Zugriff auf die DeineDatenbank mit allen Tabellen (deswegen das .*)

Ausführliche Details dazu hier:
www.digitalocean.com/how-to-create-a-new-user-and-grant-permissions-in-mysql

MemCached einrichten

MemCached Installieren

sudo apt-get install memcached php5-memcached

MemCached konfigurieren

sudo vim /etc/memcached.conf

Dort solltest Du

  • den Default Port 11211 auf einen von Dir festgelegten Port ändern. Die Variable dazu ist „-p“
  • den Speicherlimit an Deinen Server anpassen „-m“. Per Default sind 64 MB eingestellt. Die meisten Stratoserver haben weniger. Du solltest darauf achten, noch genügend freien Speicher für die anderen Anwendungen zu lassen. Memcached krallt sich sonst alles was es kriegen kann.

Webserver neustarten

/etc/init.d/apache2 restart

Sind wir jetzt fertig?

Nein, ein Serverbetreiber ist eigentlich niemals fertig und muss ständig nach seinen Schäfchen schauen. Man kann den Aufwand jedoch noch etwas reduzieren, in dem man allen Empfehlungen von Sergej Müller folgt. Besonders einem Beitrag auf Google+, in dem alle wichtigen „Pro“ Schritte, die hier nicht behandelt werden zusammengefasst sind

Eines der wichtigen Dinge ist bspw. Fail2Ban

Debian stets aktuell halten

Nun jede Woche einmal checken, was es neues gibt und Das System upgraden. Am besten sich auch ein Ubuntu/Debian Security Patch Ticker abonnieren. Manche Sicherheitspatches sollten umgehend eingespielt werden.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Und das ganze am besten automatisch

Dazu muss man einen Crontab Eintrag beim root user machen

sudo su
crontab -e

dann mit dem Editor der Wahl folgenden Eintrag einbinden

0 3 * * * apt-get update && apt-get upgrade

Also jede Nacht um 3:00 apt-get update && apt-get upgrade ausführen

Edit: In den automatischen Updates lasse ich absichtlich die dist-upgrades aus, da hier die Gefahr zu groß ist, dass nach dem Update entweder ein Neustart des Systems oder aber eine manuelle Anpassung notwendig wird, ohne die der Server bspw. keine Webanwendungen mehr ausliefert o.Ä. Ihr müsst euch also einen festen Zeitpunkt einplanen – z.B. zwei Mal im Monat – und die dist-upgrades manuell ausführen. Danke Bernd für den Hinweis in den Kommentaren, dass diese wichtige Info hier noch gefehlt hat.

Disclaim

Dieser Beitrag ist nicht als eine Schritt für Schritt Anleitung zu verstehen, nach der garantiert werden kann, dass der Webserver nicht mehr angegriffen werden kann. Es ist vielmehr eine Sammlung von Gedankenstützen, die man bei der Einrichtung auf keinen Fall vergessen sollte.

Ich übernehme für die Korrektheit (der Umsetzung), die Sicherheit und die Fehlbedienung keine Gewähr.

Kleiner Hinweis: Dieser Beitrag ist evt. noch nicht vollständig und befindet sich noch im Aufbau. Du kannst gerne mit einem Tipp Teil des Beitrags werden!

Letzte Änderung: