Pular para o conteúdo

SSH

Capturado em 2026-07-28 de um CE desta implantação. sitecli/capture-manifest.json registra qual nó, e scripts/capture-sitecli.sh --check reverifica a superfície de comandos em um CE ativo.

O SSH alcança a conta admin do appliance, cujo shell de login é o Site CLI (/opt/bin/vpmu). Esta é a única rota para a superfície completa de comandos no appliance — a API de debug expõe 34 comandos, e o próprio appliance oferece muito mais que não estão nessa 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"

Cada parte dessa linha de comando é indispensável, e as próximas três seções explicam qual falha cada uma previne.

Não há prompt de shell ao qual chegar: o shell de login de admin é o Site CLI, portanto você chega ao seu prompt >>>. Execute comandos no appliance como execcli <nome> ali — consulte comandos no appliance.

Por que o cloud-init escreve a chave, e não a API

Seção intitulada “Por que o cloud-init escreve a chave, e não a API”

admin_user_credentials.ssh_key no objeto do site parece exatamente o campo para isso. Ele é aceito, sobrevive a uma releitura e não configura nada. O vpm controla os usuários locais do nó e recusa-se a alterar este — do próprio log do nó, três vezes durante uma única inicialização:

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

Tudo o mais decorre dessa única linha. /var/home/admin/.ssh nunca existe, antes ou depois de o site atingir ONLINE. A data da última alteração da shadow de admin permanece na data de build da imagem enquanto vesbkp e vesopcon mostram a data atual, porque o vpm configurou esses dois e pulou o admin. E o vpm não registra nada sobre ssh_key ou authorized_keys em nenhum momento.

Portanto, o arquivo precisa ser escrito fora do vpm. admin é uid 2202, incorporado na imagem do nó, de modo que ele existe antes da execução do cloud-init e owner: admin:admin é resolvido no momento da escrita — sem runcmd, sem correção de propriedade:

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

O sshd sempre esteve disposto. sshd -T reporta pubkeyauthentication yes, e admin aparece em AllowUsers nos dois arquivos sshd_config que acompanham o nó. Nunca houve nada para habilitar — apenas um arquivo ausente.

O sshd vincula 0.0.0.0:22, mas apenas o endereço interno (SLI) está na pilha de rede do host de uma forma que o sshd responderá. eth0 é renomeado para a-i-eth0 e não carrega nenhum IP do host — o plano de dados Argo é dono dessa interface, e o endereço de gerenciamento/SLO que ele teria carregado aparece em vhost0 em vez disso. As outras duas NICs permanecem na pilha do host com seus próprios nomes.

Sondado a partir de uma VM dentro da VNet, em relação a um CE:

endereço de gerenciamento/SLO timeout
endereço externo timeout
endereço interno/SLI ABERTO SSH-2.0-OpenSSH_8.7
um endereço não utilizado timeout (controle)

Uma sondagem em relação ao endereço pelo qual você conhece o nó, portanto, retorna exatamente o que um security group fechado retorna. Nada está bloqueando; não há listener nesse endereço.

Os endereços públicos dos CEs também não têm listener na porta 22, e é por isso que o comando acima usa -J: uma VM de operador dentro da VNet, na mesma sub-rede que os endereços SLI. Esta implantação constrói uma para esse fim — terraform output -raw client_vm_name fornece o nome dela.

O Site CLI precisa de um terminal e de um retorno de carro

Seção intitulada “O Site CLI precisa de um terminal e de um retorno de carro”

O shell de login de admin não é um shell. É uma aplicação go-prompt, que coloca o terminal em modo raw e lê teclas em vez de linhas. Quatro consequências, cada uma das quais falha de um modo que parece um problema diferente:

MecanismoO que acontece sem ele
Alocar um terminal (ssh -tt)panic: no such device or address do go-prompt.NewStandardInputParser, que parece um appliance com falha
Enviar um retorno de carro, não uma alimentação de linha, para EnterA linha nunca é submetida, e a sessão fecha ao fim da entrada sem ter imprimido nada
Manter a entrada padrão abertaA conexão termina antes de o comando ser renderizado, então um comando funcionando parece silencioso
Escrever o texto do comando e o byte Enter separadamenteA nova linha chega ao buffer como um caractere literal e o CLI responde unknown command, o que parece indicar que o comando não existe

ssh host 'some-command' portanto não funciona: o argumento é ignorado e o prompt interativo inicia de qualquer forma. Use-o como terminal ou não use. scripts/sitecli_ssh_harvest.py é a implementação de referência.

Antes de você digitar qualquer coisa, o banner de login já respondeu a várias das perguntas nas quais você gastaria comandos. De f5-xc-ce-vm-01, arte ASCII e IP público omitidos:

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 um nó ainda inicializando (PROVISIONING) de um que concluiu (PROVISIONED). Software é a string de build que determina quais comandos existem. DNS e NTP cobrem as duas dependências que quebram o registro primeiro, portanto um nó que nunca ficou online geralmente já informou aqui o motivo — antes de chronyc-sources ou dig serem necessários.

  1. Gere um par de chaves, caso ainda não tenha um. Ed25519 em vez de RSA: mais curto e aceito pelo sshd do appliance.

    Terminal window
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. Aponte a implantação para a metade pública. O módulo raiz lê o arquivo uma vez e passa a string para cada nó:

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

    ssh_public_key recebe o material diretamente, que é o que os testes de plano usam. A metade privada nunca sai da sua estação de trabalho.

  3. Aplique. Leia o aviso no topo desta página primeiro — em uma implantação existente, isso substitui as VMs dos CEs.

Cada um desses foi testado e descartado enquanto a rota ainda era considerada impossível. Cada um é plausível o suficiente para custar um dia.

Não é a causaComo foi descartado
A credencial só se aplica no momento da criaçãoO sshd inicia cerca de 90 segundos na primeira inicialização, antes de o objeto do site existir. admin_user_credentials também está presente em ReplaceSpecType e se aplica no local.
block_all_servicesO fechamento da porta 22 no endereço de gerenciamento é idêntico seja os serviços bloqueados ou não.
Uma nova linha no final da chaveTestado de ambas as formas, sem alteração. O cloud-init ainda a remove, porque um bloco literal de outra forma renderizaria uma segunda linha vazia.
Software de CE fixado em versão mais antigaReproduzido em três builds, incluindo um executando OpenSSH 9.9.
Uma admin_password ausenteDefinir admin_password junto com ssh_key em um CE criado do zero não alterou nada.