Certificados SSH: uma experiência SSH melhor
(jpmens.net)- Os certificados SSH resolvem a complicação da autenticação SSH tradicional baseada em chave pública e fornecem confiança automática entre cliente e servidor
- Suportados desde o OpenSSH 5.4, permitem que uma CA (autoridade certificadora) assine chaves de usuário e de host, possibilitando autenticação sem editar o
authorized_keys - Os certificados podem incluir validade, usuários permitidos (principal), IPs de acesso, comando forçado (force-command) etc., oferecendo controle de acesso granular
- O processo de TOFU (Trust on First Use) é eliminado, e é possível se conectar com segurança sem alertas quando a chave de host muda
- Com um servidor de assinatura automática ou ferramentas auxiliares, é possível automatizar a gestão de SSH em ambientes com muitos servidores e melhorar a segurança
Visão geral dos certificados SSH e limitações da autenticação SSH tradicional baseada em chaves
- Ao estabelecer uma conexão SSH, é preciso verificar a impressão digital (fingerprint) da chave de host de um servidor acessado pela primeira vez, mas a maioria dos usuários não faz essa validação e apenas digita “yes”, usando o modelo TOFU (Trust on First Use)
- Administradores podem verificar a impressão digital diretamente no servidor ou com o comando
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key
- Administradores podem verificar a impressão digital diretamente no servidor ou com o comando
- A autenticação baseada em chave pública permite acesso sem senha, mas exige distribuir a chave pública para o arquivo
authorized_keysde cada servidor - Com o agente SSH (
ssh-agent), é possível manter a chave privada na memória e autenticar sem redigitá-la repetidamente - Limitações da abordagem tradicional
- É necessário copiar a chave pública para os servidores de cada usuário
- Quando a chave de host muda, o cliente exibe uma mensagem de alerta
- O TOFU torna a gestão de confiança incômoda
Certificados SSH e autoridade certificadora (CA)
- Os certificados SSH (Certificate) são suportados desde o OpenSSH 5.4 (março de 2010) e estendem o formato tradicional de chave SSH
- Uma CA SSH é composta por um par de chaves SSH, e a chave pública atua como raiz de confiança
- Principais vantagens
- Não é necessário modificar o arquivo
authorized_keysdo servidor - Não há alertas ao trocar chaves de host
- A remoção do processo TOFU permite implementar confiança automática
- É possível incluir no certificado usuários permitidos (principal), IPs permitidos, validade, comando forçado (force-command) etc.
- O acesso é bloqueado automaticamente quando o certificado expira
- Não é necessário modificar o arquivo
Configuração de uma SSH CA e processo de assinatura
- No sistema da CA, gerar um par de chaves da CA com o algoritmo ECDSA
ssh-keygen -t ecdsa -C "SSH CA" -f CA/ssh-ca
- O usuário envia sua chave pública (
*.pub) para a CA, e a CA a assina (sign) para emitir um certificado (*-cert.pub)- Ex.:
ssh-keygen -s CA/ssh-ca -I "Jane Jolie" -n jane -z 001 -V +1w jane.pub
- Ex.:
- Configuração do servidor
- Salvar a chave pública da CA em
/etc/ssh/ssh-ca.pube adicionar a configuraçãoTrustedUserCAKeys - Assinar a chave de host do servidor com a CA (
ssh-keygen -h -s CA/ssh-ca ...) e registrá-la emHostCertificate
- Salvar a chave pública da CA em
- Configuração do cliente
- Adicionar uma linha
@cert-authorityao arquivoknown_hosts - Ex.:
@cert-authority *.example.com $(cat CA/ssh-ca.pub)
- Adicionar uma linha
Conexão e validação com base em certificados SSH
- O usuário se conecta usando o certificado assinado junto com a chave privada (
ssh -i jane -l jane alice.example.com) - Os logs do servidor registram o ID, número de série (serial) e fingerprint da CA do certificado
- É possível adicionar vários nomes de host ou IPs como principal no certificado
- Ao tentar fazer login com um usuário diferente do principal definido no certificado, ocorre o erro “Certificate invalid: name is not a listed principal”
- É possível aplicar controle de acesso detalhado com comando forçado (force-command) ou IP permitido (source-address) no certificado
Checklist de verificação e solução de problemas
-
Itens a verificar no servidor
- Configuração de
TrustedUserCAKeyse presença da chave pública da CA - Assinatura da chave de host e definição de
HostCertificate - É necessário reiniciar o
sshd
- Configuração de
-
Itens a verificar no cliente
- A chave do usuário deve estar assinada pela CA
- A entrada
@cert-authorityemknown_hostse o principal precisam corresponder - Quando o certificado expira, aparece a mensagem “Certificate invalid: expired”
- Quando as restrições do certificado não coincidem, pode haver solicitação de senha
- Ao adicionar o certificado ao agente SSH, tanto a chave quanto o certificado são registrados (
ssh-add jane) - É possível controlar funcionalidades com opções (
-O) no momento da assinatura - Ex.: com
-O clear, remove-se toda permissão e permite-se apenaspermit-agent-forwardingepermit-port-forwarding
Automação de certificados de chave de host
- É possível implementar um servidor de assinatura automática (hkbot) com o módulo Python sshkey-tools e BottlePy
- Executar
hkbot.pyno servidor da CA e assinar automaticamente a chave pública do host quando ela for enviada por requisição HTTP - No cliente, instalar automaticamente com o comando
curl -F hostkey=@/etc/ssh/ssh_host_ed25519_key.pub http://CA:8870 | sh - Aplicar após modificar e validar
/etc/ssh/sshd_configcomsystemctl restart sshd
- Executar
- Depois disso, nas conexões SSH, a confiança automática e o login passam a funcionar com base em certificados
Resumo das vantagens dos certificados SSH
- TOFU desnecessário, com confiança automática entre cliente e servidor
- Emissão de certificados de curta validade para controle de acesso temporário
- Bloqueio automático de acesso ao expirar o certificado, sem necessidade de limpar
authorized_keys - Configuração de políticas detalhadas, como comando forçado, restrição de PTY e controle de IP de acesso
- Ferramentas de automação permitem simplificar a gestão de ambientes com muitos servidores
- O projeto relacionado Smallstep SSH é apresentado
Materiais adicionais de referência
- Diretrizes de segurança do OpenSSH da Mozilla
- Artigo de pesquisa sobre verificação de fingerprint de chave de host SSH baseada em DNS
- Documentação de implementação do suporte a certificados OpenSSH no PuTTY e guia de configuração
Atualização
- Uma SSH CA é especialmente útil em ambientes com servidores próprios e acesso root
- Em sistemas com múltiplos usuários, os métodos tradicionais com
known_hostseauthorized_keysainda continuam necessários - Rascunho de padronização do formato de certificado SSH:
draft-miller-ssh-cert-06
1 comentários
Comentários no Hacker News
É surpreendente que as pessoas ainda usem senha de SSH
Especialmente em ambientes de grandes empresas, várias políticas de senha se misturam, então até acessar um servidor pode levar bastante tempo
Por isso, mesmo que você diga para usarem chaves com
ssh-keygen, a maioria pensa “qualquer dia eu faço” e acaba nunca fazendoMas, na prática, é fácil a gestão virar uma bagunça, como usar uma mesma chave pública em vários servidores ou compartilhar chaves
Pelo menos as senhas têm a vantagem de serem simples
Não há senha, mas no login é preciso tocar fisicamente na Yubikey
A cada poucos meses alguém redescobre os certificados SSH e escreve um post no blog
Eu também escrevi um post relacionado há 15 anos, mas olhando agora ele era incompleto
Até engenheiros de segurança às vezes esquecem que estão usando autenticação por chave, e não certificados SSH
Gerenciar manualmente as chaves de vários servidores é trabalhoso demais
Ainda estou pensando se vale a pena migrar agora
O modelo TOFU (Trust On First Use) é simples, mas vai razoavelmente longe
Nos meus servidores, depois de verificar diretamente a chave do host, isso já basta
Em ambientes corporativos grandes, dá para publicar a lista de chaves públicas dos servidores internos em um site interno assinado por SSL
Mas em ambientes com muitos servidores ou mudanças frequentes, certificados são muito melhores, e o TOFU tem limitações em vários aspectos
Também seria bom se os navegadores avisassem quando a chave TLS de um servidor mudasse
A maioria só digita “yes” e segue em frente
Na empresa, desperdiçamos muito tempo e dinheiro por causa da inspeção SSL da Zscaler
Quando aparece o erro “self-signed certificate in certificate chain”, sempre vira dor de cabeça
Ele injeta seu próprio certificado raiz e bloqueia as configurações do navegador para impedir o uso de proxy
Mesmo que você altere os arquivos de configuração do Firefox ou do Chrome, ele sobrescreve tudo imediatamente
Para desativar pela interface gráfica, é preciso a senha da TI
É só um pouco melhor que o antivírus da Cybereason
Ele quebra todos os protocolos baseados em HTTP
Git, RubyGems, go mod, Nix e muitas outras ferramentas param de funcionar
O fornecedor diz que é “transparente”, mas na prática não é nem um pouco
Leva horas para diagnosticar o problema, e a maioria dos administradores nem sabe o poder destrutivo que isso tem
O texto menciona apenas as vantagens dos certificados de CA, mas as desvantagens também existem claramente
Eu nunca tive problemas de segurança por causa de TOFU
Se certificados SSH têm desvantagens, eu gostaria de saber exatamente quais são
Se quiser reforçar a segurança, você pode trocar a chave pública por um canal seguro, como USB
Mesmo usando certificados, no fim você precisa seguir o mesmo procedimento; a única diferença é que a responsabilidade da gestão sai do usuário e vai para o administrador
Em organizações grandes, certificados podem ser úteis, mas a segurança geral é a mesma
Basta incluí-la no script de instalação ou na imagem de deploy
TOFU só faz sentido ao acessar uma máquina já configurada
No nosso ambiente dev/stg, reinstalamos metade das máquinas todos os dias
Graças aos certificados de host SSH, ficou muito mais prático, sem precisar apagar
known_hostsnem preservar chavesEstou criando uma ferramenta chamada Sshifu como projeto pessoal
É uma ferramenta para facilitar login baseado em certificados SSH e SSO
Você instala o sshifu-server no servidor para usá-lo como CA, e cada servidor SSH é configurado para confiar nessa CA
Para o usuário, basta fazer login com o comando
npx sshifuVeja o repositório no GitHub
Em ambientes de produção reais, acesso baseado em certificados leva a problemas complexos de administração
Surgem várias questões, como expiração de certificados, remoção de usuários e login durante falha de servidor
Na Userify, lidamos com esses problemas há 15 anos, e montar uma infraestrutura estável de autenticação SSH nunca é simples
Adicionei suporte a certificados SSH no pico.sh, e isso foi muito útil porque permitiu implementar controle de acesso no estilo RBAC
Veja a documentação
Em produção, certificados SSH acabam centralizando a complexidade e piorando o problema
Uma única CA precisa estar sempre disponível, e se ela falhar o acesso inteiro é bloqueado
Também há muitos problemas práticos, como ajuste de TTL, gerenciamento da raiz de confiança e dificuldade para depurar
No fim, as pessoas acabam reintroduzindo cache ou agentes
Nós seguimos o caminho oposto: cada nó sincroniza as informações de usuário por HTTPS para o authorized_keys local
Assim dá para manter o controle centralizado, mas com falhas localizadas
A Userify usa esse método, cuidando não só da autenticação como também da gestão de permissões
Certificados sozinhos não resolvem problemas como criação de usuários, papéis de sudo e limpeza de diretórios home