{"id":58,"date":"2026-06-11T21:01:27","date_gmt":"2026-06-11T21:01:27","guid":{"rendered":"https:\/\/shattered.io\/pt\/2026\/06\/11\/autenticacao-ssh-chaves\/"},"modified":"2026-06-11T21:03:49","modified_gmt":"2026-06-11T21:03:49","slug":"autenticacao-ssh-chaves","status":"publish","type":"post","link":"https:\/\/shattered.io\/pt\/2026\/06\/11\/autenticacao-ssh-chaves\/","title":{"rendered":"Autentica\u00e7\u00e3o SSH com Chaves Ed25519: 12 Passos [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A palavra-passe \u00e9 o elo mais fraco de qualquer servidor exposto \u00e0 Internet. Bots automatizados testam milh\u00f5es de combina\u00e7\u00f5es por dia contra a porta 22, e basta uma credencial fraca para comprometer toda a m\u00e1quina. A autentica\u00e7\u00e3o SSH com chaves criptogr\u00e1ficas elimina esse risco: em vez de um segredo que se escreve (e que pode ser adivinhado ou interceptado), usa um par de chaves matem\u00e1ticas em que a parte privada nunca sai do seu computador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste tutorial pr\u00e1tico vai configurar autentica\u00e7\u00e3o SSH baseada em chaves Ed25519 do zero, copiar a chave p\u00fablica para o servidor, desativar por completo o login por palavra-passe e endurecer o servi\u00e7o <code>sshd<\/code> contra ataques de for\u00e7a bruta. No fim ter\u00e1 um servidor Linux acess\u00edvel apenas com a sua chave, protegido por Fail2ban e, opcionalmente, por um segundo fator TOTP. S\u00e3o 12 passos, demoram cerca de 20 minutos e funcionam tanto em Linux e macOS como em Windows com OpenSSH ou PuTTY.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Segundo dados da Okta de janeiro de 2025, a ado\u00e7\u00e3o de autentica\u00e7\u00e3o multifator na for\u00e7a de trabalho chegou a 70%, e os m\u00e9todos resistentes a phishing cresceram 63% num ano. Configurar chaves SSH corretamente coloca os seus servidores nesse grupo mais seguro. Vamos a isso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"o-que-e-a-autenticacao-ssh-e-porque-usar-chaves\">O que \u00e9 a autentica\u00e7\u00e3o SSH e porque usar chaves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O SSH (Secure Shell) \u00e9 o protocolo padr\u00e3o para administra\u00e7\u00e3o remota de servidores. Cifra todo o tr\u00e1fego entre o cliente e o servidor, protegendo comandos, ficheiros e credenciais de quem possa estar a observar a rede. O protocolo base est\u00e1 definido no RFC 4253 e a implementa\u00e7\u00e3o dominante \u00e9 o OpenSSH, presente em praticamente todas as distribui\u00e7\u00f5es Linux, no macOS e, desde 2018, no pr\u00f3prio Windows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existem duas formas principais de provar a sua identidade ao servidor: por palavra-passe ou por chave p\u00fablica. A autentica\u00e7\u00e3o por palavra-passe envia um segredo que o servidor verifica contra a base de dados de utilizadores. A autentica\u00e7\u00e3o SSH por chave usa criptografia assim\u00e9trica: gera um par formado por uma chave privada (que guarda em segredo) e uma chave p\u00fablica (que coloca no servidor). O servidor lan\u00e7a um desafio que s\u00f3 pode ser resolvido por quem possui a chave privada, e essa chave nunca \u00e9 transmitida pela rede.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A diferen\u00e7a de seguran\u00e7a \u00e9 enorme. Uma palavra-passe de 12 caracteres tem entropia limitada e pode ser alvo de for\u00e7a bruta ou de phishing. Uma chave Ed25519 oferece o equivalente a cerca de 128 bits de seguran\u00e7a, imposs\u00edvel de adivinhar com a tecnologia atual. A tabela seguinte resume porque \u00e9 que a autentica\u00e7\u00e3o SSH por chave venceu.<\/p>\n\n\n\n<table><thead><tr><th>Crit\u00e9rio<\/th><th>Palavra-passe<\/th><th>Chave SSH (Ed25519)<\/th><\/tr><\/thead><tbody>\n<tr><td>Resist\u00eancia a for\u00e7a bruta<\/td><td>Baixa (depende do comprimento)<\/td><td>Praticamente total (~128 bits)<\/td><\/tr>\n<tr><td>Vulner\u00e1vel a phishing<\/td><td>Sim<\/td><td>N\u00e3o (a chave privada nunca sai)<\/td><\/tr>\n<tr><td>Transmitida pela rede<\/td><td>Sim (cifrada no t\u00fanel)<\/td><td>Nunca<\/td><\/tr>\n<tr><td>Reutiliza\u00e7\u00e3o entre servi\u00e7os<\/td><td>Comum e perigosa<\/td><td>Cada par \u00e9 \u00fanico<\/td><\/tr>\n<tr><td>Login automatizado (scripts, CI)<\/td><td>Dif\u00edcil e inseguro<\/td><td>Nativo e seguro<\/td><\/tr>\n<tr><td>Pode ser protegida por frase-secreta<\/td><td>N\u00e3o aplic\u00e1vel<\/td><td>Sim (cifra a chave privada)<\/td><\/tr>\n<\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e1 ainda uma vantagem operacional: pode autorizar v\u00e1rias chaves no mesmo servidor e revogar uma sem afetar as outras. Isto facilita gerir acessos de v\u00e1rios administradores ou pipelines de automa\u00e7\u00e3o sem partilhar segredos. Se quiser aprofundar como a cifragem em tr\u00e2nsito protege estas liga\u00e7\u00f5es, veja o nosso artigo sobre <a href=\"\/pt\/security\/https-e-tls\/\">HTTPS e TLS<\/a>, que partilha os mesmos princ\u00edpios de criptografia assim\u00e9trica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pre-requisitos-e-versoes-necessarias\">Pr\u00e9-requisitos e vers\u00f5es necess\u00e1rias<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de come\u00e7ar, confirme que tem o software certo dos dois lados da liga\u00e7\u00e3o. O cliente \u00e9 a m\u00e1quina onde est\u00e1 sentado (o seu port\u00e1til), e o servidor \u00e9 a m\u00e1quina remota a que se quer ligar. Os passos foram testados com as vers\u00f5es abaixo, mas qualquer vers\u00e3o recente do OpenSSH funciona de forma equivalente.<\/p>\n\n\n\n<table><thead><tr><th>Componente<\/th><th>Vers\u00e3o recomendada<\/th><th>Onde corre<\/th><\/tr><\/thead><tbody>\n<tr><td>OpenSSH (cliente e servidor)<\/td><td>9.0 ou superior<\/td><td>Cliente e servidor<\/td><\/tr>\n<tr><td>Linux (servidor)<\/td><td>Ubuntu 24.04 LTS \/ Debian 12<\/td><td>Servidor<\/td><\/tr>\n<tr><td>macOS<\/td><td>14 Sonoma ou superior<\/td><td>Cliente<\/td><\/tr>\n<tr><td>Windows<\/td><td>10 (1809+) ou 11, com OpenSSH<\/td><td>Cliente<\/td><\/tr>\n<tr><td>PuTTY (alternativa Windows)<\/td><td>0.81 ou superior<\/td><td>Cliente<\/td><\/tr>\n<tr><td>Fail2ban<\/td><td>1.0 ou superior<\/td><td>Servidor<\/td><\/tr>\n<tr><td>libpam-google-authenticator<\/td><td>\u00daltima vers\u00e3o dos reposit\u00f3rios<\/td><td>Servidor (opcional, 2FA)<\/td><\/tr>\n<\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">Precisa tamb\u00e9m de: acesso a um servidor com privil\u00e9gios <code>sudo<\/code> (uma VPS, uma Raspberry Pi ou uma m\u00e1quina virtual servem), o endere\u00e7o IP ou nome de dom\u00ednio desse servidor, e um terminal no cliente. Recomenda-se vivamente manter uma segunda sess\u00e3o SSH aberta enquanto endurece a configura\u00e7\u00e3o, para n\u00e3o ficar trancado de fora caso algo corra mal. Vamos referir este conselho mais \u00e0 frente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-1-verificar-a-instalacao-do-openssh\">Passo 1: Verificar a instala\u00e7\u00e3o do OpenSSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comece por confirmar que o cliente OpenSSH est\u00e1 instalado e ver a vers\u00e3o. No terminal do seu computador (Linux, macOS ou PowerShell no Windows), execute:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -V<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A resposta dever\u00e1 ser semelhante a esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OpenSSH_9.6p1, OpenSSL 3.0.13 30 Jan 2024<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se receber um erro a indicar que o comando n\u00e3o foi encontrado no Windows, instale o cliente abrindo o PowerShell como administrador e correndo <code>Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0<\/code>. Em Linux, instale com <code>sudo apt install openssh-client<\/code> (Debian\/Ubuntu) ou <code>sudo dnf install openssh-clients<\/code> (Fedora). No servidor, o servi\u00e7o chama-se <code>openssh-server<\/code>; confirme que est\u00e1 ativo com <code>sudo systemctl status ssh<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-2-escolher-o-algoritmo-de-chave-certo\">Passo 2: Escolher o algoritmo de chave certo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O OpenSSH suporta v\u00e1rios algoritmos para o par de chaves. A escolha afeta seguran\u00e7a, velocidade e compatibilidade. Em 2026, a recomenda\u00e7\u00e3o clara para m\u00e1quinas modernas \u00e9 Ed25519, uma curva el\u00edptica (EdDSA) r\u00e1pida, com chaves pequenas e resistente a v\u00e1rios ataques de implementa\u00e7\u00e3o. Reserve o RSA apenas para sistemas antigos que ainda n\u00e3o suportem Ed25519, e nesse caso use no m\u00ednimo 4096 bits.<\/p>\n\n\n\n<table><thead><tr><th>Algoritmo<\/th><th>Tamanho da chave<\/th><th>Seguran\u00e7a aproximada<\/th><th>Recomenda\u00e7\u00e3o 2026<\/th><\/tr><\/thead><tbody>\n<tr><td>Ed25519<\/td><td>256 bits<\/td><td>~128 bits<\/td><td>Preferido para tudo<\/td><\/tr>\n<tr><td>ECDSA (nistp256)<\/td><td>256 bits<\/td><td>~128 bits<\/td><td>Evitar (curvas NIST)<\/td><\/tr>\n<tr><td>RSA 4096<\/td><td>4096 bits<\/td><td>~128 bits<\/td><td>S\u00f3 para compatibilidade<\/td><\/tr>\n<tr><td>RSA 2048<\/td><td>2048 bits<\/td><td>~112 bits<\/td><td>Desaconselhado<\/td><\/tr>\n<tr><td>DSA<\/td><td>1024 bits<\/td><td>Fraca<\/td><td>Removido do OpenSSH<\/td><\/tr>\n<tr><td>Ed25519-sk (FIDO2)<\/td><td>256 bits + hardware<\/td><td>~128 bits + posse f\u00edsica<\/td><td>Ideal com chave f\u00edsica<\/td><\/tr>\n<\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">O sufixo <code>-sk<\/code> (security key) liga a chave a um dispositivo f\u00edsico FIDO2, como uma YubiKey, exigindo a presen\u00e7a do token para cada autentica\u00e7\u00e3o. \u00c9 a forma mais resistente a phishing de fazer SSH, e voltaremos a ela nas dicas avan\u00e7adas. Por agora, vamos com Ed25519 normal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-3-gerar-o-par-de-chaves-com-ssh-keygen\">Passo 3: Gerar o par de chaves com ssh-keygen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chegou o momento central. A ferramenta <code>ssh-keygen<\/code> cria o par de chaves. Execute no cliente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519 -a 100 -C \"sam@portatil-2026\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O que significa cada op\u00e7\u00e3o: <code>-t ed25519<\/code> define o tipo de chave; <code>-a 100<\/code> aplica 100 rondas de deriva\u00e7\u00e3o \u00e0 frase-secreta (KDF), tornando ataques offline \u00e0 chave privada muito mais lentos; <code>-C<\/code> adiciona um coment\u00e1rio que ajuda a identificar a chave mais tarde. Use um coment\u00e1rio descritivo, como o utilizador e a m\u00e1quina de origem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O programa vai fazer duas perguntas. A primeira \u00e9 o caminho do ficheiro; aceite o padr\u00e3o pressionando Enter. A segunda \u00e9 a frase-secreta (passphrase), que cifra a chave privada no disco. <strong>Defina sempre uma frase-secreta forte.<\/strong> Se a sua chave privada for copiada por algu\u00e9m, a frase-secreta \u00e9 a \u00faltima linha de defesa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Generating public\/private ed25519 key pair.\nEnter file in which to save the key (\/home\/sam\/.ssh\/id_ed25519):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in \/home\/sam\/.ssh\/id_ed25519\nYour public key has been saved in \/home\/sam\/.ssh\/id_ed25519.pub\nThe key fingerprint is:\nSHA256:9zK2c... sam@portatil-2026<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pronto. Acabou de criar dois ficheiros: a chave privada e a chave p\u00fablica. Nunca partilhe a primeira. A documenta\u00e7\u00e3o completa das op\u00e7\u00f5es est\u00e1 no manual oficial do <a href=\"https:\/\/man.openbsd.org\/ssh-keygen\" target=\"_blank\" rel=\"noopener\">ssh-keygen<\/a> do projeto OpenBSD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-4-compreender-os-ficheiros-de-chave\">Passo 4: Compreender os ficheiros de chave<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de avan\u00e7ar, vale a pena perceber o que tem na pasta <code>~\/.ssh<\/code>. Liste o conte\u00fado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -la ~\/.ssh<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-rw-------  1 sam sam  464 jun 11 10:22 id_ed25519\n-rw-r--r--  1 sam sam  100 jun 11 10:22 id_ed25519.pub\n-rw-------  1 sam sam  978 jun 11 10:25 known_hosts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O ficheiro <code>id_ed25519<\/code> \u00e9 a chave privada. Repare nas permiss\u00f5es <code>-rw-------<\/code> (600): apenas o dono pode ler. O OpenSSH recusa-se a usar chaves privadas com permiss\u00f5es demasiado abertas, por motivos de seguran\u00e7a. O ficheiro <code>id_ed25519.pub<\/code> \u00e9 a chave p\u00fablica, em texto, que pode partilhar livremente. O seu conte\u00fado \u00e9 uma \u00fanica linha:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH8k...J2qd sam@portatil-2026<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do lado do servidor, esta linha ser\u00e1 adicionada ao ficheiro <code>~\/.ssh\/authorized_keys<\/code> da conta a que se quer ligar. O servidor consulta esse ficheiro para decidir quem pode entrar. J\u00e1 o ficheiro <code>known_hosts<\/code>, no cliente, guarda as impress\u00f5es digitais dos servidores a que j\u00e1 se ligou, e \u00e9 o que o protege contra ataques de homem-no-meio: se a chave de um servidor mudar inesperadamente, o SSH avisa-o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-5-copiar-a-chave-publica-para-o-servidor\">Passo 5: Copiar a chave p\u00fablica para o servidor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora tem de colocar a chave p\u00fablica no servidor. A forma mais simples \u00e9 a ferramenta <code>ssh-copy-id<\/code>, dispon\u00edvel em Linux e macOS. Esta primeira liga\u00e7\u00e3o ainda usa a palavra-passe da conta (que vamos desativar mais \u00e0 frente):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-copy-id -i ~\/.ssh\/id_ed25519.pub sam@192.0.2.50<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Substitua <code>sam<\/code> pelo nome de utilizador no servidor e <code>192.0.2.50<\/code> pelo IP ou dom\u00ednio. A ferramenta cria a pasta <code>~\/.ssh<\/code> no servidor com as permiss\u00f5es corretas, adiciona a sua chave ao <code>authorized_keys<\/code> e ajusta as permiss\u00f5es. No fim ver\u00e1 uma mensagem a confirmar o n\u00famero de chaves adicionadas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se estiver no Windows sem <code>ssh-copy-id<\/code>, ou preferir o m\u00e9todo manual, copie a chave com um comando \u00fanico. No PowerShell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type $env:USERPROFILE\\.ssh\\id_ed25519.pub | ssh sam@192.0.2.50 \"mkdir -p ~\/.ssh &amp;&amp; chmod 700 ~\/.ssh &amp;&amp; cat &gt;&gt; ~\/.ssh\/authorized_keys &amp;&amp; chmod 600 ~\/.ssh\/authorized_keys\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Em Linux ou macOS, o equivalente manual \u00e9 <code>cat ~\/.ssh\/id_ed25519.pub | ssh sam@192.0.2.50 \"mkdir -p ~\/.ssh &amp;&amp; cat &gt;&gt; ~\/.ssh\/authorized_keys\"<\/code>. Seja qual for o m\u00e9todo, o objetivo \u00e9 o mesmo: a sua linha de chave p\u00fablica fica no <code>authorized_keys<\/code> do servidor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-6-testar-o-login-e-usar-o-ssh-agent\">Passo 6: Testar o login e usar o ssh-agent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Teste imediatamente a nova liga\u00e7\u00e3o por chave, ainda sem desativar nada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh sam@192.0.2.50<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se definiu uma frase-secreta, o sistema vai pedi-la. Se entrou sem que lhe pedissem a palavra-passe da conta, a autentica\u00e7\u00e3o por chave est\u00e1 a funcionar. Escrever a frase-secreta a cada liga\u00e7\u00e3o \u00e9 inc\u00f3modo, e \u00e9 a\u00ed que entra o <code>ssh-agent<\/code>: um processo que guarda a chave desbloqueada em mem\u00f3ria durante a sess\u00e3o. Inicie-o e adicione a chave:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eval \"$(ssh-agent -s)\"\nssh-add ~\/.ssh\/id_ed25519<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No macOS, adicione <code>--apple-use-keychain<\/code> para guardar a frase-secreta no porta-chaves do sistema. No Windows, o agente corre como servi\u00e7o; ative-o com <code>Start-Service ssh-agent<\/code> e <code>Set-Service ssh-agent -StartupType Automatic<\/code> no PowerShell de administrador, e depois <code>ssh-add<\/code>. A partir daqui, as liga\u00e7\u00f5es usam a chave j\u00e1 desbloqueada, sem voltar a pedir a frase-secreta nesta sess\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-7-endurecer-o-sshd_config-no-servidor\">Passo 7: Endurecer o sshd_config no servidor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este \u00e9 o passo mais importante para a seguran\u00e7a. Vamos editar a configura\u00e7\u00e3o do servidor SSH para desativar a autentica\u00e7\u00e3o por palavra-passe e o login direto do utilizador root. <strong>Mantenha a sua sess\u00e3o atual aberta<\/strong> e abra uma segunda liga\u00e7\u00e3o para testar, de modo a recuperar caso bloqueie o acesso. Edite o ficheiro no servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/ssh\/sshd_config<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Localize e altere (ou acrescente) as seguintes diretivas. Remova o cardinal <code>#<\/code> do in\u00edcio caso a linha esteja comentada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PubkeyAuthentication yes\nPasswordAuthentication no\nChallengeResponseAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin no\nPermitEmptyPasswords no\nMaxAuthTries 3\nLoginGraceTime 30\nAllowUsers sam<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A tabela seguinte explica o efeito de cada diretiva, todas documentadas no manual do <a href=\"https:\/\/man.openbsd.org\/sshd_config\" target=\"_blank\" rel=\"noopener\">sshd_config<\/a>.<\/p>\n\n\n\n<table><thead><tr><th>Diretiva<\/th><th>Valor<\/th><th>Efeito<\/th><\/tr><\/thead><tbody>\n<tr><td>PubkeyAuthentication<\/td><td>yes<\/td><td>Permite login por chave<\/td><\/tr>\n<tr><td>PasswordAuthentication<\/td><td>no<\/td><td>Desativa palavras-passe (chave obrigat\u00f3ria)<\/td><\/tr>\n<tr><td>PermitRootLogin<\/td><td>no<\/td><td>Impede login direto como root<\/td><\/tr>\n<tr><td>MaxAuthTries<\/td><td>3<\/td><td>Corta a liga\u00e7\u00e3o ap\u00f3s 3 tentativas<\/td><\/tr>\n<tr><td>LoginGraceTime<\/td><td>30<\/td><td>Fecha sess\u00f5es n\u00e3o autenticadas em 30s<\/td><\/tr>\n<tr><td>AllowUsers<\/td><td>sam<\/td><td>S\u00f3 estes utilizadores podem entrar<\/td><\/tr>\n<tr><td>PermitEmptyPasswords<\/td><td>no<\/td><td>Bloqueia contas sem palavra-passe<\/td><\/tr>\n<\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">Guarde o ficheiro. Antes de reiniciar o servi\u00e7o, valide a sintaxe com <code>sudo sshd -t<\/code>; se n\u00e3o devolver nada, est\u00e1 correto. Depois aplique com <code>sudo systemctl restart ssh<\/code>. Agora abra uma nova janela e teste o login. S\u00f3 feche a sess\u00e3o original depois de confirmar que consegue entrar com a chave.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-8-mudar-a-porta-e-configurar-a-firewall\">Passo 8: Mudar a porta e configurar a firewall<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mudar a porta padr\u00e3o (22) para um n\u00famero alto n\u00e3o \u00e9 seguran\u00e7a real, mas reduz drasticamente o ru\u00eddo dos bots automatizados que s\u00f3 varrem a 22. Combinada com uma firewall, \u00e9 uma camada \u00fatil. Defina a nova porta no <code>sshd_config<\/code> acrescentando, por exemplo, <code>Port 2222<\/code>. De seguida, configure a firewall UFW (comum em Ubuntu) para permitir essa porta antes de reiniciar o servi\u00e7o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 2222\/tcp\nsudo ufw enable\nsudo ufw status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O comando <code>ufw status<\/code> deve listar a porta 2222 como permitida. Reinicie o SSH e ligue-se indicando a porta com <code>ssh -p 2222 sam@192.0.2.50<\/code>. <strong>Aten\u00e7\u00e3o:<\/strong> se n\u00e3o abrir a porta na firewall antes de reiniciar, fica trancado de fora. Por isso mantemos sempre uma sess\u00e3o de reserva aberta. N\u00e3o se esque\u00e7a tamb\u00e9m de atualizar regras na firewall do seu fornecedor de cloud, se existir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para uma defesa de rede mais ampla em torno do servidor, vale a pena conhecer as op\u00e7\u00f5es de VPN. O nosso artigo <a href=\"\/pt\/security\/wireguard-vs-openvpn\/\">WireGuard vs OpenVPN<\/a> compara duas formas de s\u00f3 expor o SSH dentro de um t\u00fanel privado, o que \u00e9 ainda mais seguro do que mudar a porta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-9-bloquear-forca-bruta-com-fail2ban\">Passo 9: Bloquear for\u00e7a bruta com Fail2ban<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mesmo com palavras-passe desativadas, os bots continuam a tentar ligar-se. O Fail2ban monitoriza os registos e bane temporariamente os endere\u00e7os IP com demasiadas tentativas falhadas. Instale-o no servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install fail2ban -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Crie um ficheiro de configura\u00e7\u00e3o local (nunca edite o <code>jail.conf<\/code> diretamente, pois \u00e9 substitu\u00eddo nas atualiza\u00e7\u00f5es):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/fail2ban\/jail.local<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>[sshd]\nenabled = true\nport = 2222\nmaxretry = 3\nfindtime = 600\nbantime = 3600\nbackend = systemd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta configura\u00e7\u00e3o bane um IP por uma hora (<code>bantime = 3600<\/code>) ap\u00f3s 3 tentativas falhadas (<code>maxretry<\/code>) em 10 minutos (<code>findtime<\/code>). Ajuste a <code>port<\/code> se mudou a porta no passo anterior. Ative e reinicie o servi\u00e7o, e verifique o estado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable --now fail2ban\nsudo fail2ban-client status sshd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado mostra quantos IP est\u00e3o banidos e o total de tentativas detetadas. Pode consultar a documenta\u00e7\u00e3o oficial do projeto em <a href=\"https:\/\/www.fail2ban.org\/\" target=\"_blank\" rel=\"noopener\">fail2ban.org<\/a>. Esta camada n\u00e3o substitui a autentica\u00e7\u00e3o por chave, mas reduz o tr\u00e1fego malicioso e protege contra falhas de configura\u00e7\u00e3o futuras.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-10-simplificar-ligacoes-com-o-ficheiro-ssh-config\">Passo 10: Simplificar liga\u00e7\u00f5es com o ficheiro ~\/.ssh\/config<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Escrever <code>ssh -p 2222 sam@192.0.2.50<\/code> de cada vez \u00e9 cansativo. O ficheiro de configura\u00e7\u00e3o do cliente permite definir atalhos. Crie ou edite <code>~\/.ssh\/config<\/code> no seu computador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host servidor-web\n    HostName 192.0.2.50\n    User sam\n    Port 2222\n    IdentityFile ~\/.ssh\/id_ed25519\n    IdentitiesOnly yes\n    AddKeysToAgent yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A partir de agora basta escrever <code>ssh servidor-web<\/code> para se ligar com todas as op\u00e7\u00f5es definidas. A diretiva <code>IdentitiesOnly yes<\/code> garante que o cliente s\u00f3 oferece a chave indicada, evitando o erro comum de o servidor recusar a liga\u00e7\u00e3o por excesso de tentativas quando tem muitas chaves no agente. Pode definir quantos blocos <code>Host<\/code> quiser, um por servidor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verifique as permiss\u00f5es do ficheiro com <code>chmod 600 ~\/.ssh\/config<\/code>. O OpenSSH ignora ficheiros de configura\u00e7\u00e3o com permiss\u00f5es demasiado abertas, tal como faz com as chaves privadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-11-ssh-no-windows-com-putty-e-openssh\">Passo 11: SSH no Windows com PuTTY e OpenSSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O termo PuTTY tem cerca de 2900 pesquisas mensais em Portugal, sinal de que muitos utilizadores Windows ainda recorrem a este cliente cl\u00e1ssico. Embora o Windows 10 e 11 j\u00e1 incluam OpenSSH nativo (que funciona igual aos comandos deste tutorial), o PuTTY continua popular pela sua interface gr\u00e1fica. A diferen\u00e7a est\u00e1 no formato das chaves.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"gerar-e-converter-chaves-com-puttygen\">Gerar e converter chaves com PuTTYgen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O PuTTY usa o seu pr\u00f3prio formato (.ppk). Para gerar uma chave, abra o PuTTYgen, escolha &#8220;EdDSA&#8221; com a curva Ed25519, clique em &#8220;Generate&#8221; e mexa o rato para gerar entropia. Defina uma frase-secreta no campo &#8220;Key passphrase&#8221; e guarde a chave privada como ficheiro .ppk. A chave p\u00fablica no formato OpenSSH aparece na caixa de texto superior, pronta a colar no <code>authorized_keys<\/code> do servidor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se j\u00e1 tem uma chave Ed25519 gerada com <code>ssh-keygen<\/code>, importe o ficheiro <code>id_ed25519<\/code> no PuTTYgen atrav\u00e9s de &#8220;Conversions &gt; Import key&#8221; e exporte-a como .ppk. No cliente PuTTY, indique o ficheiro .ppk em &#8220;Connection &gt; SSH &gt; Auth &gt; Credentials&#8221;. O agente equivalente ao <code>ssh-agent<\/code> chama-se Pageant e guarda a chave desbloqueada para todas as sess\u00f5es PuTTY.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quando-preferir-o-openssh-nativo\">Quando preferir o OpenSSH nativo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para quem trabalha com automa\u00e7\u00e3o ou prefere a linha de comandos, o OpenSSH nativo do Windows \u00e9 a op\u00e7\u00e3o mais simples: usa exatamente os mesmos comandos e ficheiros (<code>~\/.ssh\/config<\/code>, <code>id_ed25519<\/code>) deste tutorial, e integra-se com o Windows Terminal e o VS Code. Para a maioria dos casos novos em 2026, recomenda-se o OpenSSH em vez do PuTTY.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passo-12-adicionar-2fa-com-totp-ao-ssh-opcional\">Passo 12: Adicionar 2FA com TOTP ao SSH (opcional)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para servidores de alto valor, pode combinar a chave SSH com um segundo fator TOTP, exigindo um c\u00f3digo de seis d\u00edgitos do Google Authenticator al\u00e9m da chave. Isto cria autentica\u00e7\u00e3o de dois fatores real ao n\u00edvel do SSH. Instale o m\u00f3dulo PAM no servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install libpam-google-authenticator -y\ngoogle-authenticator<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O assistente faz v\u00e1rias perguntas (responda &#8220;y&#8221; para tokens baseados em tempo) e mostra um c\u00f3digo QR para ler na aplica\u00e7\u00e3o autenticadora. Guarde os c\u00f3digos de recupera\u00e7\u00e3o num local seguro. De seguida, no <code>sshd_config<\/code>, defina <code>KbdInteractiveAuthentication yes<\/code> e adicione <code>AuthenticationMethods publickey,keyboard-interactive<\/code>, que obriga a apresentar a chave <em>e<\/em> o c\u00f3digo. Por fim, edite <code>\/etc\/pam.d\/sshd<\/code> e acrescente a linha <code>auth required pam_google_authenticator.so<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reinicie o servi\u00e7o e teste numa segunda sess\u00e3o. Para perceber a fundo como funciona o TOTP e o padr\u00e3o RFC 6238 por tr\u00e1s destes c\u00f3digos, leia o nosso guia detalhado de <a href=\"\/pt\/security\/autenticacao-dois-fatores-nodejs\/\">autentica\u00e7\u00e3o de dois fatores em Node.js<\/a>. Os princ\u00edpios do segredo partilhado e da janela de tempo s\u00e3o exatamente os mesmos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"como-funciona-o-handshake-ssh-por-dentro\">Como funciona o handshake SSH por dentro<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Perceber o que acontece nos bastidores ajuda a diagnosticar problemas e a confiar na seguran\u00e7a da autentica\u00e7\u00e3o SSH. Quando escreve <code>ssh servidor-web<\/code>, o cliente e o servidor passam por tr\u00eas fases bem definidas antes de lhe darem uma shell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na primeira fase, a negocia\u00e7\u00e3o do protocolo, ambos os lados anunciam as vers\u00f5es e os algoritmos que suportam (cifras, trocas de chave, MAC). \u00c9 aqui que diretivas como <code>PubkeyAcceptedAlgorithms<\/code> entram em a\u00e7\u00e3o. Se o cliente e o servidor n\u00e3o tiverem nenhum algoritmo em comum, a liga\u00e7\u00e3o falha logo nesta etapa, com a mensagem de &#8220;no mutual signature algorithm&#8221; que aparece na tabela de resolu\u00e7\u00e3o de problemas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na segunda fase, a troca de chaves, o cliente e o servidor usam um algoritmo Diffie-Hellman de curva el\u00edptica para acordar uma chave de sess\u00e3o secreta sem nunca a transmitir. \u00c9 tamb\u00e9m aqui que o servidor apresenta a sua chave de m\u00e1quina (host key), que o cliente compara com o <code>known_hosts<\/code>. Se for a primeira liga\u00e7\u00e3o, o SSH mostra-lhe a impress\u00e3o digital e pergunta se confia nela. Confirmar esta impress\u00e3o por um canal seguro \u00e9 o que impede ataques de homem-no-meio. A partir deste ponto, todo o tr\u00e1fego segue cifrado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00f3 na terceira fase, a autentica\u00e7\u00e3o do utilizador, \u00e9 que entra a sua chave. O servidor envia um desafio aleat\u00f3rio; o cliente assina-o com a chave privada (desbloqueada pela frase-secreta ou pelo agente) e devolve a assinatura. O servidor verifica-a com a chave p\u00fablica guardada no <code>authorized_keys<\/code>. Se a assinatura for v\u00e1lida, est\u00e1 autenticado. Repare que a chave privada nunca \u00e9 enviada: apenas uma assinatura que prova a sua posse. \u00c9 por isso que a autentica\u00e7\u00e3o SSH por chave resiste a interce\u00e7\u00e3o, ao contr\u00e1rio da palavra-passe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo de prova por desafio \u00e9 o mesmo princ\u00edpio das assinaturas digitais usadas em certificados e em blockchain. Para uma explica\u00e7\u00e3o mais profunda do conceito de assinar e verificar com pares de chaves, o nosso pilar de <a href=\"\/pt\/security\/\">ciberseguran\u00e7a<\/a> re\u00fane os fundamentos que sustentam o SSH, o TLS e muito mais.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"criar-um-utilizador-dedicado-com-sudo\">Criar um utilizador dedicado com sudo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trabalhar sempre como root \u00e9 um risco desnecess\u00e1rio, e desativ\u00e1mos o login direto de root no passo 7. Antes disso, conv\u00e9m criar um utilizador normal com privil\u00e9gios <code>sudo<\/code> e colocar a sua chave nessa conta. Se ainda estiver a usar a conta root, crie o utilizador no servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo adduser sam\nsudo usermod -aG sudo sam<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O comando <code>adduser<\/code> cria a conta e a pasta pessoal, pedindo uma palavra-passe (necess\u00e1ria apenas para o <code>sudo<\/code>, j\u00e1 que o login remoto passar\u00e1 a usar a chave). O <code>usermod -aG sudo<\/code> adiciona o utilizador ao grupo <code>sudo<\/code>, dando-lhe poder administrativo controlado. Em distribui\u00e7\u00f5es como o CentOS ou o Fedora, o grupo chama-se <code>wheel<\/code> em vez de <code>sudo<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois, copie a sua chave p\u00fablica para esta nova conta (n\u00e3o para a do root) usando o <code>ssh-copy-id sam@192.0.2.50<\/code> do passo 5. Confirme que consegue entrar como <code>sam<\/code> e executar <code>sudo whoami<\/code>, que deve devolver <code>root<\/code> ap\u00f3s pedir a palavra-passe da conta. S\u00f3 depois de validar este fluxo \u00e9 que deve desativar o login de root e a autentica\u00e7\u00e3o por palavra-passe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta separa\u00e7\u00e3o segue o princ\u00edpio do menor privil\u00e9gio: o utilizador normal trata das tarefas do dia a dia e s\u00f3 eleva privil\u00e9gios quando necess\u00e1rio, deixando um rasto de auditoria nos registos do <code>sudo<\/code>. \u00c9 uma defesa simples mas eficaz, alinhada com as recomenda\u00e7\u00f5es de gest\u00e3o de contas que abordamos no guia de <a href=\"\/pt\/security\/seguranca-de-passwords\/\">seguran\u00e7a de palavras-passe<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"gerir-varias-chaves-e-rotacao-de-credenciais\">Gerir v\u00e1rias chaves e rota\u00e7\u00e3o de credenciais<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 medida que acumula servidores e servi\u00e7os, vai querer mais do que uma \u00fanica chave. A boa pr\u00e1tica \u00e9 segmentar: uma chave para acessos pessoais, outra para automa\u00e7\u00e3o, outra para clientes ou projetos espec\u00edficos. Se uma for comprometida, revoga apenas essa, sem afetar o resto. Gere cada par com um nome distinto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519 -f ~\/.ssh\/id_trabalho -C \"sam@trabalho\"\nssh-keygen -t ed25519 -f ~\/.ssh\/id_pessoal -C \"sam@pessoal\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depois associe cada chave ao servidor certo no <code>~\/.ssh\/config<\/code>, indicando o <code>IdentityFile<\/code> correspondente em cada bloco <code>Host<\/code>. Assim, o cliente apresenta sempre a chave certa, sem tentativas falhadas. Para listar as impress\u00f5es digitais de todas as suas chaves de uma vez, use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for k in ~\/.ssh\/id_*; do ssh-keygen -lf \"$k\"; done<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A rota\u00e7\u00e3o de chaves \u00e9 t\u00e3o importante quanto a rota\u00e7\u00e3o de palavras-passe. Defina um calend\u00e1rio (por exemplo, anual) para gerar pares novos, distribu\u00ed-los e remover os antigos do <code>authorized_keys<\/code> dos servidores. Quando um colaborador sai da equipa, a primeira a\u00e7\u00e3o deve ser apagar a sua chave p\u00fablica de todas as m\u00e1quinas. Uma auditoria peri\u00f3dica ao conte\u00fado do <code>authorized_keys<\/code> evita que chaves esquecidas se tornem portas dos fundos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ver de imediato quem tem acesso a um servidor, basta inspecionar o ficheiro: <code>cat ~\/.ssh\/authorized_keys<\/code> lista cada chave autorizada, com o coment\u00e1rio que adicionou ao gerar (por isso \u00e9 \u00fatil usar coment\u00e1rios descritivos). Em ambientes maiores, ferramentas de gest\u00e3o de configura\u00e7\u00e3o como o Ansible automatizam a distribui\u00e7\u00e3o e remo\u00e7\u00e3o de chaves em dezenas de m\u00e1quinas a partir de uma fonte \u00fanica de verdade, eliminando o erro humano.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"erros-comuns-e-como-evita-los\">Erros comuns e como evit\u00e1-los<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Estes s\u00e3o os trope\u00e7\u00f5es mais frequentes ao configurar autentica\u00e7\u00e3o SSH por chave. Conhec\u00ea-los poupa horas de frustra\u00e7\u00e3o.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ficar trancado de fora.<\/strong> Desativar a palavra-passe ou mudar a porta sem testar primeiro numa segunda sess\u00e3o \u00e9 o erro mais perigoso. Mantenha sempre uma liga\u00e7\u00e3o ativa enquanto altera o <code>sshd_config<\/code> e valide com <code>sudo sshd -t<\/code>.<\/li>\n<li><strong>Permiss\u00f5es erradas.<\/strong> O OpenSSH recusa chaves e ficheiros com permiss\u00f5es demasiado abertas. A pasta <code>~\/.ssh<\/code> deve ser 700, a chave privada e o <code>authorized_keys<\/code> devem ser 600. Use <code>chmod<\/code> para corrigir.<\/li>\n<li><strong>Confundir chave p\u00fablica e privada.<\/strong> S\u00f3 a chave p\u00fablica (<code>.pub<\/code>) vai para o servidor. Enviar a chave privada compromete-a por completo e obriga a gerar um par novo.<\/li>\n<li><strong>N\u00e3o usar frase-secreta.<\/strong> Uma chave privada sem frase-secreta \u00e9 como uma palavra-passe escrita num papel: quem copiar o ficheiro entra de imediato. Use sempre uma frase forte.<\/li>\n<li><strong>Esquecer a firewall do fornecedor.<\/strong> Abrir a porta no UFW n\u00e3o basta se o painel da cloud (AWS, Hetzner, OVH) tiver as suas pr\u00f3prias regras. Atualize ambos.<\/li>\n<li><strong>Copiar a chave com quebras de linha.<\/strong> Ao colar manualmente a chave p\u00fablica, certifique-se de que fica numa \u00fanica linha no <code>authorized_keys<\/code>. Quebras de linha invalidam-na.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"resolucao-de-problemas-de-autenticacao-ssh\">Resolu\u00e7\u00e3o de problemas de autentica\u00e7\u00e3o SSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando uma liga\u00e7\u00e3o falha, o primeiro passo \u00e9 ligar com sa\u00edda detalhada usando <code>ssh -vvv sam@192.0.2.50<\/code>. As mensagens revelam exatamente onde a autentica\u00e7\u00e3o parou. A tabela abaixo re\u00fane os problemas mais comuns e a respetiva solu\u00e7\u00e3o.<\/p>\n\n\n\n<table><thead><tr><th>Sintoma \/ mensagem<\/th><th>Causa prov\u00e1vel<\/th><th>Solu\u00e7\u00e3o<\/th><\/tr><\/thead><tbody>\n<tr><td>Permission denied (publickey)<\/td><td>Chave n\u00e3o est\u00e1 no authorized_keys ou ficheiro errado<\/td><td>Verifique o conte\u00fado e use <code>-i<\/code> para indicar a chave<\/td><\/tr>\n<tr><td>Connection refused<\/td><td>Servi\u00e7o SSH parado ou porta errada<\/td><td>Confirme <code>systemctl status ssh<\/code> e a porta<\/td><\/tr>\n<tr><td>Connection timed out<\/td><td>Firewall a bloquear ou IP errado<\/td><td>Verifique UFW e regras da cloud<\/td><\/tr>\n<tr><td>Bad permissions on private key<\/td><td>Permiss\u00f5es abertas demais<\/td><td><code>chmod 600 ~\/.ssh\/id_ed25519<\/code><\/td><\/tr>\n<tr><td>Too many authentication failures<\/td><td>Agente a oferecer muitas chaves<\/td><td>Adicione <code>IdentitiesOnly yes<\/code> ao config<\/td><\/tr>\n<tr><td>Host key verification failed<\/td><td>Chave do servidor mudou<\/td><td>Remova a linha antiga do <code>known_hosts<\/code><\/td><\/tr>\n<tr><td>Agent admitted failure to sign<\/td><td>Chave n\u00e3o carregada no agente<\/td><td>Corra <code>ssh-add ~\/.ssh\/id_ed25519<\/code><\/td><\/tr>\n<tr><td>no mutual signature algorithm<\/td><td>Algoritmo desativado no servidor<\/td><td>Atualize o servidor ou ajuste <code>PubkeyAcceptedAlgorithms<\/code><\/td><\/tr>\n<\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">Se for mesmo bloqueado, a maioria dos fornecedores de cloud oferece uma consola web (VNC ou serial) que d\u00e1 acesso \u00e0 m\u00e1quina sem SSH. Use-a para repor o <code>sshd_config<\/code> ou reativar temporariamente a palavra-passe. Manter um snapshot recente do servidor tamb\u00e9m ajuda a recuperar de configura\u00e7\u00f5es irrevers\u00edveis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dicas-avancadas-para-autenticacao-ssh\">Dicas avan\u00e7adas para autentica\u00e7\u00e3o SSH<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"saltar-para-servidores-internos-com-proxyjump\">Saltar para servidores internos com ProxyJump<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para chegar a m\u00e1quinas numa rede privada atrav\u00e9s de um servidor de salto (bastion), use o ProxyJump no <code>~\/.ssh\/config<\/code>: <code>ProxyJump bastion<\/code> numa entrada de host faz o SSH encaminhar a liga\u00e7\u00e3o automaticamente. \u00c9 mais seguro do que o antigo encaminhamento de agente (<code>ForwardAgent<\/code>), que deve evitar por expor a sua chave a servidores interm\u00e9dios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"chaves-de-hardware-fido2-sk-ed25519\">Chaves de hardware FIDO2 (sk-ed25519)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A forma mais resistente a phishing de fazer SSH \u00e9 ligar a chave a um token f\u00edsico. Gere-a com <code>ssh-keygen -t ed25519-sk<\/code> com uma YubiKey ligada. A chave privada fica protegida pelo hardware e cada autentica\u00e7\u00e3o exige tocar no dispositivo, tornando o roubo remoto imposs\u00edvel. Os dados da Okta mostram que os autenticadores resistentes a phishing cresceram 63% no \u00faltimo ano, e esta \u00e9 a aplica\u00e7\u00e3o dessa tend\u00eancia ao SSH.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"certificados-ssh-para-escala\">Certificados SSH para escala<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Em organiza\u00e7\u00f5es com dezenas de servidores, gerir o <code>authorized_keys<\/code> de cada m\u00e1quina n\u00e3o escala. Os certificados SSH permitem que uma autoridade certificadora (CA) assine chaves com validade limitada, eliminando a distribui\u00e7\u00e3o manual. Combine-os com o princ\u00edpio de rota\u00e7\u00e3o regular: gere chaves novas periodicamente e revogue as antigas, \u00e0 semelhan\u00e7a das boas pr\u00e1ticas de gest\u00e3o de credenciais.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"boas-praticas-de-seguranca-ssh-em-2026\">Boas pr\u00e1ticas de seguran\u00e7a SSH em 2026<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reunindo tudo, eis a lista de verifica\u00e7\u00e3o que deve seguir em qualquer servidor de produ\u00e7\u00e3o. Trate a chave privada como um segredo cr\u00edtico e nunca a copie para m\u00e1quinas em que n\u00e3o confia plenamente.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Ed25519 e proteja sempre a chave privada com uma frase-secreta forte.<\/li>\n<li>Desative por completo a autentica\u00e7\u00e3o por palavra-passe (<code>PasswordAuthentication no<\/code>).<\/li>\n<li>Pro\u00edba o login direto como root (<code>PermitRootLogin no<\/code>) e use <code>sudo<\/code>.<\/li>\n<li>Limite quem pode entrar com <code>AllowUsers<\/code> ou <code>AllowGroups<\/code>.<\/li>\n<li>Instale Fail2ban e mantenha o OpenSSH atualizado para corrigir vulnerabilidades.<\/li>\n<li>Para acessos sens\u00edveis, adicione 2FA TOTP ou uma chave de hardware FIDO2.<\/li>\n<li>Fa\u00e7a auditorias regulares ao <code>authorized_keys<\/code> e remova chaves obsoletas.<\/li>\n<li>Considere expor o SSH apenas dentro de uma VPN, em vez de o deixar na Internet aberta.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A seguran\u00e7a de um servidor depende sempre da camada mais fraca. Combinar chaves fortes, um <code>sshd<\/code> endurecido e monitoriza\u00e7\u00e3o de tentativas falhadas coloca-o muito \u00e0 frente da grande maioria das m\u00e1quinas expostas. Para o contexto mais amplo de como os atacantes entram nos sistemas, vale a pena rever como ocorrem as <a href=\"\/pt\/security\/violacoes-de-dados\/\">viola\u00e7\u00f5es de dados<\/a> e quanto a m\u00e1 gest\u00e3o de credenciais contribui para elas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"leitura-relacionada\">Leitura Relacionada<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/pt\/security\/\">Ciberseguran\u00e7a: o nosso pilar de seguran\u00e7a online<\/a><\/li>\n<li><a href=\"\/pt\/security\/seguranca-de-passwords\/\">Seguran\u00e7a de Palavras-passe: Guia Pr\u00e1tico<\/a><\/li>\n<li><a href=\"\/pt\/security\/autenticacao-dois-fatores-nodejs\/\">Autentica\u00e7\u00e3o de Dois Fatores em Node.js: 12 Passos<\/a><\/li>\n<li><a href=\"\/pt\/security\/https-e-tls\/\">HTTPS e TLS: O que o Cadeado Protege<\/a><\/li>\n<li><a href=\"\/pt\/security\/wireguard-vs-openvpn\/\">WireGuard vs OpenVPN: Compara\u00e7\u00e3o de Desempenho<\/a><\/li>\n<li><a href=\"\/pt\/security\/violacoes-de-dados\/\">Viola\u00e7\u00f5es de Dados: Como Acontecem e Como se Proteger<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"perguntas-frequentes-sobre-autenticacao-ssh\">Perguntas Frequentes sobre autentica\u00e7\u00e3o SSH<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"posso-usar-a-mesma-chave-ssh-em-varios-servidores\">Posso usar a mesma chave SSH em v\u00e1rios servidores?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sim. A mesma chave p\u00fablica pode ser adicionada ao <code>authorized_keys<\/code> de quantos servidores quiser, e a chave privada fica sempre no seu computador. Muitos administradores preferem, no entanto, chaves diferentes por contexto (trabalho, pessoal, automa\u00e7\u00e3o) para limitar o impacto caso uma seja comprometida e poder revog\u00e1-la isoladamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"o-que-faco-se-perder-a-chave-privada\">O que fa\u00e7o se perder a chave privada?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sem a chave privada n\u00e3o consegue entrar nos servidores que a usavam. Se ainda tiver acesso por outra via (consola da cloud, segunda chave), remova a chave p\u00fablica perdida do <code>authorized_keys<\/code> e adicione uma nova. Por isso \u00e9 boa pr\u00e1tica autorizar uma segunda chave de recupera\u00e7\u00e3o guardada em local seguro, ou manter acesso \u00e0 consola web do fornecedor.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ed25519-ou-rsa-qual-devo-escolher\">Ed25519 ou RSA: qual devo escolher?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Escolha Ed25519 em todos os sistemas modernos. \u00c9 mais r\u00e1pido, gera chaves mais pequenas e \u00e9 resistente a v\u00e1rias falhas de implementa\u00e7\u00e3o. Use RSA 4096 apenas se precisar de se ligar a equipamento antigo que n\u00e3o suporte Ed25519, como alguns routers ou sistemas embebidos mais velhos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"e-seguro-desativar-totalmente-a-palavra-passe\">\u00c9 seguro desativar totalmente a palavra-passe?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sim, \u00e9 precisamente a recomenda\u00e7\u00e3o. Com <code>PasswordAuthentication no<\/code>, os ataques de for\u00e7a bruta deixam de ter qualquer hip\u00f3tese, pois nenhuma palavra-passe \u00e9 aceite. O \u00fanico requisito \u00e9 garantir que tem a chave configurada e testada antes de desativar, e idealmente uma chave de recupera\u00e7\u00e3o ou acesso \u00e0 consola.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mudar-a-porta-22-melhora-mesmo-a-seguranca\">Mudar a porta 22 melhora mesmo a seguran\u00e7a?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mudar a porta n\u00e3o impede um atacante determinado, que faz uma an\u00e1lise de portas em segundos. O benef\u00edcio real \u00e9 reduzir o volume de tentativas autom\u00e1ticas e o ru\u00eddo nos registos, j\u00e1 que a maioria dos bots s\u00f3 varre a porta 22. Trate-a como uma camada complementar, nunca como substituta da autentica\u00e7\u00e3o por chave.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"como-adiciono-autenticacao-ssh-a-pipelines-de-ci-cd\">Como adiciono autentica\u00e7\u00e3o SSH a pipelines de CI\/CD?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gere uma chave dedicada, sem frase-secreta (ou com uma gerida pelo sistema de segredos), e adicione a chave p\u00fablica ao servidor de destino. Guarde a chave privada nas vari\u00e1veis de segredo do seu sistema de CI (GitHub Actions, GitLab CI), nunca no reposit\u00f3rio. Restrinja essa chave com a op\u00e7\u00e3o <code>command=<\/code> no <code>authorized_keys<\/code> para que s\u00f3 possa executar a a\u00e7\u00e3o pretendida.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"o-windows-precisa-do-putty-para-fazer-ssh\">O Windows precisa do PuTTY para fazer SSH?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o. Desde o Windows 10 vers\u00e3o 1809, o cliente OpenSSH vem inclu\u00eddo e usa os mesmos comandos deste tutorial. O PuTTY continua a ser uma op\u00e7\u00e3o v\u00e1lida e popular pela interface gr\u00e1fica e pelo Pageant, mas para novos projetos o OpenSSH nativo costuma ser mais simples e integra-se melhor com ferramentas como o VS Code e o Windows Terminal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"como-faco-uma-copia-de-seguranca-das-minhas-chaves-ssh\">Como fa\u00e7o uma c\u00f3pia de seguran\u00e7a das minhas chaves SSH?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Copie a pasta <code>~\/.ssh<\/code> para um suporte cifrado e offline, como uma pen protegida com VeraCrypt ou um gestor de palavras-passe que aceite ficheiros. Nunca guarde a chave privada num servi\u00e7o de cloud sem cifragem adicional, nem a envie por email ou mensagem. Como a chave j\u00e1 est\u00e1 protegida por uma frase-secreta, mesmo que o suporte se perca, um atacante ainda teria de a quebrar. Ainda assim, trate o backup com o mesmo cuidado que daria a uma chave de casa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"o-ssh-e-seguro-contra-computacao-quantica\">O SSH \u00e9 seguro contra computa\u00e7\u00e3o qu\u00e2ntica?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As chaves Ed25519 e RSA atuais n\u00e3o s\u00e3o resistentes a um computador qu\u00e2ntico de grande escala, que ainda n\u00e3o existe mas \u00e9 uma preocupa\u00e7\u00e3o a longo prazo. O OpenSSH j\u00e1 introduziu trocas de chave h\u00edbridas p\u00f3s-qu\u00e2nticas para proteger o segredo da sess\u00e3o contra ataques de &#8220;guardar agora, decifrar depois&#8221;. Para administra\u00e7\u00e3o normal em 2026, as chaves Ed25519 continuam perfeitamente seguras; vale a pena acompanhar a evolu\u00e7\u00e3o dos algoritmos p\u00f3s-qu\u00e2nticos \u00e0 medida que o NIST os padroniza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com estes 12 passos tem um servidor com autentica\u00e7\u00e3o SSH por chave, palavra-passe desativada, firewall configurada e prote\u00e7\u00e3o contra for\u00e7a bruta. \u00c9 a base de qualquer infraestrutura segura. Consulte sempre a documenta\u00e7\u00e3o oficial do <a href=\"https:\/\/www.openssh.com\/\" target=\"_blank\" rel=\"noopener\">OpenSSH<\/a> e o gloss\u00e1rio do <a href=\"https:\/\/csrc.nist.gov\/glossary\/term\/ssh\" target=\"_blank\" rel=\"noopener\">NIST sobre SSH<\/a> para se manter atualizado sobre novas diretivas e algoritmos recomendados.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A palavra-passe \u00e9 o elo mais fraco de qualquer servidor exposto \u00e0 Internet. Bots automatizados testam milh\u00f5es de combina\u00e7\u00f5es por dia contra a porta 22, e basta uma credencial fraca\u2026<\/p>\n","protected":false},"author":9,"featured_media":59,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security"],"_links":{"self":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":60,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/58\/revisions\/60"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/media\/59"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}