Wichtige Vorbemerkung
Dieses Tutorial beschreibt nicht, wie ihr euren VPS / Root (im folgenden der Einfachheit wegen nur VPS genannt) im Allgemeinen absichert (SSH Key Login, Fail2Ban, Port-Whitelisting, etc.), sondern ausschließlich den installierten Webserver!
Vorbereitungen
Verbindet euch mit SSH auf euren VPS und aktualisiert zuerst die Paketquellen
apt-get update
Da ich in diesem Tutorial mit dem Editor nano arbeite, solltet ihr diesen auch installieren, falls nicht schon vorhanden. Wer mit vi etc. arbeiten möchte, kann das natürlich gerne tun und kann folgenden Schritt überspringen
apt-get install nano
Webserver-Software installieren
Nun installieren wir zuerst die Webserver-Software. Ich empfehle an dieser Stelle hier den Apache HTTP Server aufgrund der Stabilität, Geschwindigkeit und der Vielzahl an mitgelieferten / unterstützten Modulen
apt-get install apache2
Bevor wir fortfahren können, müssen wir einen Blick auf das Rechte-Management werfen. Der öffentliche Ordner des Apache Webservers ist /var/www. Hier werden auch später Dateien für die Website abgelegt. Um dort nun alle neu erstellten (= hochgeladenen) Dateien der Verzeichnisgruppe zuzuordnen, ändern wir wie folgt die Rechte
chmod g+s /var/www
Außerdem werden so alle ausführbaren Dateien als Benutzer der Verzeichnisgruppe ausgeführt und nicht als "externer" Benutzer.
Das Verzeichnis muss nun noch les-, schreib- und ausführbar gemacht werden. Hierzu setzen wir die Zugriffsrechte des Verzeichnisses auf rwxrwxr-x. Das bedeutet, dass nur der Besitzer und die Gruppe des Verzeichnisses lesen, schreiben und Dateien ausführen dürfen, alle anderen dürfen nur lesen und ausführen. Wir nutzen bei der Rechtevergabe numerische Werte
chmod 775 /var/www
Zuletzt ändern wir noch den Eigentümer-Benutzer und / -gruppe. Der Benutzer www-data mit der gleichnamigen Gruppe wird damit als Besitzer des Verzeichnisses /var/www mit allen Unterordnern und Dateien (rekursive Anwendung) festgelegt
chown --recursive www-data:www-data /var/www
Ruft nun euren VPS über den Browser auf (Eingabe der IP-Adresse). Ihr solltet nun folgende Ausgabe sehen
PHP installieren
Der Webserver ist jetzt betriebsbereit, also können wir uns nun an die Einrichtung bzw. Konfiguration machen. Zuerst installieren dir PHP der Version 5 und das dazu passende Apache-Modul
apt-get install php5 libapache2-mod-php5
Datenbankverwaltung installieren
Als Datenbankverwaltungssystem nutze ich hier MySQL. Im Folgenden installieren wir den MySQL-Server, den MySQL-Client, das zugehörige MySQL-Paket für PHP und natürlich wieder das entsprechende Apache-Modul
apt-get install mysql-server mysql-client php5-mysql libapache2-mod-auth-mysql
Wir werden während der Installation aufgefordert, ein Passwort für den MySQL-Administrator zu vergeben
Danach solltet ihr den VPS einmal neustarten, damit wirklich alle Änderungen und Aktualisierungen aktiv werden
reboot
phpMyAdmin installieren
Nun installieren wir phpMyAdmin, eine Webanwendung zur Administration von MySQL-Datenbanken
apt-get install phpmyadmin
Ein Installationsassistent führt uns wieder durch die Konfiguration. Zuerst müssen wir einen Wevserver auswählen. Da wir Apache2 installiert haben, setzen wir dort natürlich auch den Haken (Leertaste) und bestätigen mit <Ok> (Tab und Enter)
Danach müssen wir phpMyAdmin mit dem MySQL-Server konfigurieren und wählen dazu in der Aufforderung <Yes>. Nun werden wir aufgefordert, das MySQL-Administratorpasswort einzugeben, welche wir zuvor festgelegt haben
Nun vergeben wir ein Passwort, um uns später in die phpMyAdmin-Webanwendung einloggen zu können. Wählt hier ein starkes Passwort, um Bruteforce-Angriffe zu erschweren
Die Konfiguration ist abgeschlossen. Damit PHP nun auch die MySQL-Erweiterung zuverlässig lädt, tragen wir diese noch in die Konfigurationsdatei php.ini ein. Öffnet die Datei
nano /etc/php5/apache2/php.ini
und trag gleich in die zweite Zeile nach [PHP] folgenden Wert ein
extension=mysql.so
Speichert die Datei (Ctrl + O) und schließt sie wieder (Ctrl + X). Damit die Änderungen wirksam werden, starten wir einmal den Webserver-Service neu
service apache2 restart
Wann immer ihr Änderungen am Webserver betreffend Apache2 vornehmt, reicht ein Neustart des entsprechenden Services. Ihr müsst nicht immer den kompletten VPS rebooten. phpMyAdmin ist nun erreichbar unter
phpMyAdmin Adresspfad ändern
Um es Angreifern zu erschweren, eure phpMyAdmin Webanwendung zu finden, solltet ihr den Adresspfad ändern. Das bedeutet, phpMyAdmin ist nicht mehr unter /phpmyadmin zu erreichen (der Standardpfad) sondern unter einem durch euch zugewiesenen individuellen Pfad. Öffnet hierzu die Konfigurationsdatei von phpmyadmin
nano /etc/phpmyadmin/apache.conf
Gleich in der zweiten Zeile seht ihr den standardmäßigen Aliad-Pfad
Alias /phpmyadmin /usr/share/phpmyadmin
Ändert nun hier /phpmyadmin zu einem anderen Wert um, je ausgefallener, desto besser. Vergesst aber nicht den führenden Slash und achtet darauf, dass das Leerzeichen zwischen eurem Wert und dem phpMyAdmin-Verzeichnis bleibt. Speichert die Datei und startet den Apache-Service neu. phpMyAdmin ist nun unter dem durch euch zugewiesenen Pfad erreichbar.
phpMyAdmin Zugangsschutz verstärken
Wir sind uns einig, dass in der Datenbank wohl die sensiblesten Daten der Website liegen. Sollte also ein Angreifer den phpMyAdmin-Zugang geknackt oder irgendwie bypassed haben, fallen ihm all diese Daten in die Hände. Ich empfehle daher, den Zugangsschutz durch eine weitere Authentifizierung zu erhöhen.
Und zwar richten wir uns eine HTTP-Auth Anmeldebestätigung ein. Wer das nicht möchte, kann diesen Schritt überspringen. Wie gesagt, ich empfehle es dringend! Die HTTP-Auth benötigt .htaccess, daher müssen wir das phpMyAdmin-Verzeichnis dahingehend vorbereiten. Wir öffnen wieder die Konfigurationsdatei
nano /etc/phpmyadmin/apache.conf
und fügen dem Bereich <Directory /usr/share/phpmyadmin> die Anweisung AllowOverride All hinzu
Nun müssen wir die Authentifizierung anlegen. Dazu erstellen wir eine .htaccess-Datei im phpMyAdmin-Verzeichnis
nano /usr/share/phpmyadmin/.htaccess
und tragen folgende Zeilen ein
AuthType Basic
AuthName "Zugang verweigert, bitte anmelden!"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
Die Zeile AuthType Basic beschreibt Methode der Authentifizierung. Basic ist die HTTP-Variante. Den Wert für AuthName könnt ihr natürlich entsprechend anpassen, er erscheint dann in der Anmeldeaufforderung. Die Zeile AuthUserFile /etc/phpmyadmin/.htpasswd definiert den Pfad zur Passwortdatei, auch hier könnt ihr Änderungen vornehmen (den Pfad ändern). Require valid-user legt fest, dass sich nur Benutzer, welche auch in der Passwortdatei stehen, anmelden können.
Speichert die Datei und schließt diese.
Nun erstellen wir unsere Passwortdatei bzw. legen einen Benutzernamen und ein Passwort fest
htpasswd -c /etc/phpmyadmin/.htpasswd Benutzername
Das Modul htpasswd erstellt eine neue Datei (-c) unter dem angegebenen Pfad (dieser muss mit dem in der .htaccess festgelegten Pfad übereinstimmen!) und legt ein Passwort für den angegebenen Benutzernamen fest. Gebt euer gewünschtes Passwort ein und bestätigt es mit Enter. Für jeden weiteren Benutzer könnt ihr den gleichen Befehl nutzen, entfernt aber die Flagge -c. Ansonsten überschreibt ihr jedes Mal die Datei und entfernt bisherige Benutzer.
Startet nun den Apache-Service neu und schaut euch das Ergebnis im Browser an, indem ihr euren Pfad zum phpMyAdmin-Verzeichnis in der Adresszeile aufruft.
mod_rewrite einrichten
mod_rewrite ist ein Apache-Modul zum Manipulieren der URL. So können beispielsweise Mammut-URLs schlanker gestaltet werden oder auch nichtssagende Links "sprechend" dargestellt werden. Letzteres freut insbesonders die Suchmaschinen. Aber auch einen gewissen Sicherheitsaspekt hat das Ganze, da Parameter verschleiert werden können. Allerdings werden dadurch keine Angriffsvektoren verhindert!
Ein Beispiel
vollst. URL domain.com/index.php?page=profile&userid=1337&lang=de&display=true
mod_rewrite domain.com/de/1/profile/1337-b1nary/
Eine festgelegte Regel holt sich nun aus der mod_rewrited URL nach einem deklarierten Muster alle benötigten Informationen. Hierzu bitte an anderer Stelle mehr informieren, hier geht es nun lediglich um die Einrichtung. Das Modul können wir simpel mit dem Befehl
a2enmod rewrite
starten (apache2 enable module rewrite). Leider war's das noch nicht ganz, wir müssen noch eine Änderung vornehmen. Wir bearbeiten zuerst die Datei, um das Modul mod_rewrite zu laden
nano /etc/apache2/mods-enabled/rewrite.load
Wenn diese Datei noch nicht existiert (und dementsprechen neu angelegt wird und leer ist), fügt folgendes ein
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
Ist diese Zeile bereits vorhanden, könnt ihr die Datei wieder unverändert schließen. Wechselt nun in das Verzeichnis für die virtuellen Hosts unter Apache
cd /etc/apache2/sites-available
und lasst euch via
ls
den Verzeichnisinhalt ausgeben. Ihr solltet neben anderen Dateien die Datei default.conf oder 000-default.conf finden, je nachdem evtl. auch sogar ohne Dateiendung. Öffnet die entsprechende, bei euch vorkommende Datei und bearbeitet folgenden Teil
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride none
Order allow,deny
allow from all
</Directory>
indem ihr die Zeile AllowOverride none auf AllowOverride all setzt. Danach startet ihr den Apache-Service neu, um das Modul mod_rewrite zu aktivieren.
Nach Abschluss der gesamten Konfiguration eures VPS als Webserver schadet es nicht, den VPS komplett einmal neuzustarten.