telnet
, wähle bei „Close Windows on Exit“ die Option „Never“ und in den Telnet-Optionen „Telnet Negotiation Mode“ auf „passive“.Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Raspberry Pi als Server
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.
Webserver und PHP installieren
Als Software benötigen wir einen Apache HTTP Server, der die Webseiten ausliefert und PHP für die Generierung dynamischer Webseiten.
- Installiere den Webser apache: Folge hierfür der Anleitung zur Installation eines Webservers (apache) auf dem Pi. Eine weitere Anleitung findest du in Raspberry Pi - Das umfassende Handbuch, Kap. 24.1-24.2.
- Der Server lässt sich mit einem Befehl neu starten. Wie lautet er?
- Der Server legt seine Konfiguration in
/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 Dateiapache2.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.
Webserver im Netz finden
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.
nginx: ein alternativer Webserver
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?
dokuwiki installieren
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
Zugriffsrechte anpassen
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
Installation über den Paketmanager (optional)
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.
Perfomanceoptimierung (optional)
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.
Sicherheit durch TLS-Zertifikate
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
- Wozu wird TLS/SSL benötigt?
- Was ist der Unterschied zwischen SSL und TLS?
- Was ist ein selbst-signiertes Zertifikat?
- Sichere deinen Server mit einem selbst-signierten Zertifikat (einfach) oder einem Zertifikat, das von StartSSL ausgestellt wurde (schwierig, du brauchst eine eigene Domain).
- Mit welchem Befehl lassen sich Webserver mit einer HTTPS-Unterstützung im lokalen Netz finden?
Was ist HTTP und wie funktioniert es?
Video bei archive.org
- Erstelle eine Präsentation zum Thema Hypertext Transfer Protocol (kurz HTTP), die folgende Begriffe erläutert: REQUEST, REQUEST METHOD, GET, POST, PUT, DELETE, HEADER, RESPONSE, RESPONSE CODE
- Führe eine Beispielsitzung durch, z.B mit einem Browser oder einem telnet-client wie putty1), die einen Request und Response zeigt und stelle das Ergebnis in einem Screenshots dar.
Das obige Video zeigt einen Ausschnitt einer solchen Beispielsitzung ohne die Headerinformationen.
Unter Windows muss der telnet-Client aktiviert werden: „Systemsteuerung“ → „Programme“ → „Windows-Funktionen aktivieren oder deaktivieren “. Dort kann ein Haken bei „Telnet-Client“ gesetzt werden. Danach steht er in der Windows-Konsole zur Verfügung. - Visualisiere das Verfahren durch eine eigene Zeichnung.
- Ergänze deine Präsentation um einen eigenen Linktipp.
Analyse der Server-Logdateien
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.
- Wo legt der apache-Webserver die Logdateien ab?
- Welche Arten von Logdateien gibt es beim apache?
- Führe den Befehl
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).
Was macht der Befehltail
?
Welche Bedeutung hat die Option-f
? - Baue nun einen kleinen Fehler bei deinem Mitschüler ein. Öffne dazu die Datei
doku.php
im Verzeichnis des dokuwiki mit einem Texteditor und füge die Zahl123
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. - Schaut euch den Inhalt der anderen Logdateien in
/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. - Du kannst auch selbst in das „system log“ schreiben. Dazu gibt es den Befehl
logger
. Schau dir die zugehörige man-Page an und erstelle einen Logeintrag. In welcher Datei landet dein Eintrag?
Einrichten einer eigenen Domain
Ü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.
- Was ist das Domain Name System (DNS)? Beschreibe kurz und in eigenen Worten, wie DNS funktioniert. Nutze dazu das Diagramm im Abschnitt „Auflösung eines DNS-Requests“.
- Versuche, eine Anfrage an einen DNS-Server mit dem Tool
dig
3) auf der Linux-Kommandozeile nachzuvollziehen:
dig +trace -t A www.tbs1.de
- Melde dich bei dem Dienst
afraid.org
an und suche dir eine Domain aus. - Was sind ein „A-Record“, ein „AAAA-Record“ und ein „MX-Record“ im DNS?4)
- Richte einen Cronjob ein, der in regelmäßigen Abständen den DNS über deine aktuelle IP-Adresse informiert.5)
- Wird der Name korrekt zu der IP-Adresse aufgelöst – es sollte die Adresse der Schule auftauchen? Nutze den Befehl
dig
, um es herauszufinden.6) - (optional) Lege in deinem heimischen Router eine Portweiterleitung an, die alle Anfragen auf Port 80 (HTTP) und 443 (HTTPS) an den Pi weiterleitet. Teste im Anschluss, ob der Pi über die Webadresse erreichbar ist.
Portweiterleitung einrichten
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
.
Fernzugriff über ssh
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.
Tor hidden service
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 Domain generiert. 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.
Backupskript programmieren
Die Daten des Servers sollen nun regelmäßig mit Hilfe eines Bash-Skriptes in einem Backup gesichert werden.
- Lies im Skript Kap. 4.1 „Einführung in die Skriptprogrammierung“ und beantworte die folgenden Fragen.
- Wie sieht die erste Zeile in einem bash-Skript aus? Welche Bedeutung hat der Begriff „shebang“?
- Welche Rechte benötigt ein bash-Skript, damit es korrekt funktioniert?
- Was ist der Unterschied zwischen einfachen (' ') und doppelten („ “) Anführungszeichen im Umgang mit Variablen in Skripten?
- Was steht in der Variablen
$*
? - Welche Ein- und Ausgabekanäle gibt es und was machen sie?
- Wie kann die Ausgabe eines Kommandos umgelenkt werden?
- Was ist eine „Pipe“? Gib eine mögliche Beispielanwendung an.
- Erstelle ein Skript
~/bin/datum.sh
, das bei der Ausführung das aktuelle Datum und die Uhrzeit ausgibt. Rufe es auf und prüfe die Ausgabe. - Erstelle ein Skript
~/bin/tmp-sicherung.sh
, welches das Verzeichnis/tmp
mit Hilfe des Befehlstar
in ein komprimiertes Archiv im Homevezeichnis (~/tmp.tar.gz
) ablegt.
Zusatz: Passe das Skript so an, dass das aktuelle Datum im Dateinamen enthalten ist: z. B.~/2016-03-01-tmp.tar.gz
- Lies Kapitel 7.2 über Datensicherungen im Skript und beantworte die folgenden Fragen.
- Welche Sicherungsarten gibt es?
- Warum ist ein Backup sinnvoll? Wogegen schützt es?
- Welche Daten bzw. Verzeichnisse sollen in die Sicherung des Servers aufgenommen werden? Erstelle eine Liste.
- Erstelle ein Skript
~/bin/sicherung.sh
, das die wichtigen Daten in einer Vollsicherung sichert.7) - Führe das Skript aus und prüfe, ob alle wichtigen Daten in dem Archiv gelandet sind.
- Entpacke das Archiv wieder und prüfe stichprobenartig, ob sich die Dateien gegenüber den Originalen verändert haben.8)
- Erstelle einen Cronjob, der das Skript regelmäßig ausführt. Für welchen Zeitraum hast du dich entschieden und wie hast du ihn als Cronjob umgesetzt?
Backups auf einem externen Medium sichern
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.
- Warum ist es sinnvoll das Backup nicht auf dem Pi zu sichern, sondern auf einem externen Medium?
- Lies Kap. 5.2.2 im Skript. Was macht der Befehl mount? Erkläre die Ausgabe von
mount -l
. - Richte eine Netzwerkfreigabe unter Windows ein. Der Windows-Benutzer muss dafür durch ein Passwort gesichert sein.
- Teste die Freigabe von einem anderen Rechner aus, indem du im Explorer die Adresse
\\IP-ADRESSE\NAME_DER_FREIGABE
aufrufst.
Den Artikel Samba Client cifs werden wir für die folgenden Aufgaben brauchen. Am besten öffnest du ihn in einem separaten Fenster. - Erstelle einen Mountpoint (Einhängepunkt). An dieser Stelle wird die Netzwerkfreigabe später eingehängt. Wenn dir dies nicht gelinkt kannst du
/mnt
als Mountpoint nutzen. - Nutze den
mount
-Befehl, um die Netzwerkfreigabe in dem Mountpoint einzubinden.9) - Trage den Mountpoint in die Datei
/etc/fstab
ein. Wozu ist diese Datei da? Wie kann verhindert werden, dass sensible Zugangsdaten in der für alle lesbaren Dateifstab
abgelegt werden? Probiere es aus. - Prüfe, ob die Einbindung auch nach einem Neustart des Pi funktioniert.
- Passe dein Backupskript so an, dass die Backups fortan auf der eingebundenen Freigabe landen.
- Eine weitere Möglichkeit besteht darin, das Backup bei einem Cloud-Dienst wie z.B. dropbox oder owncloud hochzuladen. Die folgende Anleitung beschreibt dieses Verfahren für dropbox. In dem Handbuch für Owncloud wird das Verfahren für owncloud beschrieben, wobei hier WebDAV als Protokoll zum Einsatz kommt.
Falls du irgendwo nicht weiterkommst, kannst du den Hinweis in der Fußnote nutzen. Hier ist eine Session abgelegt, die das Einbinden verdeutlicht.10)
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.
Systemüberwachung (Monitoring)
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.
- Bearbeitet die folgenden Aufgaben zusammen in einer Gruppe aus 3 oder 4 Personen.
Munin
- Bestimmt einen Raspberry Pi als Munin-Master und die anderen Pis als Munin-Nodes.
- Richtet das Monitoring mit „Munin“ ein.11)
Bei Problemen kann die Seite Munin Troubleshooting weiterhelfen.
smokeping
- Legt ein Monitoring mit „SmokePing“ auf einem Pi an. 12)
- Wählt verschiedene Webseiten (unsere Klassenseite, euren eigenen Pi, eine große bekannte Webseite) oder auch IP-Adressen, die ihr mit smokeping überwachen wollt.
(optional) - Mit der Android-App RasPi Check lässt sich der Pi auch vom Handy aus überwachen, wenn der SSH-Zugang von Außen erreichbar ist. Probiere die App aus, wenn du ein Android-Handy hast.
- Linux Dash ist ein weitere einfache Übersicht über den Status des Servers. Probiere es aus.
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
.Die Fehlermeldung
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.