Aller au contenu

SSH

Capturé le 2026-07-28 depuis un CE de ce déploiement. sitecli/capture-manifest.json enregistre le nœud concerné, et scripts/capture-sitecli.sh --check revérifie la surface de commande sur un CE actif.

SSH atteint le compte admin de l’appliance, dont le shell de connexion est le Site CLI (/opt/bin/vpmu). C’est la seule voie d’accès à la surface de commande complète sur la boîte — l’API de débogage expose 34 commandes, et l’appliance elle-même en offre bien d’autres qui ne figurent pas du tout dans cette API.

Fenêtre de terminal
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"

Chaque élément de cette ligne de commande est indispensable, et les trois sections suivantes expliquent quelle erreur chacun prévient.

Il n’existe pas d’invite shell sur laquelle atterrir : le shell de connexion d’admin est le Site CLI, vous arrivez donc directement à son invite >>>. Exécutez les commandes sur la boîte avec execcli <name> à cet endroit — voir les commandes sur la boîte.

Pourquoi cloud-init écrit la clé, et non l’API

Section intitulée « Pourquoi cloud-init écrit la clé, et non l’API »

admin_user_credentials.ssh_key sur l’objet site ressemble exactement au champ prévu pour cela. Il est accepté, survit à une relecture, et ne configure rien. vpm est propriétaire des utilisateurs locaux du nœud et refuse de modifier celui-ci — d’après le journal propre du nœud, à trois reprises lors d’un seul démarrage :

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

Tout le reste découle de cette seule ligne. /var/home/admin/.ssh n’existe jamais, avant ni après que le site atteigne ONLINE. La date de dernier changement du shadow d’admin reste à la date de construction de l’image tandis que vesbkp et vesopcon affichent la date actuelle, car vpm a configuré ces deux-là et a ignoré admin. Et vpm ne journalise rien concernant ssh_key ou authorized_keys à aucun moment.

Le fichier doit donc être écrit en dehors de vpm. admin est l’uid 2202, gravé dans l’image du nœud, il existe donc avant l’exécution de cloud-init et owner: admin:admin est résolu au moment de l’écriture — pas de runcmd, pas de correction de propriété :

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

sshd était toujours disposé à répondre. sshd -T rapporte pubkeyauthentication yes, et admin apparaît dans AllowUsers dans les deux fichiers sshd_config livrés sur le nœud. Il n’y avait jamais rien à activer — seulement un fichier manquant.

sshd lie 0.0.0.0:22, mais seule l’adresse interne (SLI) se trouve sur la pile réseau de l’hôte d’une manière à laquelle sshd répondra. eth0 est renommé a-i-eth0 et ne porte aucune IP hôte — le plan de données Argo est propriétaire de cette interface, et l’adresse de gestion/SLO qu’elle aurait portée apparaît sur vhost0 à la place. Les deux autres NIC restent sur la pile hôte sous leurs propres noms.

Sondé depuis une VM à l’intérieur du VNet, sur un CE :

adresse management/SLO délai dépassé
adresse externe délai dépassé
adresse interne/SLI OUVERTE SSH-2.0-OpenSSH_8.7
adresse inutilisée délai dépassé (contrôle)

Un sondage sur l’adresse par laquelle vous connaissez le nœud renvoie donc exactement ce que retourne un groupe de sécurité fermé. Rien ne le bloque ; il n’y a simplement pas de listener sur cette adresse.

Les adresses publiques du CE n’ont pas non plus de listener sur le port 22, ce qui explique pourquoi la commande ci-dessus utilise -J : une VM opérateur à l’intérieur du VNet, dans le même sous-réseau que les adresses SLI. Ce déploiement en construit une à cet effet — terraform output -raw client_vm_name la nomme.

Le Site CLI nécessite un terminal et un retour chariot

Section intitulée « Le Site CLI nécessite un terminal et un retour chariot »

Le shell de connexion d’admin n’est pas un shell. C’est une application go-prompt, qui met le terminal en mode raw et lit des frappes clavier plutôt que des lignes. Quatre conséquences, chacune échouant d’une manière qui ressemble à un problème différent :

MécanismeCe qui se passe sans lui
Allouer un terminal (ssh -tt)panic: no such device or address de go-prompt.NewStandardInputParser, ce qui ressemble à une appliance en plantage
Envoyer un retour chariot, et non un saut de ligne, pour EntréeLa ligne n’est jamais soumise, et la session se ferme en fin d’entrée sans avoir rien affiché
Garder l’entrée standard ouverteLa connexion se termine avant que la commande ait été rendue, donc une commande fonctionnelle semble silencieuse
Écrire le texte de la commande et l’octet Entrée séparémentLe saut de ligne atterrit dans le tampon comme un caractère littéral et le CLI répond unknown command, ce qui donne l’impression que la commande n’existe pas

ssh host 'some-command' ne fonctionne donc pas : l’argument est ignoré et l’invite interactive démarre quand même. Pilotez-le comme un terminal ou pas du tout. scripts/sitecli_ssh_harvest.py est l’implémentation de référence.

Avant de taper quoi que ce soit, la bannière de connexion a déjà répondu à plusieurs des questions sur lesquelles vous auriez autrement passé des commandes. Depuis f5-xc-ce-vm-01, art ASCII et IP publique masqués :

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 nœud encore en cours de démarrage (PROVISIONING) d’un nœud terminé (PROVISIONED). Software est la chaîne de build qui détermine quelles commandes existent. DNS et NTP couvrent les deux dépendances qui cassent l’enregistrement en premier, donc un nœud qui n’est jamais passé en ligne vous a généralement déjà dit pourquoi ici — avant que chronyc-sources ou dig soient nécessaires.

  1. Générez une paire de clés, si vous n’en avez pas déjà une. Ed25519 plutôt que RSA : plus courte, et acceptée par le sshd de l’appliance.

    Fenêtre de terminal
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. Pointez le déploiement vers la moitié publique. Le module racine lit le fichier une fois et transmet la chaîne à chaque nœud :

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

    ssh_public_key prend le matériau en ligne à la place, ce qui est ce qu’utilisent les tests de plan. La moitié privée ne quitte jamais votre poste de travail.

  3. Appliquez. Lisez d’abord l’avertissement en haut de cette page — sur un déploiement existant, cela remplace les VMs CE.

Chacun de ces éléments a été testé et écarté alors que la voie était encore considérée comme impossible. Chacun est suffisamment plausible pour coûter une journée.

Pas la causeComment cela a été écarté
L’identifiant ne s’applique qu’à la créationsshd démarre environ 90 secondes après le premier démarrage, avant que l’objet site existe. admin_user_credentials est également présent dans ReplaceSpecType et s’applique en place.
block_all_servicesLa fermeture du port 22 sur l’adresse de gestion est identique que les services soient bloqués ou non.
Un saut de ligne en fin de cléTesté dans les deux sens, aucun changement. Cloud-init le supprime quand même, car un bloc littéral rendrait autrement une deuxième ligne vide.
Un logiciel CE épinglé et plus ancienReproduit sur trois builds, dont un exécutant OpenSSH 9.9.
Un admin_password manquantDéfinir admin_password aux côtés de ssh_key sur un CE créé de zéro n’a rien changé.