Salta ai contenuti

SSH

Acquisito il 2026-07-28 da un CE di questa installazione. sitecli/capture-manifest.json registra quale nodo, e scripts/capture-sitecli.sh --check riverifica la superficie dei comandi su un CE attivo.

SSH raggiunge l’account admin dell’appliance, il cui shell di accesso è il Site CLI (/opt/bin/vpmu). Questo è l’unico percorso verso la superficie completa dei comandi sull’appliance — la debug API espone 34 comandi, mentre l’appliance stessa ne offre molti altri che non sono disponibili su quella API.

Terminal window
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"

Ogni parte di quella riga di comando è essenziale, e le prossime tre sezioni spiegano quale errore previene ciascuna.

Non esiste un prompt di shell su cui atterrare: lo shell di accesso di admin è il Site CLI, quindi si arriva al suo prompt >>>. Eseguire i comandi sull’appliance come execcli <name> — vedere comandi sull’appliance.

Perché cloud-init scrive la chiave, e non l’API

Sezione intitolata “Perché cloud-init scrive la chiave, e non l’API”

admin_user_credentials.ssh_key sull’oggetto site sembra esattamente il campo adatto a questo scopo. Viene accettato, sopravvive a una rilettura, e non configura nulla. vpm gestisce gli utenti locali del nodo e si rifiuta di toccare questo — dal log del nodo stesso, tre volte nell’arco di un singolo avvio:

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

Tutto il resto deriva da quella riga. /var/home/admin/.ssh non esiste mai, né prima né dopo che il site raggiunge ONLINE. La data dell’ultimo cambio della shadow di admin rimane alla data di build dell’immagine mentre vesbkp e vesopcon mostrano la data corrente, perché vpm ha impostato quei due e saltato admin. E vpm non registra nulla riguardo a ssh_key o authorized_keys in nessun momento.

Quindi il file deve essere scritto al di fuori di vpm. admin ha uid 2202, integrato nell’immagine del nodo, quindi esiste prima che cloud-init venga eseguito e owner: admin:admin si risolve al momento della scrittura — nessun runcmd, nessuna correzione della proprietà:

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

sshd era sempre disponibile. sshd -T riporta pubkeyauthentication yes, e admin appare in AllowUsers in entrambi i file sshd_config presenti sul nodo. Non c’era mai nulla da abilitare — solo un file mancante.

sshd si associa a 0.0.0.0:22, ma solo l’indirizzo interno (SLI) è nello stack di rete dell’host in modo che sshd risponda. eth0 viene rinominato a-i-eth0 e non porta alcun IP host — il piano dati Argo possiede quell’interfaccia, e l’indirizzo di management/SLO che avrebbe portato appare invece su vhost0. Le altre due NIC rimangono nello stack dell’host con i propri nomi.

Sondato da una VM all’interno della VNet, contro un CE:

indirizzo management/SLO timeout
indirizzo esterno timeout
indirizzo interno/SLI APERTO SSH-2.0-OpenSSH_8.7
un indirizzo non utilizzato timeout (controllo)

Un sondaggio sull’indirizzo con cui si conosce il nodo restituisce quindi esattamente quello che restituisce un security group chiuso. Non è nulla che lo blocchi; non c’è alcun listener su quell’indirizzo.

Gli indirizzi pubblici del CE non hanno nessun listener sulla porta 22, motivo per cui il comando sopra passa attraverso -J: una VM operatore all’interno della VNet, nella stessa subnet degli indirizzi SLI. Questa installazione ne costruisce una allo scopo — terraform output -raw client_vm_name la nomina.

Il Site CLI richiede un terminale e un carriage return

Sezione intitolata “Il Site CLI richiede un terminale e un carriage return”

Lo shell di accesso di admin non è una shell. È un’applicazione go-prompt, che mette il terminale in modalità raw e legge i tasti anziché le righe. Quattro conseguenze, ognuna delle quali fallisce in un modo che sembra un problema diverso:

MeccanismoCosa succede senza di esso
Allocare un terminale (ssh -tt)panic: no such device or address da go-prompt.NewStandardInputParser, che sembra un’appliance in crash
Inviare un carriage return, non un line feed, per InvioLa riga non viene mai inviata, e la sessione si chiude al termine dell’input senza aver stampato nulla
Mantenere aperto lo standard inputLa connessione termina prima che il comando abbia prodotto output, quindi un comando funzionante sembra silenzioso
Scrivere il testo del comando e il byte Invio separatamenteIl newline finisce nel buffer come carattere letterale e il CLI risponde unknown command, il che sembra indicare che il comando non esista

ssh host 'some-command' quindi non funziona: l’argomento viene ignorato e il prompt interattivo si avvia comunque. Utilizzarlo come terminale, o non utilizzarlo affatto. scripts/sitecli_ssh_harvest.py è l’implementazione di riferimento.

Prima di digitare qualsiasi cosa, il banner di login ha già risposto a diverse domande su cui si spenderebbero comandi. Da f5-xc-ce-vm-01, con ASCII art e IP pubblico rimossi:

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 distingue un nodo ancora in avvio (PROVISIONING) da uno che ha terminato (PROVISIONED). Software è la stringa di build che determina quali comandi esistono. DNS e NTP coprono le due dipendenze che interrompono prima la registrazione, quindi un nodo che non è mai andato online di solito ha già comunicato qui il motivo — prima che chronyc-sources o dig siano necessari.

  1. Generare una coppia di chiavi, se non si dispone già di una. Ed25519 anziché RSA: più corta, e accettata dall’sshd dell’appliance.

    Terminal window
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. Puntare l’installazione alla metà pubblica. Il modulo root legge il file una volta e passa la stringa a ogni nodo:

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

    ssh_public_key accetta invece il materiale inline, che è ciò che usano i test del piano. La metà privata non lascia mai la propria workstation.

  3. Applicare. Leggere prima l’avviso in cima a questa pagina — su un’installazione esistente questo sostituisce le VM CE.

Ognuno di questi è stato testato e scartato mentre il percorso era ancora ritenuto impossibile. Ognuno è abbastanza plausibile da far perdere una giornata.

Non è la causaCome è stato escluso
Le credenziali si applicano solo al momento della creazionesshd si avvia circa 90 secondi nel primo avvio, prima che l’oggetto site esista. admin_user_credentials è anche presente in ReplaceSpecType e si applica in-place.
block_all_servicesLa chiusura della porta 22 sull’indirizzo di management è identica sia che i servizi siano bloccati o meno.
Un newline finale nella chiaveTestato in entrambi i modi, nessuna modifica. Cloud-init lo elimina comunque, perché un blocco letterale altrimenti renderebbe una seconda riga vuota.
Software CE pinnato e più vecchioRiprodotto su tre build, inclusa una con OpenSSH 9.9.
Un admin_password mancanteImpostare admin_password insieme a ssh_key su un CE da zero non ha cambiato nulla.