Zur Sicherheit sind nicht alle Rechner außerhalb des Lehrstuhlnetzwerks verfügbar. Um trotzdem auf diese von außen zuzugreifen, muss man sich zunächst per SSH mit login6.informatik.uni-wuerzburg.de (einem sogenannten Sprungbrettrechner) verbinden. Über diesen kann auf alle Maschinen im Lehrstuhlnetz zugegriffen werden.

Einrichtung

Unter Linux enthält üblicherweise das Paket openssh alle notwendigen Programme. Unter Windows ist OpenSSH inzwischen auch standardmäßig installiert, falls nicht, siehe Installationsanleitung von Microsoft. Im folgenden werden die Linux-Pfade für die OpenSSH-Konfiguration benutzt, unter Windows sollten diese identisch sein bis auf spiegelverkehrte /.

Für ältere Windows-Versionen kann putty genutzt werden, siehe unten

SSH-Key generieren.

Anstatt eines Logins per Passwort empfehlen wir, ein SSH-Schlüsselpaar zu erzeugen, mit dem die Authentifizierung erfolgen kann. Für neue Studentenaccounts wird nur diese Authentifizierung erlaubt.

Der folgende Befehl startet die Schlüsselgenerierung, einfach den Anweisungen folgen. Wählt für den Schlüssel ein sicheres Passwort! Das Passwort wird zur lokalen Verschlüsselung benutzt, d.h. der Server kennt das Passwort nicht und wir können es auch nicht zurücksetzen.

% ssh-keygen -t ed25519

Wenn ihr die Default-Einstellungen im Dialog beibehalten habt, solltet ihr nun zwei Dateien in eurem Homeverzeichnis finden:

~/.ssh/id_ed25519        # private key
~/.ssh/id_ed25519.pub    # public key

Prinzipiell könnt ihr diesen Schlüssel auf mehreren Rechnern verwenden, ihr könnt aber auch für jeden Rechner einen eigenen Schlüssel generieren. Abgesehen vom ersten Schlüssel zur Accounterstellung könnt ihr diese selbst eurem Account hinzufügen oder entfernen (siehe unten).

SSH-Verbindung mit einem Server

Im Folgenden wird exemplarisch eine SSH-Verbindung mit den Rechnern slurmmaster-ls6 und grishnakh aufgebaut (siehe auch Rechencluster). Dafür konfigurieren wir login6.informatik.uni-wuerzburg.de als SSH Proxy.

Erstellt eine SSH-Configdatei unter ~/.ssh/config, falls diese noch nicht existiert (unter Windows ist das C:\Users\<benutzername>\.ssh\config, keine Dateiendung).

Öffnet die Datei mit einem Texteditor und tragt folgendes ein, wobei ihr <USERNAME> durch euren Lehrstuhl-Benutzernamen (siehe Mail) ersetzt:

Host login6
  HostName login6.informatik.uni-wuerzburg.de
  User <USERNAME>
  IdentityFile ~/.ssh/id_ed25519 # Anpassen, falls unter anderem Namen

# Weitere Zielserver einfach in dieser Zeile hinzufügen
Host slurmmaster-ls6 grishnakh
  HostName %h.informatik.uni-wuerzburg.de
  User <USERNAME>
  IdentityFile ~/.ssh/id_ed25519 # Anpassen, falls unter anderem Namen
  ProxyJump login6

Danach kann die Verbindung mit diesem Befehl aufgebaut werden:

ssh slurmmaster-ls6

Namen weiterer Server können einfach nach slurmmaster-ls6 und grishnakh hinzugefügt werden.

Alternative Konfiguration für alte OpenSSH Versionen

Für Versionen von OpenSSH (vor 7.3), die die Option ProxyJump noch nicht enthalten, muss die Zeile mit dieser durch folgendes ersetzt werden:

ProxyCommand ssh -x -T login6 -W %h:22

Zusätzliche Keys eintragen

Für neue Accounts, die kein Passwort haben, ist dieser Abschnitt nur beim Hinzufügen zusätzlicher Keys relevant. Der Key, der beim Accountantrag mitgeschickt wurde, wird automatisch eingerichtet.

Die Registrierung eines Schlüssels erfolgt bei SSH über eine Konfigurationsdatei im Home-Verzeichnis des Zielrechners. Da der Sprungbrettrechner nicht zum Arbeiten genutzt werden soll, sind die Home-Verzeichnisse dort jedoch nicht schreibbar. Um für den Login einen SSH-Key zu verwenden, muss dieser im Homeverzeichnis auf einem beliebigen anderen Server eingetragen werden. Dieser wird dann nach spätestens 10 Minuten automatisch auch auf dem Sprungbrettrechner verfügbar.

Manuelle Eintragung

Der Public Key muss im OpenSSH-Format (s.u) in die Datei ~/.ssh/authorized_keys auf einen Rechner mit schreibbarem Home eingetragen werden (z.B. slurmmaster-ls6, grishnakh). Dies enspricht dem Inhalt der im vorherigen Schritt erstellten .pub-Datei:

# ~/.ssh/authorized_keys
# $algorithmus $key $kommentar
# z.B.
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA/LAmAYK0LoQx8fA/PJvNOhxYh7cIr3ZdMqFuCglM4d Demo-Key für Wiki

Automatisches Kopieren mit ssh-copy-id (nur OpenSSH)

Um Keys mittels ssh-copy-id zu übertragen, erst SSH entspreched konfigurieren. Anschließend ist die automatische Übertragung möglich:

% ssh-copy-id slurmmaster-ls6

Dateien kopieren

Um Dateien zwischen dem lokalen Rechner und Servern zu kopieren, gibt es verschiedene Möglichkeiten. Für die meisten hiervon ist die obige Konfiguration Voraussetzung.

SFTP

Mittels sftp $host erhält man eine SFTP-Shell, welche nur Befehle zur Dateiübertragung unterstützt. Hier eine Auswahl der wichtigsten:

  • cd wechselt das Verzeichnis auf dem Server
  • ls listet die Inhalte des aktuellen Verzeichnisses auf
  • pwd gibt aus, in welchem Verzeichnis man sich aktuell befindet
  • lcd, lls und lpwd tun das selbe für das lokale Verzeichnis
  • get und put übertragen die angegebene Datei ins aktuelle lokale bzw. remote Verzeichnis.

Für mehr Befehle, siehe die sftp manpage oder dieses Tutorial.

SCP

Mit scp kann man Dateien und Verzeichnisse wie mit dem lokalen cp-Befehl kopieren. Um hierbei einen Pfad auf dem Server anzugeben, muss der Server mit einem : getrennt vor den Pfad geschrieben werden. Zum Kopieren von Verzeichnissen muss -r mit angegeben werden. Um zum Beispiel den Ordner myDataset ins Scratchverzeichnis zu kopieren:

scp -r myDataset/ storage-ls6:/storage/scratch/myfolder/

SSHFS

Mit sshfs kann ein Verzeichnis auf dem Server als lokales Dateisystem gemountet werden (derzeit nur Linux, es existert ein Windows-Port, jedoch funktionert dieser bisher anscheinend nicht über Proxys).

Die Syntax ist ähnlich wie bei scp. Um das eigene Homeverzeichnis lokal unter ~/mnt/ls6home einzuhängen:

sshfs storage-ls6:~/ ~/mnt/ls6home

Port Forwarding

Um andere Netzwerkanwendungen als SSH auf Servern zu erreichen, die nicht nach außen freigegeben sind, könnt ihr SSH zum Tunneln benutzen. Hierzu ist kein SSH-Zugang auf dem Rechner mit dem offenen Port nötig, der Server muss nur im Lehrstuhlnetz sein. Allerdings muss die Anwendung auch Verbindungen von anderen Rechnern auf dem Port zulassen (Beispiel für Jupyter-Notebooks siehe unten).

Angenommen ihr habt einen Service unter meine-vm.informatik.uni-wuerzburg.de laufen, der aber von außen nicht erreichbar ist, z.B. weil er noch kein Zertifikat hat oder er nur temporär läuft.

ssh -N -L 8080:meine-vm.informatik.uni-wuerzburg.de:80 login6
  • -N verhindert, dass eine Shell gestartet wird
  • -L richtet eine lokale Portweiterleitung ein, mit Doppelpunkten getrennt:
    • zuerst der Port, auf den wir dann lokal zugreifen wollen, hier 8080
    • dann der Server, zu dem wir den Tunnel aufbauen wollen
    • dann der Port auf dem Zielserver
  • Zuletzt noch der Server, der den Tunnel zur Verfügung stellt, hier unser Loginserver. Auf diesem brauchen wir SSH-Zugang und der Zielserver muss von diesem aus erreichbar sein.

Der Befehl öffnet in dieser Form keine Shell, d.h. es erscheint nicht wie bei einer normalen SSH-Verbindung eine Eingabeaufforderung. Solange der Prozess läuft, sollte nun unter http://localhost:8080 der HTTP-Server auf meine-vm.informatik.uni-wuerzburg.de erreichbar sein.

Jupyter-Notebooks auf Slurm Nodes

Das ganze funktioniert natürlich auch für andere Protokolle, indem man die Ports entsprechend anpasst, z.B. Jupyter-Notebooks auf den Slurm Hosts. Hier müsst ihr beachten, dass ihr euer Jupyter-Notebook anweist, auch auf Verbindungen von anderen Rechnern aus zu hören. Hierzu gibt es zwei Möglichkeiten:

  • Variante 1: Startparameter: Beim Start des Notebooks, gebt jupyter notebook --ip 0.0.0.0 mit an.
  • Variante 2: Via Configdatei: Bearbeitet die jupyter_notebook_config.py (falls nicht vorhanden, kann diese mit jupyter server --generate-config generiert werden) und fügt folgende Zeilen hinzu bzw. entfernt das # von den entsprechenden Kommentaren und passt die Werte an:

    c.NotebookApp.allow_origin = '*' #allow all origins
    c.NotebookApp.ip = '0.0.0.0' # listen on all IPs
    

PuTTY (für alte Windowsversionen)

Schlüsselgenerierung

  • Startet das Programm PuTTYgen (sollte mit PuTTY installiert worden sein) und klickt auf “Generate”.
  • Fahrt mit der Maus so lange über die graue Fläche unter dem Ladebalken, bis dieser voll ist.
  • Kopiert den Inhalt im Feld unter “Public key for pasting into OpenSSH authorized_keys file:” in eine neue Datei namens key.pub.
  • Klickt auf “Save private key” und speichert den privaten Schlüssel unter key.
  • Danach wie unter Key eintragen fortfahren.

Tunnel

Im Folgenden wird eine PuTTY Session erstellt, die es ermöglicht eine weitere Verbindung zu slurmmaster-ls6 herzustellen.

  • Startet PuTTY
  • Rechts seht ihr eine Übersicht, links die Einstellungen.
  • Übersicht: Connection > Data
    • Auto-login username auf den Benutzernamen setzen, den ihr per E-Mail erhalten habt
  • Übersicht: Connection > SSH
    • Don’t start a shell or a command at all markieren.
  • Übersicht: Connection > SSH > Auth
    • Private key file for authentication: auf die Datei private.ppk setzen.
  • Übersicht: Connection > SSH > Tunnels
    • Source port auf 22 setzen.
    • Destination auf 132.187.15.222:22 setzen (132.187.15.222 ist die IP von slurmmaster-ls6).
    • Auf Add klicken.
  • Übersicht: Session
    • Host Name (or IP address) auf login6.informatik.uni-wuerzburg.de setzen.
    • Saved Sessions auf LS6 - slurmmaster-ls6 - Tunnel setzen.
    • Auf Save klicken.
  • Zum Verbinden auf Open klicken.

Dies öffnet nur den Tunnel, aber noch keine Verbindung zum eigentlichen Zielserver.

Verbindung

  • Startet die Session aus dem vorherigen Abschnitt.
  • Startet PuTTY nocheinmal (die andere Session dabei laufen lassen).
  • Übersicht: Connection > Data
    • Auto-login username auf den Benutzernamen setzen, den ihr per E-Mail erhalten habt
  • Übersicht: Connection > SSH > Auth
    • Private key file for authentication: auf die Datei private.ppk setzen.
  • Übersicht: Session
    • Host Name (or IP address) auf localhost setzen.
    • Saved Sessions auf LS6 - Verbindung setzen.
    • Auf Save klicken.
  • Zum Verbinden auf Open klicken.
  • Jetzt solltet ihr mit dem Zielserver slurmmaster-ls6 verbunden sein. Für einen anderen Server muss nur eine weitere Session entsprechend dem Abschnitt Tunnel angelegt werden, die Verbindungssession kann gleich blieben.