Uma chave SSH ed25519-sk é uma chave Ed25519 cuja operação de assinatura acontece dentro de uma chave de segurança FIDO2. Cria-se com ssh-keygen -t ed25519-sk, exige um toque na chave em cada início de sessão e só funciona quando o cliente e o servidor correm o OpenSSH 8.2 ou posterior, lançado em fevereiro de 2020.

Em que difere uma chave OpenSSH ed25519-sk de uma chave Ed25519 normal

O OpenSSH suporta Ed25519 desde a versão 6.5 (janeiro de 2014) e a variante FIDO2 ed25519-sk desde a 8.2 (fevereiro de 2020). A diferença está no sítio onde vive o segredo. Com uma chave Ed25519 clássica, ~/.ssh/id_ed25519 é a chave privada: quem a copiar e souber a frase-passe consegue entrar nos seus servidores.

Com ed25519-sk, a assinatura é calculada dentro da chave física. O ficheiro que o ssh-keygen grava no disco, id_ed25519_sk, é um identificador de chave (key handle) inútil sem o dispositivo físico. Cada autenticação exige ainda presença do utilizador: um toque na chave. Roubar o portátil ou o ficheiro deixa de ser suficiente.

O que se mantém: a chave pública vai para o authorized_keys como habitualmente, agora com o tipo [email protected], e as permissões esperadas não mudam: ~/.ssh a 700, authorized_keys e os ficheiros de chave a 600.

Como gerar uma chave ed25519-sk com o ssh-keygen, passo a passo

O comando base é ssh-keygen -t ed25519-sk com a chave FIDO2 ligada; o ssh-keygen pede-lhe que lhe toque durante a geração. Todas as opções -O estão descritas na página oficial do manual do ssh-keygen.

# Non-resident key: the handle stays in ~/.ssh/id_ed25519_sk
ssh-keygen -t ed25519-sk -C "work-key"

# Resident key, PIN required, with its own label
ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:production

# Install the public key on the server
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server

# On another machine: pull the resident keys off the token
ssh-keygen -K

# Or load them straight into ssh-agent
ssh-add -K

As opções que vai realmente usar:

  • -O resident: guarda a credencial no token para a poder recuperar noutra máquina.
  • -O verify-required: além do toque, exige o PIN do token em cada assinatura.
  • -O application=ssh:nome: distingue várias chaves residentes no mesmo token; o valor tem de começar por ssh:.
  • -O no-touch-required: dispensa o toque, mas o servidor só o aceita se a linha do authorized_keys tiver a opção no-touch-required.

-O resident em ed25519-sk: a chave viaja dentro do token FIDO2

Com -O resident, a credencial fica guardada no próprio token FIDO2 e não apenas no ficheiro local. Numa máquina nova, ligue o token e execute ssh-keygen -K, que escreve os ficheiros no diretório atual, ou ssh-add -K para a carregar no agente sem tocar no disco.

A vantagem é deixar de depender do ficheiro de cada máquina. O risco é o reverso: quem tiver o token pode extrair o identificador, por isso proteja-o com um PIN e combine -O resident com -O verify-required. Sem -O resident, perder o id_ed25519_sk significa perder o acesso a partir dessa máquina, mesmo que ainda tenha o token. Os tokens que só implementam U2F não conseguem guardar credenciais residentes.

Que servidores aceitam chaves ed25519-sk: OpenSSH 8.2 ou posterior

Um servidor aceita chaves ed25519-sk se o seu sshd for OpenSSH 8.2 ou posterior. O servidor não precisa de nenhum token ligado; só tem de reconhecer o tipo de chave [email protected]. Verifique antes de retirar a sua chave atual:

# OpenSSH version installed on the server
ssh -V

# Public key algorithms sshd actually accepts
sudo sshd -T | grep -i pubkeyaccepted

# ~/.ssh/authorized_keys line that also requires a PIN
verify-required [email protected] AAAA... work-key

Se [email protected] aparecer na saída de sshd -T, a chave vai funcionar. Para exigir PIN a todos os utilizadores, acrescente PubkeyAuthOptions verify-required ao sshd_config. Um servidor anterior à 8.2 é também anterior à 8.8, a versão que desativou por omissão as assinaturas SHA-1 ssh-rsa, pelo que de qualquer forma já devia ter sido atualizado. A página de notas de versão do OpenSSH indica o que foi incluído em cada versão.

Chaves ed25519-sk versus chaves Ed25519 no telemóvel: tabela comparativa

No computador, ed25519-sk funciona com qualquer OpenSSH 8.2 ou posterior e um token ligado; em iOS e Android depende de o cliente implementar FIDO2 e da forma como o token se liga ao telemóvel. A alternativa habitual no telemóvel é uma chave Ed25519 gerada no próprio dispositivo.

O que se comparaed25519-sk no computadorEd25519 no armazenamento seguro do telemóvel
Onde vive o segredoDentro do token FIDO2No armazenamento seguro do iOS ou do Android
O que precisa para iniciar sessãoToken ligado e um toqueO telemóvel que guarda a chave
OpenSSH mínimo no servidor8.2 (fevereiro de 2020)6.5 (janeiro de 2014)
Se alguém copiar o ficheiroInútil sem o token físicoNo termi1 a chave privada nunca sai do dispositivo
Usar a chave noutra máquinaCom -O resident e ssh-keygen -KGerar uma chave separada por dispositivo

O termi1, o terminal SSH para iOS e Android, segue o segundo modelo: gera a chave no telemóvel, guarda-a no armazenamento seguro do sistema e nunca envia a chave privada para os servidores do termi1; a IA também não abre a sessão nem recebe chaves. Uma configuração sensata é uma chave ed25519-sk para o portátil mais uma chave por telemóvel no authorized_keys, para revogar apenas a que perder. Com o Mosh, a autenticação só acontece na ligação SSH inicial que arranca o mosh-server; mudar de Wi-Fi para dados móveis não a volta a desencadear, e o tmux mantém o que deixou a correr.

4 erros ao configurar chaves ed25519-sk com o OpenSSH

  1. Servidor anterior ao OpenSSH 8.2. O sshd não reconhece o tipo de chave e rejeita-a; mantenha a chave antiga até ter verificado a versão.
  2. Apenas um token FIDO2 registado. Se o perder ou avariar, perde também o acesso. Registe dois tokens, ou um token e uma chave de reserva.
  3. Apagar o id_ed25519_sk de uma chave não residente. Sem -O resident não é possível recuperá-lo do token; faça uma cópia de segurança ou crie a chave como residente.
  4. Fechar a sessão antiga antes de testar. Abra uma segunda ligação com ssh -i ~/.ssh/id_ed25519_sk user@server antes de editar o sshd_config.

Perguntas frequentes

De que versão do OpenSSH preciso para chaves ed25519-sk?

As chaves ed25519-sk exigem o OpenSSH 8.2 ou posterior, lançado em fevereiro de 2020, tanto no cliente que cria e usa a chave como no servidor que a verifica. Confirme a versão instalada com ssh -V e os algoritmos que o servidor aceita com sshd -T.

O que faz -O resident no ssh-keygen?

A opção -O resident do ssh-keygen guarda a credencial FIDO2 na própria chave de segurança, para que possa ser recuperada noutra máquina com ssh-keygen -K ou carregada no agente com ssh-add -K. O ideal é combiná-la com um PIN no token e com -O verify-required.

Alguém pode roubar uma chave ed25519-sk copiando o ficheiro?

Uma chave ed25519-sk não pode ser usada apenas copiando o ficheiro id_ed25519_sk, porque esse ficheiro é só um identificador de chave e a assinatura é calculada dentro do token FIDO2. Iniciar sessão exige o dispositivo físico e, por omissão, um toque em cada autenticação.

Posso usar chaves SSH FIDO2 a partir do telemóvel?

Usar chaves SSH FIDO2 em iOS ou Android depende de o cliente móvel implementar ed25519-sk e da forma como o token se liga ao telemóvel. A alternativa habitual é uma chave Ed25519 gerada no dispositivo e guardada no seu armazenamento seguro, que é como o termi1 funciona.