telnet
, wähle bei „Close Windows on Exit“ die Option „Never“ und in den Telnet-Optionen „Telnet Negotiation Mode“ auf „passive“.Als Hardwaregrundlage benötigt ihr einen Raspberry Pi. Dieser wird mit einer SD-Karte für das Betriebssystem, einem USB-Kabel für den Strom und einem Ethernetkabel für das Internet ausgestattet. Als Betriebssystem kommt Raspian zum Einsatz.
Warnung! Ihr werdet für die nächsten Aufgaben vermutlich an vielen Stellen im Internet recherchieren. Kopiert keine Texte einfach so von einer Webseite in ein Konsolenfenster. Dadurch kann Schadcode in den Zwischenspeicher gelangen, den man so nicht sieht. Ein Beispiel verdeutlicht die Gefahr.
Als Software benötigen wir einen Apache HTTP Server, der die Webseiten ausliefert und PHP für die Generierung dynamischer Webseiten.
/etc/apache2
ab. Erläutere die Bedeutung der folgenden Verzeichnisse, die sich unter /etc/apache2
befinden: conf-available, conf-enabled, mods-available, mods-enabled, sites-available, sites-enable
. Schau dazu in den Erklärungen in der Datei apache2.conf
und der Paketdokumentation unter /usr/share/doc/apache2
nach.Du kannst auch probieren, einen eigenen Webserver zu programmieren. So schwierig ist es gar nicht.
Um heraus zu finden, welche Webserver auf Port 80 im Netz 192.168.42.0/24 laufen, kann nmap genutzt werden.
nmap --open -p 80 192.168.42.0/24
Auch mit scapy und Python können Netze auf unterschiedliche Arten untersucht werden. Der Artikel Port Scanning using Scapy erläutert das Vorgehen mit unterschiedlichen Ansätzen wie TCP-connect, TCP-stealth, XMAS-scan, FIN-scan, NULL-scan und weiteren.
Neben apache gibt es noch viele weitere Webserver. nginx ist ein Beispiel für einen weiteren Webserver. Kannst du den apache stoppen und die Arbeit von einem nginx
übernehmen lassen?
Sobald der Webserver und PHP installiert sind, kann dokuwiki installiert werden. Hierbei handelt es sich um eine Wiki-Software. Der Prozess ist in der Installationsanleitung für dokuwiki beschrieben.
Für den Download könnt ihr wget benutzen oder euch mit einer Remotedesktopverbindung auf den Pi verbinden und dort einen Browser starten.
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
Damit der Webserver auf die Dateien zugreifen kann, müssen die Dateien für den Benutzer www-data
zugreifbar sein. Ich gehe hier von einer Installation im Verzeichnis /var/www/dokuwiki
aus. Mit chown wird der Benutzer für alle Dateien auf pi
und die Gruppe auf www-data
geändert. Der Parameter -R
wendet dies rekursiv auch auf Unterverzeichnisse an.
sudo chown -R pi:www-data /var/www/dokuwiki
Nun erhält die Gruppe mit chmod jeweils Schreibrechte auf die Dateien.
chmod -R g+w /var/www/dokuwiki
Dokuwiki kann auch über den Paketmanager mit apt-get install
installiert werden. Bei dieser Variante werden neue Versionen stets automatisch über den Paketmanager installiert. In diesem Falle ist die Konfiguration jedoch etwas komplizierter und man sollte die Hinweise in /usr/share/doc/dokuwiki
beachten.
Die Konfigurationsdateien landen in /etc/dokuwiki
. Die Einstellungen für den Apache lassen standardmäßig nur Zugriffe von localhost
zu. Dies kann durch eine Anpassung in den Einstellungen mit Allow from all
erweitert werden, so dass der Zugriff auch von anderen Seiten möglich ist.
Mit dem apc-Modul (Alternative PHP Cache) können bereits geladene Seiten gecached werden. Dies beschleunigt deren Auslieferung und kann die Zugriffe auf einem Pi deutlich beschleunigen.
Damit ein verschlüsselter Zugriff auf den Pi auch über HTTPS erfolgen kann, wird ein SSL- bzw. TLS-Zertifikat benötigt, das auf dem Pi installiert werden muss – TLS steht für Transport Layer Security. Die Geschichte „Wenn der Postbote zweimal klingtelt“ erklärt das Verfahren des Schlüsselaustausches anschaulich. Das Elektronik Kompendium enthält technische Details des Protokolls.
Sehr einfach lässt sich die eigene Webseite mit selbst-signierten Zertifikaten absichern. In diesem Fall beschwert sich der Browser jedoch beim Aufrufen der Webseite, da er den Aussteller des Zertifikates nicht kennt. Die Verbindung ist trotzdem verschlüsselt. Das Verfahren wird in der Paketdokumentation von apache beschrieben. Sie liegt in der Datei /usr/share/doc/apache2/README.Debian.gz
. Es ist eine mit gzip komprimierte Textdatei, die mit zless
gelesen werden kann. Lies dort den Abschnitt zu SSL. Eine weitere Anleitung findest du in Raspberry Pi - Das umfassende Handbuch, Kap. 24.3.
Die Anleitung von heise security beschreibt das Verfahren für vertrauenswürdige Zertifikate, die von der Firma StartSSL ausgestellt werden. Diese sind dem Browser bekannt und es kommt zu keinen Warnungen im Browser.
Wenn alles korrekt eingerichtet wurde, kannst du den Pi anschließend über https://meine.eigene.ip.adresse/
erreichen.
Aufgaben
Video bei archive.org
Bei Problemen hilft häufig ein Blick in die Logdateien eines Dienstes. Wir wollen für unseren Webserver exemplarisch dessen Logdateien untersuchen. Hierfür hilft das Programm tail
, welches das Ende einer Datei anzeigt. Mit less
oder einem Editor wie nano
oder vim
lassen sich Textdateien ebenso anzeigen. Mit Hilfe des grep-Befehls kann in einer Datei gesucht werden.
tail -f /var/log/apache2/access.log
aus und rufe dann eine Seite mit einem Webbrowser auf. Interpretiere die Ausgabe und beschreibe den Aufbau einer Zeile2). tail
? -f
?doku.php
im Verzeichnis des dokuwiki mit einem Texteditor und füge die Zahl 123
in eine leere Zeile ein. Rufe nun die Seite mit einem Browser auf. Versucht gemeinsam den Fehler in der Logdatei am Ende zu finden. Tipp: Schaut in der Logdatei, die Fehlermeldungen enthält./var/log
an und stellt Vermutungen über deren Herkunft an. Erstellt eine Tabelle mit den Spalten „Name der Logdatei“ und „Inhalt“ für 3 selbst gewählte Logdateien. logger
. Schau dir die zugehörige man-Page an und erstelle einen Logeintrag. In welcher Datei landet dein Eintrag?
Über den Dienst afraid.org kann man sich kostenlos eine Webadresse zulegen, die fortan auf die IP-Adresse des heimischen Routers, an dem der Pi angeschlossen ist, verweisen soll. Da man zu Hause gewöhnlich alle 24 Stunden eine neue IP-Adresse zugewiesen bekommt, muss man dem DNS-Server von afraid.org über einen curl-Aufruf die neue IP-Adresse mitteilen. Damit dies regelmäßig erfolgt, legt man am besten einen cronjob dafür an.
dig
3) auf der Linux-Kommandozeile nachzuvollziehen:dig +trace -t A www.tbs1.de
afraid.org
an und suche dir eine Domain aus.dig
, um es herauszufinden.6)Nun muss der Router Anfragen an den Pi auch korrekt an diesen durchstellen. Daher muss eine Portweiterleitung in dem Router so konfiguriert werden, dass die Ports 80 für HTTP und 443 für HTTPS an den Pi weitergeleitet werden. Beachte dazu die Bedienungsanleitung deines Routers.
((Internet)) -- [Router] -- [Pi] Portweiterleitungen: 80..........80 (http) 443.........443 (https)
Hinweis: Eine Liste mit vielen Diensten und den Ports, auf denen sie laufen, findest du in der Datei /etc/services
.
Um über das Internet auf den Pi zugreifen zu können, muss ein Port im Router auf Port 22 des Pi weitergeleitet werden. Auf Port 22 läuft der ssh-Dienst. Um es Angreifern schwerer zu machen, kann auch ein anderer hoher Port im Router (z.B. Port 50022) auf Port 22 am Pi weitergeleitet werden.
((Internet)) -- [Router] -- [Pi] Portweiterleitungen: 50022.......22 (ssh) 80..........80 (http) 443.........443 (https)
Wenn alles korrekt eingerichtet wurde, sind der Webserver und der ssh-Dienst des Pi über über die URL erreichbar.
Der Webserver kann auch als Tor Hidden Service zugänglich gemacht werden. Dafür ist keine eigene Domain nötig, sondern es wird automatisch eine .onion
-Domain generiert. Dies klappt auch hinter einem Router ohne Port-Weiterleitungen.
Unter Raspian gibt es das Paket tor
, das für diese Zwecke genutzt werden kann. Webseiten können anschließend mit dem Tor Browser geöffnet werden. Generelle Information zu einem Tor Hidden Service stehen auf deutsch im Privacy Handbuch.
Ist der hidden service eingerichtet, so muss noch eine Änderung in der ssh-Konfiguration getätigt werden, um auf Dienst zugreifen zu können. Dazu wird folgender Eintrag in ~/.ssh/config
ergänzt:
Host *.onion ProxyCommand /bin/nc -xlocalhost:9050 -X5 %h %p
So werden alle Adressen, die auf .onion
enden, über einen Proxy mit netcat geleitet und der Pi ist mit ssh pi@XXXXXXX.onion
erreichbar. Damit dies funktioniert, muss Tor als Dienst auch auf dem lokalen Rechner laufen.7)
Wenn man sich die kryptische Adresse nicht merken will, kann sie auch in der ssh-Konfiguration abgelegt werden.
Host meinpi Hostname XXXXXXXXX.onion User pi ProxyCommand /bin/nc -xlocalhost:9050 -X5 %h %p
Dann ist der Aufruf mit ssh pi@meinpi
deutlich einfacher.
Die Daten des Servers sollen nun regelmäßig mit Hilfe eines Bash-Skriptes in einem Backup gesichert werden.
$*
?~/bin/datum.sh
, das bei der Ausführung das aktuelle Datum und die Uhrzeit ausgibt. Rufe es auf und prüfe die Ausgabe.~/bin/tmp-sicherung.sh
, welches das Verzeichnis /tmp
mit Hilfe des Befehls tar
in ein komprimiertes Archiv im Homevezeichnis (~/tmp.tar.gz
) ablegt. ~/2016-03-01-tmp.tar.gz
~/bin/sicherung.sh
, das die wichtigen Daten in einer Vollsicherung sichert.8)Derzeit landen die Backups noch auf dem Raspberry Pi. Nun wollen wir dafür sorgen, dass sie auch auf einem externen Medium gesichert werden. Dies können eine externe Festplatte, ein USB-Stick, eine Netzwerk-Freigabe sein oder auch Cloud-Dienst sein.
mount -l
.\\IP-ADRESSE\NAME_DER_FREIGABE
aufrufst. /mnt
als Mountpoint nutzen. mount
-Befehl, um die Netzwerkfreigabe in dem Mountpoint einzubinden.10)/etc/fstab
ein. Wozu ist diese Datei da? Wie kann verhindert werden, dass sensible Zugangsdaten in der für alle lesbaren Datei fstab
abgelegt werden? Probiere es aus.Falls du irgendwo nicht weiterkommst, kannst du den Hinweis in der Fußnote nutzen. Hier ist eine Session abgelegt, die das Einbinden verdeutlicht.11)
Weitere Möglichkeiten ergeben sich durch inkrementelle und differentielle Backups. Der Parameter -g
von tar
hilft hierbei weiter. Noch komfortabler geht es mit den beiden Tools rsync
und rsnapshot
. Der Vortrag Sicheres Backup, rsync, ssh und LUKS im Team von Richard Albrecht aus dem Jahr 2016 stellt die unterschiedlichen Möglichkeiten ausführlich vor.
Unser Server läuft im Regelfall ohne Probleme und liefert die Webseiten und das Wiki aus. Nun kann es jedoch passieren, dass durch Probleme im Netz, der Software oder der Hardware der Server nicht mehr erreichbar ist. Wenn das passiert, wollen wir schnell davon erfahren, um reagieren zu können – noch bevor Nutzer dies merken. Daher soll der Server nun durch einen Monitordienst von einem anderen Rechner überwacht werden.
Für die folgenden Aufgaben benötigt ihr die Anleitung (aus Raspberry Pi - Das umfassende Handbuch, Kap. 35) zur Einrichtung von Munin und smokeping.
telnet
, wähle bei „Close Windows on Exit“ die Option „Never“ und in den Telnet-Optionen „Telnet Negotiation Mode“ auf „passive“.dnsutils
installieren.curl
- oder wget
-Skripte für diesen Zweck.nslookup
für diese Zweck.tar
-Archiven nicht mehr kennst, hilft ein Blick in Kap. 7.1 des Skriptes.diff
kann hierbei weiterhelfen.mount.cifs //IP-ADRESSE/freigabe /mein/mount/punkt -o username=USERNAME,password=PASSWORT
IE11WIN7
, einem Nutzer IEUser
und dem Passwort Passw0rd!
aus.
## Freigabe manuell einbinden bakera@ubu:~$ sudo mount.cifs //IE11WIN7/Users/IEUser/Desktop/Freigabe /mnt/ -o user=IEUser Password for IEUser@//IE11WIN7/Users/IEUser/Desktop/Freigabe: ********* ## Dateien in der Freigabe anlegen bakera@ubu:~$ date > /mnt/datum.txt bash: /mnt/datum.txt: Keine Berechtigung bakera@ubu:~$ ls -dl /mnt/ drwxr-xr-x 2 root root 0 Mär 6 08:52 /mnt/ bakera@ubu:~$ sudo touch /mnt/a.txt bakera@ubu:~$ sudo su root@ubu:/home/bakera# date > /mnt/datum.txt root@ubu:/home/bakera# cat /mnt/datum.txt So 6. Mär 09:03:43 CET 2016 root@ubu:/home/bakera# exit bakera@ubu:~$ sudo umount /mnt ## fstab anpassen bakera@ubu:~$ cd /etc/ bakera@ubu:/etc$ sudo vim fstab bakera@ubu:/etc$ cat /etc/fstab # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda1 during installation UUID=02896ffe-fb0f-4c8e-b396-beaa13bf79f5 / ext4 errors=remount-ro 0 1 # swap was on /dev/sda5 during installation UUID=1247dedb-72a5-4053-9042-43bdb7617db5 none swap sw 0 0 //IE11WIN7/Users/IEUser/Desktop/Freigabe /mnt cifs rw,user,credentials=/etc/win_freigabe_cred.txt bakera@ubu:/etc$ mount /mnt/ error 2 (No such file or directory) opening credential file /etc/win_freigabe_cred.txt ## Datei mit Zugangsdaten (englisch 'credentials') anlegen bakera@ubu:/etc$ sudo vim /etc/win_freigabe_cred.txt bakera@ubu:/etc$ cat /etc/win_freigabe_cred.txt username=IEUser password=Passw0rd! bakera@ubu:/etc$ ls -l win_freigabe_cred.txt -rw-r--r-- 1 root root 36 Mär 6 09:11 win_freigabe_cred.txt bakera@ubu:/etc$ sudo chmod 600 win_freigabe_cred.txt bakera@ubu:/etc$ ls -l win_freigabe_cred.txt -rw------- 1 root root 36 Mär 6 09:11 win_freigabe_cred.txt bakera@ubu:/etc$ sudo chown bakera:bakera win_freigabe_cred.txt bakera@ubu:/etc$ ls -l win_freigabe_cred.txt -rw------- 1 bakera bakera 36 Mär 6 09:11 win_freigabe_cred.txt bakera@ubu:/etc$ mount /mnt/ bakera@ubu:/etc$ ls -l /mnt/ insgesamt 1 -rwxr-xr-x 1 bakera bakera 0 Mär 6 09:03 a.txt -rwxr-xr-x 1 bakera bakera 29 Mär 6 09:03 datum.txt bakera@ubu:/etc$ ls -ld /mnt/ drwxr-xr-x 2 bakera bakera 0 Mär 6 09:03 /mnt/
munin-node
installiert sein. Die folgenden Befehle führen auf einem frischen Ubuntu 16.04 zur Einrichtung eines munin-masters:
Paketquellen aktualisieren und Webserver installieren.# apt-get update && apt-get install apache2 && service apache2 startDas munin-node-Paket installieren und den Dienst starten.
# apt-get install munin-node && service munin-node startTesten, ob der node funktioniert.
# apt-get install telnet # telnet localhost 4949Nach der Verbindung mit telnet sollte der node auf die Befehle
version
oder list
reagieren. Nun kann munin installiert werden.
# apt-get install munin # service apache2 restartZugriff von außen zulassen. Dazu 'Require local' durch 'Require all granted' ersetzen
# nano /etc/munin/apache24.conf # service apache2 restart5 Minuten auf den nächsten Lauf des Cronjobs warten oder selbst anstoßen:
# su - munin --shell=/bin/bash munin-cron
/etc/apache2/conf-available/smokeping.conf
gibt, muss diese mit einem symbolischen Link nach /etc/smokeping/apache2.conf
angelegt und mit a2enconf
aktiviert werden:ln -s /etc/smokeping/apache2.conf /etc/apache2/conf-available/smokeping.conf
dann a2enconf smokeping
.client denied by server configuration: /usr/lib/cgi-bin/smokeping.cgi
deutet auf ein fehlendes CGI-Modul im apache hin. Es kann mit a2enmod cgi
aktiviert werden.