Übung
In dieser Übung soll der Gebrauch von SSH und von SSH-Tunneln mit einer bereitgestellten Cloud-VM eingeübt werden.
Voraussetzungen:
- Die Git Bash ist unter Windows installiert
oder als portable Version verfügbar. (Unter macOS und Linux stehen die Befehle
ssh-keygen
,ssh
und 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
Halten Sie für die folgenden Aufgaben jeweils folgendes fest:
- die Antworten auf die gestellten Fragen
- die verwendeten Befehle, bei denen man selbständig etwas ergänzen muss
- die dabei gemachten Erkenntnisse
Die Form der Dokumentation ist frei. Sie soll der Lehrperson auf Nachfrage gezeigt werden können und fliesst in die Bewertung ein (Prädikate).
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
Nehmen Sie die Verbindung zu Ihrem Server auf, indem Sie den folgenden Befehl in der Bash eingeben:
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.
Installieren Sie nun testhalber einen Webserver, z.B. nginx
:
sudo apt install nginx -y
Greifen Sie 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, dass Sie nur Verbindungen von localhost
akzepiert. Die Parameter lassen sich folgendermassen anzeigen:
./pingpong -help
Funktioniert der Zugriff von aussen noch?
Stoppen Sie die Anwendung nun und starten Sie 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
Stellen Sie 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. Öffnen Sie hierzu eine neue Shell (Bash).
Richten Sie 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
Stoppen Sie das pingpong
-Programm und löschen Sie es:
rm pingpong
Unterbrechen Sie die SSH-Sitzung mit dem Port-Forwarding mit exit
oder der
Tastenkombination [Ctrl]
-[D]
.
Kompilieren Sie das Programm nun für Ihr 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.
Verwenden Sie nun die zweite Bash und kopieren Sie das Programm vom Server auf den lokalen Rechner:
scp user@[IP-Adresse]:pingpong.exe .
Bzw. auf macOS:
scp user@[IP-Adresse]:pingpong .
Führen Sie nun das Programm lokal aus und testen Sie 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.
Richten Sie 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?