Pesquisa de site

Como configurar a autenticação baseada em chave SSH em um servidor Linux


Introdução

SSH, ou shell seguro, é um protocolo criptografado usado para administrar e se comunicar com servidores. Ao trabalhar com um servidor Linux, muitas vezes você pode gastar muito do seu tempo em uma sessão de terminal conectada ao seu servidor por meio de SSH.

Embora existam algumas maneiras diferentes de fazer login em um servidor SSH, neste guia, vamos nos concentrar na configuração de chaves SSH. As chaves SSH fornecem uma maneira extremamente segura de fazer login em seu servidor. Por esse motivo, esse é o método que recomendamos para todos os usuários.

Como funcionam as chaves SSH?

Um servidor SSH pode autenticar clientes usando uma variedade de métodos diferentes. A mais básica delas é a autenticação por senha, que é fácil de usar, mas não é a mais segura.

Embora as senhas sejam enviadas ao servidor de maneira segura, elas geralmente não são complexas ou longas o suficiente para resistir a ataques repetidos e persistentes. O poder de processamento moderno combinado com scripts automatizados torna muito possível a força bruta de uma conta protegida por senha. Embora existam outros métodos para adicionar segurança adicional (fail2ban, etc.), as chaves SSH provam ser uma alternativa confiável e segura.

Os pares de chaves SSH são duas chaves criptograficamente seguras que podem ser usadas para autenticar um cliente em um servidor SSH. Cada par de chaves consiste em uma chave pública e uma chave privada.

A chave privada é retida pelo cliente e deve ser mantida em absoluto segredo. Qualquer comprometimento da chave privada permitirá que o invasor faça login em servidores configurados com a chave pública associada sem autenticação adicional. Como precaução adicional, a chave pode ser criptografada no disco com uma senha.

A chave pública associada pode ser compartilhada livremente sem quaisquer consequências negativas. A chave pública pode ser usada para criptografar mensagens que somente a chave privada pode descriptografar. Essa propriedade é empregada como uma forma de autenticação usando o par de chaves.

A chave pública é carregada em um servidor remoto no qual você deseja fazer login com SSH. A chave é adicionada a um arquivo especial dentro da conta de usuário na qual você fará login, chamado ~/.ssh/authorized_keys.

Quando um cliente tenta autenticar usando chaves SSH, o servidor pode testar o cliente para saber se ele possui a chave privada. Se o cliente puder provar que possui a chave privada, uma sessão de shell é gerada ou o comando solicitado é executado.

Etapa 1 — Criando chaves SSH

A primeira etapa para configurar a autenticação de chave SSH em seu servidor é gerar um par de chaves SSH em seu computador local.

Para fazer isso, podemos usar um utilitário especial chamado ssh-keygen, que está incluído no conjunto de ferramentas OpenSSH padrão. Por padrão, isso criará um par de chaves RSA de 3072 bits.

Em seu computador local, gere um par de chaves SSH digitando:

  1. ssh-keygen
Output
Generating public/private rsa key pair. Enter file in which to save the key (/home/username/.ssh/id_rsa):

O utilitário solicitará que você selecione um local para as chaves que serão geradas. Por padrão, as chaves serão armazenadas no diretório ~/.ssh dentro do diretório inicial do usuário. A chave privada será chamada id_rsa e a chave pública associada será chamada id_rsa.pub.

Normalmente, é melhor ficar com o local padrão neste estágio. Isso permitirá que seu cliente SSH encontre automaticamente suas chaves SSH ao tentar autenticar. Se você quiser escolher um caminho não padrão, digite-o agora, caso contrário, pressione ENTER para aceitar o padrão.

Se você gerou anteriormente um par de chaves SSH, poderá ver um prompt semelhante a este:

Output
/home/username/.ssh/id_rsa already exists. Overwrite (y/n)?

Se você optar por substituir a chave no disco, não poderá mais autenticar usando a chave anterior. Tenha muito cuidado ao selecionar sim, pois este é um processo destrutivo que não pode ser revertido.

Output
Created directory '/home/username/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again:

Em seguida, você será solicitado a inserir uma senha para a chave. Esta é uma senha opcional que pode ser usada para criptografar o arquivo de chave privada no disco.

Você pode estar se perguntando quais vantagens uma chave SSH oferece se você ainda precisar inserir uma frase secreta. Algumas das vantagens são:

  • A chave SSH privada (a parte que pode ser protegida por senha) nunca é exposta na rede. A senha é usada apenas para descriptografar a chave na máquina local. Isso significa que força bruta baseada em rede não será possível contra a senha.
  • A chave privada é mantida em um diretório restrito. O cliente SSH não reconhecerá chaves privadas que não sejam mantidas em diretórios restritos. A própria chave também deve ter permissões restritas (leitura e gravação disponíveis apenas para o proprietário). Isso significa que outros usuários do sistema não podem bisbilhotar.
  • Qualquer invasor que pretenda quebrar a senha da chave SSH privada já deve ter acesso ao sistema. Isso significa que eles já terão acesso à sua conta de usuário ou à conta root. Se você estiver nessa posição, a senha pode impedir que o invasor faça logon imediatamente em seus outros servidores. Esperamos que isso lhe dê tempo para criar e implementar um novo par de chaves SSH e remover o acesso da chave comprometida.

Como a chave privada nunca é exposta à rede e é protegida por permissões de arquivo, esse arquivo nunca deve ser acessível a ninguém além de você (e do usuário root). A senha serve como uma camada adicional de proteção caso essas condições sejam comprometidas.

Uma senha é uma adição opcional. Se você inserir uma, terá que fornecê-la sempre que usar essa chave (a menos que esteja executando um software de agente SSH que armazena a chave descriptografada). Recomendamos o uso de uma frase secreta, mas se você não deseja definir uma frase secreta, pode pressionar ENTER para ignorar este prompt.

Output
Your identification has been saved in /home/username/.ssh/id_rsa. Your public key has been saved in /home/username/.ssh/id_rsa.pub. The key fingerprint is: SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname The key's randomart image is: +---[RSA 3072]----+ |o ..oo.++o .. | | o o +o.o.+... | |. . + oE.o.o . | | . . oo.B+ .o | | . .=S.+ + | | . o..* | | .+= o | | .=.+ | | .oo+ | +----[SHA256]-----+

Agora você tem uma chave pública e privada que pode usar para autenticar. A próxima etapa é colocar a chave pública em seu servidor para que você possa usar a autenticação de chave SSH para efetuar login.

Etapa 2 — Copiando uma chave pública SSH para o seu servidor

Observação: uma versão anterior deste tutorial continha instruções para adicionar uma chave pública SSH à sua conta da DigitalOcean. Essas instruções agora podem ser encontradas na seção Chaves SSH da documentação do produto DigitalOcean.

Existem várias maneiras de fazer upload de sua chave pública para seu servidor SSH remoto. O método que você usa depende muito das ferramentas disponíveis e dos detalhes de sua configuração atual.

Todos os métodos a seguir produzem o mesmo resultado final. O método mais simples e automatizado é descrito primeiro, e os seguintes requerem etapas manuais adicionais. Você deve segui-los apenas se não conseguir usar os métodos anteriores.

Copiando sua chave pública usando ssh-copy-id

A maneira mais simples de copiar sua chave pública para um servidor existente é usar um utilitário chamado ssh-copy-id. Devido à sua simplicidade, este método é recomendado, se disponível.

A ferramenta ssh-copy-id está incluída nos pacotes OpenSSH em muitas distribuições, então você pode já tê-la disponível em seu sistema local. Para que esse método funcione, você deve ter acesso SSH baseado em senha ao seu servidor.

Para usar o utilitário, você precisa especificar o host remoto ao qual gostaria de se conectar e a conta de usuário à qual você tem acesso SSH baseado em senha. Esta é a conta onde sua chave SSH pública será copiada.

A sintaxe é:

  1. ssh-copy-id username@remote_host

Você pode ver uma mensagem como esta:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

Isso significa que seu computador local não reconhece o host remoto. Isso acontecerá na primeira vez que você se conectar a um novo host. Digite yes e pressione ENTER para continuar.

Em seguida, o utilitário examinará sua conta local em busca da chave id_rsa.pub que criamos anteriormente. Ao encontrar a chave, ele solicitará a senha da conta do usuário remoto:

Output
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys username@203.0.113.1's password:

Digite a senha (sua digitação não será exibida para fins de segurança) e pressione ENTER. O utilitário se conectará à conta no host remoto usando a senha que você forneceu. Ele então copiará o conteúdo de sua chave ~/.ssh/id_rsa.pub para um arquivo no diretório inicial ~/.ssh da conta remota chamado authorized_keys.

Você verá uma saída parecida com esta:

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'username@203.0.113.1'" and check to make sure that only the key(s) you wanted were added.

Neste ponto, sua chave id_rsa.pub foi enviada para a conta remota. Você pode continuar na próxima seção.

Copiando sua chave pública usando SSH

Se você não tiver ssh-copy-id disponível, mas tiver acesso SSH baseado em senha a uma conta em seu servidor, poderá fazer upload de suas chaves usando um método SSH convencional.

Podemos fazer isso gerando o conteúdo de nossa chave SSH pública em nosso computador local e canalizando-o por meio de uma conexão SSH para o servidor remoto. Por outro lado, podemos ter certeza de que o diretório ~/.ssh existe na conta que estamos usando e, em seguida, enviar o conteúdo que canalizamos para um arquivo chamado authorized_keys dentro deste diretório.

Usaremos o símbolo de redirecionamento >> para anexar o conteúdo em vez de substituí-lo. Isso nos permitirá adicionar chaves sem destruir as chaves adicionadas anteriormente.

O comando completo ficará assim:

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Você pode ver uma mensagem como esta:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

Isso significa que seu computador local não reconhece o host remoto. Isso acontecerá na primeira vez que você se conectar a um novo host. Digite yes e pressione ENTER para continuar.

Em seguida, você será solicitado a fornecer a senha da conta à qual está tentando se conectar:

Output
username@203.0.113.1's password:

Depois de inserir sua senha, o conteúdo de sua chave id_rsa.pub será copiado para o final do arquivo authorized_keys da conta do usuário remoto. Continue para a próxima seção se isso foi bem-sucedido.

Copiando sua chave pública manualmente

Se você não tiver acesso SSH baseado em senha ao seu servidor disponível, você terá que fazer o processo acima manualmente.

O conteúdo do seu arquivo id_rsa.pub terá que ser adicionado a um arquivo em ~/.ssh/authorized_keys em sua máquina remota de alguma forma.

Para exibir o conteúdo de sua chave id_rsa.pub, digite isto em seu computador local:

  1. cat ~/.ssh/id_rsa.pub

Você verá o conteúdo da chave, que pode ser mais ou menos assim:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@hostname

Acesse seu host remoto usando qualquer método disponível. Pode ser um console baseado na Web fornecido pelo seu provedor de infraestrutura.

Observação: se você estiver usando um Droplet da DigitalOcean, consulte a documentação do Console de Recuperação nos documentos do produto da DigitalOcean.

Uma vez que você tenha acesso à sua conta no servidor remoto, certifique-se de que o diretório ~/.ssh foi criado. Este comando criará o diretório, se necessário, ou não fará nada se já existir:

  1. mkdir -p ~/.ssh

Agora, você pode criar ou modificar o arquivo authorized_keys dentro deste diretório. Você pode adicionar o conteúdo do seu arquivo id_rsa.pub ao final do arquivo authorized_keys, criando-o se necessário, usando isto:

  1. echo public_key_string >> ~/.ssh/authorized_keys

No comando acima, substitua public_key_string pela saída do comando cat ~/.ssh/id_rsa.pub que você executou em seu local sistema. Deve começar com ssh-rsa AAAA... ou similar.

Se isso funcionar, você poderá testar sua nova autenticação SSH baseada em chave.

Etapa 3 — Autenticando seu servidor usando chaves SSH

Se você concluiu com êxito um dos procedimentos acima, poderá fazer login no host remoto sem a senha da conta remota.

O processo é basicamente o mesmo:

  1. ssh username@remote_host

Se esta é a primeira vez que você se conecta a este host (se você usou o último método acima), você pode ver algo como isto:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

Isso significa que seu computador local não reconhece o host remoto. Digite yes e pressione ENTER para continuar.

Se você não forneceu uma senha para sua chave privada, você será conectado imediatamente. Se você forneceu uma senha para a chave privada quando criou a chave, será necessário inseri-la agora. Posteriormente, uma nova sessão de shell será criada para você com a conta no sistema remoto.

Se for bem-sucedido, continue para descobrir como bloquear o servidor.

Etapa 4 — Desativando a autenticação por senha em seu servidor

Se você conseguiu fazer login em sua conta usando SSH sem uma senha, você configurou com êxito a autenticação baseada em chave SSH em sua conta. No entanto, seu mecanismo de autenticação baseado em senha ainda está ativo, o que significa que seu servidor ainda está exposto a ataques de força bruta.

Antes de concluir as etapas desta seção, certifique-se de ter a autenticação baseada em chave SSH configurada para a conta root neste servidor ou, preferencialmente, que você tenha a autenticação baseada em chave SSH configurada para uma conta neste servidor com sudo acesso. Esta etapa bloqueará logins baseados em senha, portanto, é essencial garantir que você ainda consiga obter acesso administrativo.

Quando as condições acima forem verdadeiras, faça login em seu servidor remoto com chaves SSH, como root ou com uma conta com privilégios sudo. Abra o arquivo de configuração do daemon SSH:

  1. sudo nano /etc/ssh/sshd_config

Dentro do arquivo, procure por uma diretiva chamada PasswordAuthentication. Isso pode ser comentado. Descomente a linha removendo qualquer # no início da linha e defina o valor como no. Isso desativará sua capacidade de fazer login por meio do SSH usando senhas de conta:

PasswordAuthentication no

Salve e feche o arquivo quando terminar. Para realmente implementar as alterações que acabamos de fazer, você deve reiniciar o serviço.

Na maioria das distribuições do Linux, você pode emitir o seguinte comando para fazer isso:

  1. sudo systemctl restart ssh

Depois de concluir esta etapa, você fez a transição com sucesso do seu daemon SSH para responder apenas às chaves SSH.

Conclusão

Agora você deve ter a autenticação baseada em chave SSH configurada e em execução em seu servidor, permitindo que você entre sem fornecer uma senha de conta. A partir daqui, há muitas direções que você pode seguir. Se você quiser saber mais sobre como trabalhar com SSH, dê uma olhada em nosso guia de fundamentos do SSH.