Zum Inhalt springen

SSH

Erfasst am 28.07.2026 von einem CE dieser Bereitstellung. sitecli/capture-manifest.json enthält den betreffenden Knoten, und scripts/capture-sitecli.sh --check überprüft die Befehlsoberfläche erneut gegen einen laufenden CE.

SSH erreicht das Appliance-Konto admin, dessen Login-Shell die Site CLI ist (/opt/bin/vpmu). Dies ist der einzige Zugang zur vollständigen On-Box-Befehlsoberfläche — die Debug-API stellt 34 Befehle bereit, während die Appliance selbst viele weitere anbietet, die in dieser API nicht vorhanden sind.

Terminal-Fenster
cd terraform
SLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')
ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"

Jeder Teil dieser Befehlszeile ist wesentlich. Die nächsten drei Abschnitte erläutern, welchen Fehler jeder Teil verhindert.

Es gibt keine Shell-Eingabeaufforderung, auf der man landet: Die Login-Shell von admin ist die Site CLI, sodass man direkt an deren >>>-Eingabeaufforderung landet. Führen Sie On-Box-Befehle dort als execcli <name> aus — siehe On-Box-Befehle.

Warum cloud-init den Schlüssel schreibt und nicht die API

Abschnitt betitelt „Warum cloud-init den Schlüssel schreibt und nicht die API“

admin_user_credentials.ssh_key am Site-Objekt sieht genau wie das Feld dafür aus. Es wird akzeptiert, übersteht ein Read-Back und konfiguriert nichts. vpm besitzt die lokalen Benutzer des Knotens und lehnt es ab, diesen zu ändern — aus dem eigenen Log des Knotens, dreimal während eines einzigen Starts:

vpm users.go:165: Won't do any change for user admin (internal skip)

Alles weitere folgt aus dieser einen Zeile. /var/home/admin/.ssh existiert nie, weder vor noch nach dem Erreichen von ONLINE durch die Site. Das Shadow-Last-Change-Datum von admin bleibt beim Bau-Datum des Images, während vesbkp und vesopcon das aktuelle Datum anzeigen, weil vpm diese beiden gesetzt und admin übersprungen hat. Und vpm protokolliert zu keinem Zeitpunkt etwas über ssh_key oder authorized_keys.

Die Datei muss daher außerhalb von vpm geschrieben werden. admin hat die UID 2202, fest im Node-Image verankert, sodass sie existiert, bevor cloud-init läuft, und owner: admin:admin wird zum Schreibzeitpunkt aufgelöst — kein runcmd, keine Eigentümerkorrektur:

- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}

sshd war stets bereit. sshd -T meldet pubkeyauthentication yes, und admin erscheint in AllowUsers in beiden sshd_config-Dateien, die mit dem Knoten ausgeliefert werden. Es musste nie etwas aktiviert werden — nur eine fehlende Datei.

sshd bindet 0.0.0.0:22, aber nur die interne (SLI)-Adresse ist im Host-Netzwerk-Stack des Knotens auf eine Weise vorhanden, auf der sshd antwortet. eth0 wird in a-i-eth0 umbenannt und trägt überhaupt keine Host-IP — die Argo-Datenebene besitzt diese Schnittstelle, und die Management-/SLO-Adresse, die sie getragen hätte, erscheint stattdessen auf vhost0. Die anderen beiden NICs bleiben unter ihren eigenen Namen im Host-Stack.

Von einer VM innerhalb des VNets aus gegen einen CE geprüft:

Management-/SLO-Adresse Zeitüberschreitung
externe Adresse Zeitüberschreitung
interne/SLI-Adresse OFFEN SSH-2.0-OpenSSH_8.7
eine ungenutzte Adresse Zeitüberschreitung (Kontrolle)

Eine Prüfung gegen die Adresse, unter der der Knoten bekannt ist, liefert daher exakt dasselbe Ergebnis wie eine geschlossene Sicherheitsgruppe. Es wird nichts blockiert; es gibt einfach keinen Listener auf dieser Adresse.

Die öffentlichen CE-Adressen haben ebenfalls keinen Listener auf Port 22, weshalb der obige Befehl -J verwendet: eine Operator-VM innerhalb des VNets, im selben Subnetz wie die SLI-Adressen. Diese Bereitstellung erstellt eine zu diesem Zweck — terraform output -raw client_vm_name nennt sie.

Die Site CLI benötigt ein Terminal und einen Wagenrücklauf

Abschnitt betitelt „Die Site CLI benötigt ein Terminal und einen Wagenrücklauf“

Die Login-Shell von admin ist keine Shell. Es handelt sich um eine go-prompt-Anwendung, die das Terminal in den Raw-Modus versetzt und Tastenanschläge statt Zeilen liest. Vier Konsequenzen, von denen jede auf eine Weise fehlschlägt, die wie ein anderes Problem aussieht:

MechanikWas ohne sie passiert
Terminal zuweisen (ssh -tt)panic: no such device or address von go-prompt.NewStandardInputParser, was wie ein abgestürztes Appliance aussieht
Wagenrücklauf statt Zeilenvorschub für Enter sendenDie Zeile wird nie abgesendet, und die Sitzung schließt bei Eingabeende, ohne etwas ausgegeben zu haben
Standardeingabe offen haltenDie Verbindung endet, bevor der Befehl gerendert hat, sodass ein funktionierender Befehl still wirkt
Befehlstext und Enter-Byte getrennt schreibenDer Zeilenumbruch landet als wörtliches Zeichen im Puffer, und die CLI antwortet mit unknown command, was so aussieht, als würde der Befehl nicht existieren

ssh host 'some-command' funktioniert daher nicht: Das Argument wird ignoriert und die interaktive Eingabeaufforderung startet trotzdem. Es muss als Terminal gesteuert werden oder gar nicht. scripts/sitecli_ssh_harvest.py ist die Referenzimplementierung.

Bevor etwas eingegeben wird, hat das Login-Banner bereits mehrere Fragen beantwortet, auf die man sonst Befehle verwenden würde. Von f5-xc-ce-vm-01, ASCII-Art und öffentliche IP gekürzt:

UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED
All actions performed on this device are audited
Using https://register.ves.volterra.io
OS: rhel-9.2024.6
Memory: 32768MiB
Storage: sda: 31GiB
CPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8
Software: crt-20250613-3382
DNS: 168.63.129.16: OK
NTP: Synced
Uptime: 0 days, 5 hours, 20 minutes
Registration Status: PROVISIONED
SLO IP: 10.0.1.4/26
WELCOME IN SITE CLI

Registration Status unterscheidet einen Knoten, der noch hochfährt (PROVISIONING), von einem, der fertig ist (PROVISIONED). Software ist der Build-String, der bestimmt, welche Befehle existieren. DNS und NTP decken die beiden Abhängigkeiten ab, die die Registrierung zuerst unterbrechen, sodass ein Knoten, der nie online kam, den Grund hier meistens bereits mitgeteilt hat — bevor chronyc-sources oder dig überhaupt benötigt werden.

  1. Ein Schlüsselpaar generieren, falls noch keines vorhanden ist. Ed25519 statt RSA: kürzer und vom Appliance-sshd akzeptiert.

    Terminal-Fenster
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. Die Bereitstellung auf die öffentliche Hälfte verweisen. Das Root-Modul liest die Datei einmalig und übergibt die Zeichenkette an jeden Knoten:

    terraform/terraform.tfvars
    ssh_public_key_path = "~/.ssh/id_ed25519.pub"

    ssh_public_key nimmt das Material stattdessen inline entgegen, was die Plan-Tests verwenden. Die private Hälfte verlässt niemals die eigene Arbeitsstation.

  3. Apply ausführen. Zuerst die Warnung am Anfang dieser Seite lesen — bei einer bestehenden Bereitstellung werden dabei die CE-VMs ersetzt.

Jedes der Folgenden wurde getestet und ausgeschlossen, während der Weg noch für unmöglich gehalten wurde. Jedes ist plausibel genug, um einen Tag zu kosten.

Nicht die UrsacheWie es ausgeschlossen wurde
Die Berechtigung gilt nur beim Erstellensshd startet etwa 90 Sekunden nach dem ersten Start, bevor das Site-Objekt existiert. admin_user_credentials ist auch in ReplaceSpecType vorhanden und wird In-Place angewendet.
block_all_servicesDas Port-22-Schließen auf der Management-Adresse ist identisch, unabhängig davon, ob Dienste blockiert sind oder nicht.
Ein abschließender Zeilenumbruch am SchlüsselBeide Varianten getestet, keine Änderung. Cloud-init entfernt ihn trotzdem, weil ein wörtlicher Block andernfalls eine zweite, leere Zeile rendern würde.
Ältere, festgepinnte CE-SoftwareAuf drei Builds reproduziert, einschließlich eines mit OpenSSH 9.9.
Ein fehlender admin_passwordDas Setzen von admin_password neben ssh_key auf einem neu erstellten CE änderte nichts.