Por que devo usar a autenticação de chave pública para SSH?


26

Estou executando um servidor SSH e ainda estou usando a autenticação de senha simples. Em todos os lugares que leio sobre segurança, sou aconselhado a usar a autenticação de chave pública. Mas não tenho vantagens. Usá-los é, a meu ver, um trabalho inseguro ou muito útil.

Obviamente, se alguém tentar forçar com força bruta o login no meu servidor SSH, a Public-Key será muito mais forte do que qualquer senha. Mas, além disso, é totalmente inseguro.

Os consultores argumentam principalmente que você não precisa se lembrar de uma senha. Quão inseguro é isso? Então, se alguém invadir meu computador, ele não apenas pega meu computador, mas também meu servidor? Se estou usando SSH de vários clientes diferentes, tenho que armazenar as chaves públicas uma em cada uma delas, o que multiplica a possibilidade de que caiam nas mãos falsas. Eu poderia salvá-los em um pendrive que eu carrego comigo, mas ele pode ser perdido e o localizador tem acesso ao meu servidor.

Possivelmente estou melhor servido com autenticação de dois fatores.

Falta algum argumento? Qual é a melhor maneira para mim?


10
Quando bem-feita, a autenticação de chave pública é uma forma de 2FA com algo que você conhece (a senha da chave privada) e algo que você tem (a chave privada).
Sven

1
@EEAA Por que isso importa desde que sua chave privada tenha uma?
user253751

6
Com uma chave privada, se eu induzi-lo a conectar-se ao servidor errado por engano, você não digita sua senha no meu servidor.
user253751

1
Muitas organizações devem (por qualquer motivo) exigir que a autenticação de dois fatores seja usada. Isso é impossível de se contar com chaves privadas criptografadas.
EEAA

6
Quanto vale a pena, discordo profundamente de Sven sobre a classificação da chave privada como algo que você possui . Ele falha no teste fundamental de algo que você tem , porque é arbitrariamente reproduzível, sendo simplesmente dados digitais. A autenticação de chave pública por si só não é 2FA; se você diz a si mesmo, está se enganando sobre sua segurança.
MadHatter suporta Monica

Respostas:


32

se alguém invadir meu computador, ele não apenas pega meu computador, mas também meu servidor?

De qualquer forma, isso é potencialmente verdade com os keyloggers: assim que você faz login no servidor a partir do computador comprometido, eles obtêm a senha.

Mas existem 3 vantagens para as chaves:

1) Autenticação em cache. Digite sua senha uma vez, execute vários comandos ssh. Isso é muito útil se você estiver usando algo que usa ssh como transporte, como scp, rsync ou git.

2) Autenticação escalável. Digite sua senha uma vez, faça login em várias máquinas . Quanto mais máquinas você tiver, mais útil será. Se você possui 100 máquinas, o que você faz? Você não pode usar a mesma senha (a menos que seja um farm de clones) e não consegue se lembrar de muitas. Então, você teria que usar um gerenciador de senhas e voltará ao único ponto de comprometimento. Efetivamente, a senha da chave é o seu gerenciador de senhas.

2b) É dimensionado de outra maneira se você tiver vários administradores usando os mesmos sistemas, porque você pode revogar chaves do usuário A sem precisar informar B, C, D, E, F ... que a senha foi alterada.

(Isso também pode ser feito com contas individuais e sudo, mas você deve provisioná-las de alguma forma)

3) Automação e delegação parcial. Você pode configurar o SSH para executar um comando específico quando uma chave for conectada . Isso permite que um processo automatizado no sistema A faça algo no sistema B sem ter total confiança sem senha entre os dois.

(É um substituto para o rlogin / rsh, que era hilariamente inseguro)

Editar: outra vantagem das chaves públicas, em vez das senhas, é o cenário comum em que o servidor é comprometido por uma vulnerabilidade. Nesse caso, o login com uma senha compromete a senha imediatamente. Fazer login com uma chave não! Eu diria que isso é mais comum do que a área de trabalho de origem do administrador sendo comprometida.


2
2b é muito importante. as chaves autorizadas são gerenciadas com facilidade e centralmente, alterar uma senha e distribuí-la a todos os usuários requer mais trabalho.
Jonas Schäfer

Que técnicas existem para gerenciar chaves autorizadas centralmente? (Eu estou familiarizado com a colocação de arquivos authorized_keys em um sistema de arquivos compartilhado, mas deve haver outros)
pjc50

1
No momento em que você tem várias dezenas ou centenas de servidores, provavelmente você está usando Chef, Ansible, Puppet, Holo ou algo parecido com o que os gerencia. Ou você tem as chaves autorizadas em um LDAP ou outro banco de dados.
Jonas Schäfer

1
Não se esqueça de encaminhamento de agente: você pode efetuar login com ssh -Ae a partir daí, fazer login em máquinas que permitem ao público seu host de origem.
Halfgaar 20/02

@ Halfgaar ... sem alterar especificamente nada no host do qual você está se conectando. Acabei de aprender esse recurso e adoro!
Canadian Luke REINSTATE MONICA

12

Se você estiver usando boas senhas, isso pode ser seguro o suficiente. Normalmente, limito o número de servidores acessíveis ao público ao mínimo e permito o SSH de IP (s) específico (s) sempre que possível.

Além disso, você pode proteger suas chaves com senha (senha). Portanto, essa senha deve ser inserida sempre que você precisar fazer login no (s) servidor (es). Ninguém pode usar sua chave, a menos que seja fornecida a senha correta.

Existem posts semelhantes:

  1. Postagem do serverfault .
  2. Publicar a partir de segurança stackexchange .
  3. Postagem do superusuário .

2
A frase-chave é um IMHO obrigatório. Ao usar o ssh-agent, consulte a opção -sh do ssh-add para fazer com que ela descarregue as chaves após um certo tempo.
fuero

12

Uma maneira em que a autorização de chave pública é mais segura é quando o invasor consegue ser o intermediário (MitM) entre o computador cliente e o servidor e você não percebe a alteração da chave do host (possivelmente porque não possui a chave antiga, por exemplo, porque é a primeira vez que utiliza este computador cliente específico).

(O mesmo se aplica quando o invasor consegue controlar o servidor e há outros servidores em que as mesmas credenciais funcionam.)

Com a autenticação baseada em senha padrão, você está enviando sua senha (dentro da conexão criptografada) em texto sem formatação, o servidor genuíno normalmente fará o hash e comparará o resultado com um hash armazenado no banco de dados de senhas. Em vez disso, um invasor do MitM pode pegar essa senha, abrir uma conexão com o servidor real e entrar lá ... e encaminhar o conteúdo para você (para que você não perceba nada), ou apenas fazer suas próprias coisas más no seu servidor .

Com a autenticação de chave pública, o cliente está basicamente assinando alguns dados conhecidos pelo servidor e pelo cliente para provar que possui a chave privada e enviando a assinatura ao servidor. Esses dados assinados incluem um identificador de sessão, que depende de números aleatórios escolhidos pelo cliente e pelo servidor e, portanto, é diferente para cada sessão. Se o MitM abrir sua própria conexão SSH com o servidor real, ele terá um ID de sessão diferente e, portanto, a assinatura fornecida pelo cliente não funcionará lá.

Obviamente, como outras respostas já contadas, você precisa manter sua chave privada segura, por exemplo, criptografada com uma senha, ou possível em um dispositivo separado que só cria assinaturas após a digitação do PIN.


2

O OpenSSH pode manter sua própria CA para gerenciar chaves de host e cliente SSH e pode usar listas de revogação nelas. Isso pode aumentar a segurança fornecida pela autenticação baseada em chave.


2

Você está certo sobre a reivindicação "você não precisa de uma senha". Isso é realmente inseguro no lado do cliente.

O que torna a permissão apenas de chaves públicas para efetuar login muito mais segura é o fato de que não há como restringir o acesso à força bruta no servidor. Tudo o que um invasor pode conseguir é colocar um pouco de carga no servidor - você pode empregar fail2ban para manter isso sob controle.

Para segurança no lado do cliente, você deve proteger a chave privada com uma boa frase secreta. É claro que agora a conexão com o servidor é mais complicada do que com uma senha. Para superar isso, você pode usar o agente ssh para armazenar a chave privada na memória, se pretende se conectar ao servidor várias vezes seguidas. É uma boa prática limitar o tempo durante quanto tempo uma chave deve ser mantida na memória.


3
nenhuma maneira de acessar a força bruta ... eu não diria que não ... você pode forçar a chave privada da mesma maneira que a senha, mas você tem muito mais entropia na chave privada do que na senha geral, o que a torna bastante inútil (até agora sem computadores quânticos).
Jakuje 19/02/19

0

Possivelmente estou melhor servido com autenticação de dois fatores.

Uma possibilidade para o 2FA para SSH (e uma que requer relativamente pouca configuração / complexidade) é de fato usar uma chave pública e senha.

Acredito que algo como esse AuthenticationMethods publickey,keyboard-interactivepode ser adicionado /etc/ssh/sshd_configpara fazer esse trabalho.

De maneira mais geral, o problema é mais o fato de as senhas (sozinhas) não serem um ótimo método para autenticação, pois geralmente possuem qualidade duvidosa. Um 'argumento' muito simples para chaves versus senhas é que uma chave geralmente terá pelo menos 2048 bits e muitas vezes mais (para chaves EC, essa seria a força efetiva, e não o tamanho real). Esses bits também são gerados por um mecanismo criptograficamente seguro (ou apropriado).

Uma senha geralmente tem menos de 2048 bits e geralmente não é derivada de uma fonte criptograficamente segura.

Você também pode proteger suas chaves com uma senha, para se proteger contra problemas relacionados a perdê-las (embora alguém possa tentar forçar brutalmente essa senha).

Então, basicamente, as diferenças podem ser bastante transparentes entre chaves e senhas, e o uso de chaves oferece uma senha melhor do que um humano poderia lidar. Isso não quer dizer que sejam uma panacéia, mas, em média, eles fornecem mais segurança do que senhas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.