SSH: Übung
In dieser Übung wird der Gebrauch von SSH und von SSH-Tunneln mit einer bereitgestellten Cloud-VM eingeübt.
Voraussetzungen
- Die Git Bash ist unter Windows installiert oder als portable Version verfügbar. (Unter macOS und Linux stehen Befehle wie
sshundscpsowie eine Unix-Shell bereits zur Verfügung.) - Es wurde ein SSH-Schlüssel erzeugt und der Lehrperson abgegeben.
- Die Lehrperson stellt eine virtuelle Maschine mit hinterlegtem SSH-Schlüssel bereit.
Aufgabe 0: Ergebnissicherung
Halte für die folgenden Aufgaben folgendes fest:
- die Antworten auf die gestellten Fragen,
- die verwendeten Befehle, bei denen man selbständig etwas ergänzen muss und
- die dabei gemachten Erkenntnisse
Die Form der Dokumentation ist frei. Sie soll der Lehrperson auf Nachfrage gezeigt werden können.
Achtung: Die virtuellen Maschinen werden am Ende des Unterrichts unwiederbringlich gelöscht! Die Befehle müssen darum lokal festgehalten werden und können nicht auf dem Server nachgeschaut werden.
Aufgabe 1: Verbindung aufnehmen
Nimm die Verbindung zu deinem Server auf, indem du den folgenden Befehl in der Bash eingibst:
ssh user@[IP-Adresse]
Ist der zu verwendende private Schlüssel nicht unter ~/.ssh/id_ed25519 oder ~/.ssh/id_rsa abgelegt, muss der Pfad zur entsprechenden Datei mit dem Parameter -i explizit angegeben werden, z.B. falls der Schlüssel unter Documents/m346/ssh-key abgelegt ist:
ssh -i ~/Documents/m346/ssh-key user@[IP-Adresse]
Der Benutzername lautet immer user. Die IP-Adresse wird im Unterricht zur Verfügung gestellt.
Beim ersten Verbindungsversuch muss durch das Eintippen von yes bestätigt werden, dass man dem Server auf der anderen Seite vertraut.
Mit dem Befehl exit oder durch Betätigung der Tastenkombination [Ctrl]-[D] gelangt man zurück auf das Terminal des lokalen Systems.
Installiere nun testhalber einen Webserver, z.B. nginx:
sudo apt install nginx -y
Greife nun im Browser über die IP-Adresse auf diesen Webserver zu. Es sollte die nginx-Startseite angezeigt werden.
Aufgabe 2: Beispielanwendung in Betrieb nehmen
Im aktuellen Arbeitsverzeichnis (/home/user) sollte sich eine Datei namens pingpong.go befinden. Dies ist ein einfacher Server, womit die Konnektivität auf den Server als Frage-Antwort-Spiel demonstriert werden kann.
Das Programm ist in der Sprache Go geschrieben und kann mit dem go-Befehl kompiliert werden:
go build pingpong.go
Es ist nun eine Binärdatei namens pingpong entstanden. Diese kann folgendermassen gestartet werden:
./pingpong
Nun kann vom einem Browser aus auf den Server zugegriffen werden, wozu folgende URL verwendet werden kann: http://[IP-Adresse]:8000/ping.
Im Browser sollte eine Meldung der folgenden Form erscheinen:
pong back to 178.196.200.21:50974
Gleichzeitig erscheint im Terminal auf dem Server eine Logmeldung der folgenden Form:
pinged from 178.196.200.21:50974
Hierbei können IP-Adresse und Port natürlich variieren.
Das pingpong-Programm kann mit [Ctrl]-[C] wieder gestoppt werden.
Aufgabe 3: Startparameter ändern
Das pingpong-Programm unterstützt zwei Parameter, womit Adresse und Port angepasst werden können, auf welche das Programm lauscht. Standardmässig wird die Adresse 0.0.0.0 verwendet, wodurch Verbindungen von überall her erlaubt werden. Als Port ist 8000 vorkonfiguriert, der auf allen VMs offen sein sollte.
Starte nun die Anwendung so, damit sie nur Verbindungen von localhost akzepiert. Die Parameter lassen sich folgendermassen anzeigen:
./pingpong -help
Funktioniert der Zugriff von aussen noch?
Stoppe die Anwendung nun und starte sie so, dass sie auf Port 7000 lauscht, aber wieder Verbindungen von der Adresse 0.0.0.0 akzeptiert.
Funktioniert der Zugriff von aussen (wieder) über diesen Port?
Aufgabe 4: Local Forwarding
Stelle sicher, dass die Anwendung pingpong läuft, aber dass sie auf Port 7000 lauscht (per Parameter angeben) und nur Verbindungen von 0.0.0.0 entgegennimmt (Standardeinstellung).
Um von aussen auf den Server zugreifen zu können, muss nun ein Local Forwarding eingerichtet werden. Öffne hierzu eine neue Shell (Bash).
Richte die entsprechende Weiterleitung ein, sodass man von aussen wieder auf die Anwendung zugreifen kann. Tipp: ssh -L ist unter Local
Forwarding dokumentiert.
Mit welchen Parametern muss der pingpong-Server nun gestartet werden?
Unter welcher Adresse ist der pingpong-Server nun erreichbar?
Aufgabe 5: Programm lokal ausführen
Stoppe das pingpong-Programm und lösche es:
rm pingpong
Unterbrich die SSH-Sitzung mit dem Port-Forwarding mit exit oder der Tastenkombination [Ctrl]-[D].
Kompiliere das Programm nun für dein lokales System mit entsprechenden GOOS- und GOARCH-Parametern, um das Zielbetriebssystem und die Zielarchitektur festzulegen. Für Windows mit AMD64-Architektur lauten die Angaben beispielsweise:
GOOS=windows GOARCH=amd64 go build pingpong.go
Es sollte ein Programm pingpong.exe erstellt worden sein.
Für macOS mit ARM-CPUs sieht der Befehl folgendermassen aus:
GOOS=darwin GOARCH=arm64 go build pingpong.go
Hierbei wird eine Datei namens pingpong erzeugt.
Verwende nun die zweite Bash und kopiere das Programm vom Server auf den lokalen Rechner:
scp user@[IP-Adresse]:pingpong.exe .
Bzw. auf macOS:
scp user@[IP-Adresse]:pingpong .
Führe nun das Programm lokal aus und teste es.
Über welche URL kann das Programm lokal angesprochen werden?
Aufgabe 6: Remote Forwarding
Um vom Server auf die lokale pingpong-Anwendung zugreifen zu können, muss ein Remote Forwarding eingerichtet werden.
Richte die entsprechende Weiterleitung ein, sodass der Zugriff vom Server auf den lokalen Rechner funktioniert. Tipp: ssh -R ist unter Remote Forwarding dokumentiert.
Um den Zugriff vom Server auf den lokalen Recher zu testen, kann das Programm curl verwendet werden:
curl http://[IP-Adresse]:[Port]/ping
Über welche URL kann das Programm angesprochen werden?