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.
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.
Letzte Änderung: