Übungen für die Selbstlernwoche
- Raspberry Pi
- Zusatz:
- Routing
- Voraussetzungen:
- IP-Konfiguration
- Routing
- DHCP
- VPN
- Hinweis zu Online-Tutorials
- VPN-Server ("Client-Zwei")
- VPN-Client ("Client-Eins")
- Zwischenergebnis
- SSH-Rechte
- Bridging
- Container Grundlagen
- UID/GID Mappings
Raspberry Pi
Diese Übung erfordert:
- Zugang zu einem Raspberry-Pi
- Die Möglichkeit, die SD-Karte in einem Linux-PC zu nutzen
(ein Hyper-V-Rechner hat keinen Slot für SD-Karten)
Setzt ein Raspberry-Pi-System mit SSH-Login auf, ohne Bildschirm und Tastatur an den Raspi anzuschließen.
- Die meisten Raspberry-Pi-Systeme erfordern eine Interaktive konfiguration. Dies ist in vielen Umgebungen aber sehr unpraktisch.
- Alle konfigurationseinstellungen müssen also offline auf der SD-Karte durchgeführt werden.
Zusatz:
Versucht die SD-Karte vom PC aus via chroot zu bedienen.
→ Ein PC mit x86er Instruktionssatz kann die ARM-Applikationen auf der SD-Karte nicht ausführen
Das Debian-Paket qemu-user-static enthält eine reihe von Emulatoren mit denen Architekturfremde Binaries ausgeführt werden können. Der Ausführungsmechanismus ähnelt dem eines Python-Scriptes: Die Programmdatei wird normal aufgerufen und das System wählt automatisch den passenden Interpreter.
Kopiert den ARM-Emulator aus der quemu-Suite auf die SD-Karte. Ein chroot sollte nun normal möglich sein.
Routing
Ein Linux-Router soll zwei Rechner miteinander Verbinden.
Voraussetzungen:
Es braucht drei Virtuelle Rechner in zwei Netzwerken
Erstellt zwei private Switches in Hyper-V: SW-Eins und SW-Zwei
- Private Switches sind nicht mit dem Host-System verbunden und ermöglichen nur die Kommunikation zwischen den angebundenen VMs
Erstellt eine VM "Router" mit zwei Netzwerkkarten
- "Router" ist damit sowohl an "SW-Eins" als auch "SW-Zwei" angebunden
- Erstellt eine VM "Client-Eins" die nur an "SW-Eins" angebunden ist
- Erstellt eine VM "CLient-Zwei" die nur an "SW-Zwei" angebunden ist
→ Beide Client-Rechner haben einen Layer-2-Link zum Router, aber nicht zueinander.
Hinweis: Da die Netzwerke nicht ans Internet angebunden sind, muss die Systeminstallation auf anderem Wege erfolgen. Die Live-DVD eignet sich als System für die Client-Rechner.
IP-Konfiguration
Setzt IP-Adressen auf allen drei Rechnern.
- Nutzt ntürlich zwei verschiedene Netze
- Nutzt das
ip-Kommando zum setzen der Adresse
→ Die Clients können den Router pingen. Der Router kann Pings an beide Clients absetzen.
Zusatz:
Alle Rechner sollten per Default mit fe80:-Adressen online kommen.
setzt von den Clients aus einen Ping an die
fe80-Adresse des Routers ab→ dies sollte ohne Probleme gehen
setzt vom Router aus einen Ping an "Client-Eins" und "Client-Zwei" ab
→ Hoppla! ;-) Hier gibt es etwas zu recherchieren.
Routing
Der Router soll Pakete zwischen beiden Rechnern vermitteln.
Der Router kennt bereits beide Netze. Hier ist kaum Konfguration erforderlich. Es muss lediglich die Routing-Funktion des Linux-Kernels aktiviert werden.
Auf den Clients braucht keine Routing-Funktion aktiviert werden, sie sollen ja nicht vermitteln. In der Rounting-Tabelle der CLients müssen aber Netze und Gateway eingetragen werden.
Benutzt traceroute oder mtr um zu sehen, wie sich die Route verhält, wenn die IP-Vermittlung auf dem Router aus- und eingeschaltet wird.
Ergebnis:
→ Die Client-Rechner können sich direkt per IP-Adresse gegenseitig anpingen
DHCP
Richtet dnsmasq auf dem Router ein um DHCP-Adressen an die beiden Netze zu vergeben.
- Achtet darauf, dass die Client-Rechner keine statische Konfiguration benutzen. Die Live-DVD eignet sich als System für die Clients.
- Die Interfaces am Router müssen statisch konfiguriert sein.
- alle Command-Line-Optionen, die in der man-Page von
dnsmasqbeschrieben sind, sind auch Optionen in/etc/dnsmasq.conf - Achtet darauf, dass das Routing nach dem Reboot aller Rechner sofort funktioniert.
Zusatz
Konfiguriert auf dem Router die IPv6-Netze fc00:dead:cafe:: und fc00:beef:cace::. Die clients sollen automatisch Netz- und Routing-Informationen für IPv6 erhalten. Hierzu wird auf dem Router der radvd (Routing Advertising Daemon) benötigt (oder vielleicht reichen auch die RA-Funktionen vom dnsmasq).
VPN
Diese Übung setzt das Netzwerk-Routing wie in der vorherigen Aufgabe voraus. Sie kann aber auch zwischen zwei anderen Netzwerken durchgeführt werden.
"Client-Eins" soll in das Netzwerk von "Client-Zwei" tunneln. "Client-Zwei" dient dabei als VPN-Server und damit Endpunkt für den Tunnel. Als VPN-Lösung kommt SSH zum Einsatz.
Für den VPN-Tunnel werden auf Client und Server virtuelle Netzwerkgeräte angelegt. Dazu sind auf beiden Rechnern Root-Rechte nötig. Der SSH-Login muss deshalb auch zunächts mit Root-Rechten erfolgen. Nachträglich lassen sich die Rechte dann weiter einschränken.
Hinweis zu Online-Tutorials
SSH unterstützt neben vollwertigen VPNs auch das Weiterleiten einzelner TCP-Ports und das Einrichten eines Socks-Proxys. Beides hat mit dieser Übung nicht zu tun. Viele "VPN"-Tutorials im Internet beziehen sich jedoch fälschlicherweise auf diese Techniken.
VPN-Server ("Client-Zwei")
- SSH installieren
- In
/etc/ssh/sshd_configmuss die Option "PermitTunnel" aktiviert sein - In
/root/.ssh/authorized_keysmuss ein Zugangskey für den Client hinterlegt sein.
VPN-Client ("Client-Eins")
Der SSH-Client wird als Root-User gestartet.
- Der Private-Key für den SSH-Login liegt deshalb entweder unterhalb von
/root/.ssh/oder muss beim Aufruf vonsshmit der Option-iangegeben werden.
- Der Private-Key für den SSH-Login liegt deshalb entweder unterhalb von
Testet den SSH-Zugang (von root zu root)
root@client~# ssh -i private_key root@serverStellt sicher das der SSH-Zugang getestet ist
Seriously! Wenn die SSH-Verbindung schon nicht funktioniert, kann der Rest auch nicht funktionieren
root@client~# ssh -i private_key -o Tunnel=ethernet -w any root@server
Zwischenergebnis
Auf Server und Client entsteht jeweils ein unkonfiguriertes Netzwerkinterface "tap0". Dieses kann manuell mit einer IP-Adresse versehen werden. Server und client sollen sich dann gegenseitig anpingen können.
Der VPN-Client hat damit noch keinen Zugriff auf das Netzwerk des Servers.
Stattdessen ist das TAP-Interface des Servers vollständig von dem Netz auf
eth0 entkoppelt.
SSH-Rechte
Die VPN-Clients sollen natürlich keine Root-Shell auf dem Server bekommen. Lest den Absatz "AUTHORIZED_KEYS FILE FORMAT" in der man-Page zu sshd. Konfiguriert den die Key-Einträge am Server so, dass VPN-Clients das TAP-Device einrichten können, aber keine Shell kriegen.
Bridging
Das VPN-Interface tap0 soll auf das Netzwerk von eth0 "gebridged" werden.
D.H. beide Interfaces sollen sich so verhalten, als wären sie an einen
gemeinsamen Switch angeschlossen. Dies ermöglicht es dem VPN-Client,
DHCP-Adressen aus dem Host-Netz des Servers zu beziehen und alle Rechner dort zu
erreichen.
- Installiert
bridge-utilsauf dem Server - Legt mittels
brctlein neues Bridge-Interfacebr0an - Fügt
eth0der Bridge hinzu - Entfernt alle IP-Adressen von
eth0(tut dies nicht via SSH, denn der Rechner ist dann offline) Bezieht DHCP auf
br0- Baut dann den SSH-Tunnel auf (alle bestehenden Tunnel wurden im Vorherigen schritt unterbrochen)
- Fügt das
tap-Interface der Bridge hinzu
- → Auf der Client-Maschine: Bezieht DHCP auf
tap0
→ Das Bridging von VPN-Interfaces und Netzwerkkarte erlaubt dem Server die
VPN-Clients direkt ins Hostnetzwerk einzubringen. Die Reale Netzwerkkarte wird
dabei der Bridge unterstellt. Alle IP-Kommunikation des Hosts läuft dann über
br0 während eth0 nur noch die zugeordnete Hardware-Schnittstelle ist.
Erinnert euch in diesem Zusammenhang auch an das Verhalten von Hyper-V unter Windows: Beim Anlegen eines "Externen" Hyper-V-Switches geht das Windows-Netzwerk-Interface verloren (wird Hyper-V unterstellt) und der Windows-Host muss selbst mit einem virtuellen Interface weiterarbeiten. Dies entspricht exakt dem Bridging-Verhalten, das wir auch hier beobachten.
Container Grundlagen
Diese Übung geht deutlich über den Umfang der LPIC-1 hinaus. Container bzw. Namespaces spielen aber eine zentrale Rolle im praktischen Alltag in Rechenzentren. Während in der Praxis oft hochabstrahierte Systeme eingesetzt werden geht es hier um den technischen Unterbau.
Das Basiskommando unshare startet eine Shell in einem neuen "Namespace". Durch Parameter kann ausgewählt werden, welche Namespace-Trennungen durchgeführt werden.
Alle Übungen in diesem Absatz laufen ohne Root-Rechte
Startet eine Shell, in der ihr laut
whoamioderiddie UID 0 habt.- Welchen Besitzer haben Dateien in eurem Heimverzeichnis?
- Welchen Besitzer hat das Verzeichnis
/etc? - Versucht das Verzeichnis
/rootzu lesen. - Welchen Besitzer haben Dateien die im Unshare-Kontext erstellt wurden?
Startet eine Shell, die laut
echo $$die PID 1 eins hat.- Was zeigt der
pstreein der Shell an? - Welche PID hat die Shell "wirklich" (in einer Prozessliste außerhalb von Unshare)?
- Was zeigt der
entpackt das Archiv alpine-minirootfs-3.24.0-x86_64.tar.gz in eurem Heimverzeichnis (Andere Varianten).
chrooted in das entstandene Root-Filesystem- Zum Vergleich:
chrootkann außerhalb von Unshare nicht von einem unprivilgierten User durchgeführt werden - legt in der Chroot-Umgebung neue Benutzer an
- versucht via
sudie Identität der neuen Alpine-Nutzer anzunehmen
- Zum Vergleich:
Letzteres sollte an diesem Punkt noch nicht möglich sein, denn innerhalb des Unshare-Kontextes gibt es im Moment keine UID außer 0.
UID/GID Mappings
Die Dateien /etc/subuid und /etc/subgid enthalten zusätzliche UIDs/GIDs, die ein unprivilegierter Benutzer annehmen darf. Die IDs liegen idR. im Sechs- bis Siebenstelligen Zahlenbereich, so dass sie sich mit den 2^16 UIDs klassischer Unix-Systeme nicht überschneiden.
Diese Übung muss z.T. wieder mit (echten) Root-Rechten vorbereitet werden. Der Unshare-Kontext selbst soll am Ende aber unprivilegiert laufen.
Stellt sicher, dass euer Benutzer über eine ausreichende Menge an SubUIDs und -GIDs verfügt.
- üblich sind 2^16 pro Benutzerkonto. Man kann aber auch mit mehr oder weniger arbeiten.
- es gibt eine
man-Page zusubuidundsubgid - ggf. muss in Debian das Paket "uidmap" installiert sein
Erzeugt einen Unshare-Kontext mit ID-Mappings
- UID 0 aus dem Namespace soll eurer realen User-ID entsprechen (z.B. 1000)
- die UIDs 1 bis 65535 sollen aus euren persönlichen subuid-Range kommen
- Gruppen-IDs analog
chrooted in das vorbereitete Alpine Linuxversucht wieder via
suzu einem der vormals angelegten Alpine-User zu wechseln- legt die Konten und Heimverzeichnisse ggf. neu an (Berechtigungen und so)
- legt Dateien und Verzeichnisse als unprivilegierte Nutzer an
- Entfernt Zugriffsberechtigungen für andere User
- → Der Unshare-User kann außerhalb des Namespace nicht auf Dateien seiner eigenen SubUIDs zugreifen, es handelt sich normal um andere UIDs