Questão:
Usar uma chave pública para fazer login no SSH é melhor do que salvar uma senha?
Nick T
2011-05-17 19:16:44 UTC
view on stackexchange narkive permalink

Usar um par de chaves pública / privada é bastante conveniente para fazer login em hosts freqüentados, mas se eu estiver usando um par de chaves sem senha, isso é mais seguro (ou menos seguro) do que uma senha? A segurança em torno do meu arquivo de chave privada é fundamental, mas digamos que meu arquivo de chave privada mágico fosse apenas uma lista de senhas para vários hosts, há uma diferença?

Os bits quebráveis ​​de uma chave ssh provavelmente são drasticamente maiores do que qualquer coisa que você usaria como senha.
Por que um par de chaves sem senha? Por que não usar uma senha em sua chave privada e usar o ssh-agent, para maior segurança e conveniência?
Você também pode usar a autenticação S / KEY.
Veja também http://security.stackexchange.com/questions/69407/why-is-using-ssh-key-more-secure-than-using-passwords
a resposta em https://security.stackexchange.com/questions/69407/why-is-using-an-ssh-key-more-secure-than-using-passwords é IMO um pouco mais digerível.Mas [resposta @john's] (https://security.stackexchange.com/a/3898/6499) é provavelmente mais abrangente e também deve ser lido para compreensão total.
Seis respostas:
john
2011-05-17 21:26:31 UTC
view on stackexchange narkive permalink

Minha resposta é que usar pares de chaves públicas é muito mais sábio do que usar senhas ou listas de senhas. Vou me concentrar em coisas que não são amplamente conhecidas sobre as diferentes formas de autenticação SSH e não vejo outras respostas mencionando-as.

Em primeiro lugar, você deve entender que a autenticação do usuário é um processo diferente e separado do estabelecimento do canal seguro . Em termos leigos, isso significa que primeiro, a chave pública do servidor é usada (se aceita!) Para construir o canal SSH seguro, permitindo a negociação de uma chave simétrica que será usada para proteger a sessão restante, habilite o canal confidencialidade, proteção de integridade e autenticação do servidor.

Depois que o canal estiver funcional e seguro, a autenticação do usuário ocorre. As duas formas usuais de fazer isso são usando uma senha ou um par de chaves públicas. A autenticação baseada em senha funciona como você pode imaginar: o cliente envia sua senha pelo canal seguro, o servidor verifica se essa é realmente a senha do usuário específico e permite o acesso. No caso da chave pública, temos uma situação muito diferente. Nesse caso, o servidor possui a chave pública do usuário armazenada. O que acontece a seguir é que o servidor cria um valor aleatório (nonce), criptografa-o com a chave pública e o envia ao usuário. Se o usuário for quem deveria ser, ele pode descriptografar o desafio e enviá-lo de volta ao servidor, que então confirma a identidade do usuário. É o modelo de desafio-resposta clássico. (Em SSHv2, algo um pouco diferente, mas conceitualmente próximo, é realmente usado)

Como você pode imaginar, no primeiro caso a senha é realmente enviada para o servidor (a menos que o SSH use uma resposta de desafio de senha), no segundo, sua chave privada nunca sai do cliente. No cenário imaginário em que alguém intercepta o tráfego SSL e é capaz de descriptografá-lo (usando uma chave privada de servidor comprometida ou se você aceitar uma chave pública errada ao se conectar ao servidor) ou tem acesso ao servidor ou cliente, sua senha será conhecido - com a autenticação de chave pública-privada e o modelo de resposta de desafio, seus detalhes privados nunca cairão nas mãos do invasor. Portanto, mesmo que um servidor ao qual você se conecta esteja comprometido, outros servidores para os quais você usa a mesma chave não serão !

Existem outras vantagens de usar um par de chaves públicas: A chave privada não deve ser armazenada em texto não criptografado em seu PC cliente como você sugere. Isso, obviamente, deixa o arquivo da chave privada aberto para comprometimento, como faria um arquivo de senha não criptografado, mas é mais fácil de descriptografar (no login) e usar a chave privada. Deve ser armazenado criptografado e precisa que você forneça uma frase-senha geralmente longa para descriptografá-la cada vez que for usada.

Claro, isso significa que você terá que fornecer uma frase longa frase-senha cada vez que você se conectar a um servidor, para desbloquear sua chave privada - Existem maneiras de contornar isso. Você pode aumentar a usabilidade do sistema usando um agente de autenticação: Este é um pedaço de software que desbloqueia suas chaves para a sessão atual, quando você faz login no gnome, por exemplo, ou quando você faz o ssh em seu cliente, então você pode apenas digite 'ssh remote-system-ip' e efetue login, sem fornecer uma senha longa, e faça isso várias vezes até que você saia da sessão.

Então, para resumir, usar pares de chaves públicas oferece consideravelmente mais proteção do que usar senhas ou listas de senhas que podem ser capturadas se o cliente , o servidor ou a sessão segura está comprometida . No caso de não usar uma senha longa (o que não deveria acontecer), ainda assim os pares de chaves públicas oferecem proteção contra sessões e servidores comprometidos.

Hmmm, acabei de reler a pergunta e vi que perguntas específicas sobre não ter senha para a chave privada - não percebi isso ao escrever a resposta. Claro, ainda há a opção de usar um agente, então não usar uma senha não é muito inteligente.
A resposta foi editada para refletir a pergunta correta (sem usar senhas).
Minhas chaves privadas podem ser descriptografadas automaticamente no Ubuntu, as senhas para elas são criptografadas com minha senha de login e o Ubuntu as desbloqueia automaticamente quando eu faço o login. Este é realmente o melhor dos dois mundos, porque tenho a conveniência de uma senha sem senha com a segurança de uma senha (quase). Se você estiver se conectando a um sistema de computador de alta segurança, isso pode não ser seguro o suficiente, já que sua senha de login pode ser comprometida facilmente e, portanto, as fases de suas chaves podem ser comprometido também. No entanto, é muito melhor do que uma chave sem uma passphase.
Se "não usar uma senha longa não é inteligente", então por que a [documentação do OpenSSL] (http://www.openssl.org/docs/HOWTO/keys.txt) diz especificamente que "pode ​​ser uma boa coisa evite protegê-lo com uma senha "? (Devo fazer isso como uma pergunta independente?)
Partes dessa resposta são um pouco detalhadas demais e, como resultado, se extraviam. A característica distintiva da autenticação de chave pública neste contexto é que o cliente assina algo com sua chave privada e não precisa revelar um segredo no processo. A autenticação de chave pública SSH-2 não usa realmente um protocolo de resposta de desafio conforme descrito nesta resposta. O cliente assina um valor que é derivado independentemente por cada lado como parte do processo de acordo de chave simétrica; consulte RFC-4252, seção 7 (em particular o "identificador de sessão"). Ambos os lados contribuem e nenhum pode determiná-lo.
O uso do identificador de sessão na autenticação de chave pública tem um efeito interessante que nem sempre é observado: ele oferece proteção extra contra um ataque man-in-the-middle. Se o invasor executar a troca de chaves separadamente em cada lado, os identificadores de sessão (IDs) serão diferentes. O servidor exige uma assinatura sobre o ID para sua conexão com o invasor - mas o cliente só produzirá uma assinatura sobre o ID em seu lado. O invasor não tem como forçá-los a serem iguais e nem como induzir o cliente a fazer outra coisa. Um protocolo de desafio-resposta não faria isso.
@RichardE.Silverman Talvez você deva sugerir uma edição. É improvável que o autor da postagem edite a si mesmo, considerando que ele não tem estado neste site por três anos.
Thomas Pornin
2011-05-17 19:27:18 UTC
view on stackexchange narkive permalink

Em comparação com uma lista armazenada de senhas (longas e aleatórias), uma chave privada SSH armazenada oferece a mesma segurança : tudo está seguro enquanto seu arquivo privado permanecer privado.

A chave privada, no entanto, é muito mais conveniente , tanto na prática (atualmente, os clientes SSH a suportam fora da caixa, ao contrário de um arquivo personalizado de senhas que você deve usar com algum copy&paste manual) e teoricamente (você pode reutilizar a mesma chave para cada host ao qual deseja se conectar, enquanto uma lista de senhas aumentará linearmente com o número de hosts contatados, a menos que você reutilize a mesma senha para vários hosts, que é ruim ).

Temo que alguns leitores não entendam as implicações de “senhas longas e aleatórias”. Uma chave privada carrega muito mais entropia do que uma senha realista (digamos pelo menos 128 bits de entropia, assumindo um RNG decente; uma senha de 10 caracteres ASCII tem cerca de metade disso, muito menos se for memorável). Além disso, as pessoas reutilizam senhas com muito mais frequência do que chaves privadas. Portanto, na prática, há vantagens de segurança em uma chave privada.
Todas as chaves assimétricas @Gilles como aquelas usadas em SSH têm pelo menos 1024 bits de entropia, não 128. No entanto, a criptografia assimétrica também * requer * mais entropia. Assimétrica de 1024 bits é mais fraca do que a criptografia simétrica de 128 bits. Quando alguém tenta usar a força bruta em um servidor SSH, deve fazê-lo "lentamente" para evitar a criação de um ataque de negação de serviço. Isso significa que uma senha com aproximadamente 50 bits de entropia levará centenas de milhões de anos para ser adivinhada. Vá mais rápido e o servidor será retirado da Internet durante o ataque, e o administrador do sistema notará / investigará.
Para usar uma senha de 10 caracteres com força bruta, você precisa de centenas de trilhões de suposições por segundo, e isso ainda levará semanas. Nenhum servidor é capaz de receber algo remotamente próximo a tantas tentativas de login SSH. Algumas centenas de tentativas por segundo são mais realistas, o que é muito lento para ser eficaz, a menos que a senha seja terrível. Qualquer pessoa que esteja lendo este site é inteligente o suficiente para escolher uma boa senha.
@AbhiBeckert Acho que você está confundindo tamanho de chave com entropia. Além disso, quebrar a chave ou senha nem sempre é um ataque online: o invasor pode ter acesso à chave pública. Em qualquer caso, acho que você não entendeu nada: a entropia em um par de chaves, exceto [bugs] (https://www.schneier.com/blog/archives/2008/05/random_number_b.html), é sempre muito maior do que quaisquer senhas memoráveis.
@Gilles e acho que você está perdendo o meu ponto, que ninguém deveria usar senhas memoráveis ​​para um servidor de produção. As senhas devem ser números totalmente aleatórios, codificados com caracteres que podem ser digitados em um teclado.
Bruno
2011-05-17 20:16:45 UTC
view on stackexchange narkive permalink

Depende de quais ameaças você considera.

O principal ponto da autenticação de chave pública / privada é não revelar seu segredo, mesmo para a parte em que você está se autenticando. Por esse motivo, usar chaves é melhor, já que você nunca envia seu segredo para fora de sua máquina.

No entanto, se a ameaça que você considera for local, e se você não proteger suas chaves privadas com uma senha, armazenar uma lista de senhas em claro é quase o mesmo armazenar as chaves privadas sem proteção.

Por esse motivo, é útil proteger suas chaves privadas com uma senha e usar ferramentas como o ssh-agent (por conveniência ) No OSX, isso também pode ser integrado com o KeyChain, de forma que você não precisa nem mesmo desbloquear a chave privada (no nível do aplicativo, apenas no nível do daemon de segurança) para poder usá-lo via SSH (essencialmente, o KeyChain e o daemon de segurança cuida do agente ssh).

> O ponto principal da autenticação de chave pública / privada é não revelar seu segredo, mesmo para a parte em que você está se autenticando. Por isso, usar chaves é melhor, pois você nunca envia seu segredo para fora da máquina. A autenticação de senha de desafio não é compatível com SSH?
Bem-vindo ao Security.SE. Como você deve ter notado, suas respostas estão sendo rejeitadas por vários membros da comunidade. Se você leu bem o FAQ (link no topo da página), terá uma visão melhor de como postar nesta comunidade. Você também pode querer se concentrar mais nas perguntas mais recentes, em vez de desenterrar as antigas com respostas aceitas e bem votadas.
... além disso, sua adição aqui como uma resposta teria sido mais apropriada para colocar como um comentário. Quanto à sua pergunta de esclarecimento, o SSH não oferece suporte a autenticação de desafio de senha.
Karol J. Piczak
2011-05-17 20:12:57 UTC
view on stackexchange narkive permalink

A principal diferença entre usar uma chave privada sem senha e usar senha em texto simples para autorização SSH é autorizar por algo que você possui (seu chave privada) ou por algo que você conhece (sua senha memorizada). Eles são de raças diferentes, mas é difícil dizer que um seja melhor ou mais seguro.

Autorizar por algo que você possui normalmente é mais difícil para o invasor replicar a partir do azul - é mais fácil adivinhar / força bruta sua senha mais simples do que replicar sua chave. Mas tem uma grande desvantagem - agora manter sua chave privada realmente secreta se torna fundamental . Se você usar algo que só você conhece (senha memorizada), deve ser mais fácil mantê-lo assim (pelo menos teoricamente). Mas se você tiver que memorizá-lo, provavelmente usará algo não tão complexo.

Portanto, cabe a você decidir, o que é mais provável - sua chave privada forte foi roubada ou uma senha não tão forte adivinhada (ou adquirida de alguma outra maneira).

Há uma exceção aqui - se você quiser dizer em sua pergunta que armazenará senhas muito longas, complexas e aleatórias em seu arquivo secreto em vez de usar uma chave privada, então há provavelmente pouca diferença entre os dois ainda alguma diferença (perdi a parte, veja a resposta de @john para um bom artigo sobre isso ) Nesse caso, ambos são algo que você tem , mantenha-os em segredo tipos, mas então pergunte a si mesmo - por que fazer isso em primeiro lugar se é para isso que as chaves privadas foram projetadas para? você deve ficar com as chaves privadas nesse caso.

Observe também que esses dois podem ser combinados de forma trivial protegendo a chave privada com senha. Agora você precisa de algo que você * saiba * (a senha) para obter algo que você * possui * (a chave privada).
sarnold
2011-06-13 06:10:02 UTC
view on stackexchange narkive permalink

O documento referenciado está discutindo as senhas digitadas em uma sessão ssh; Acho que vale a pena manter isso e os comentários de Richard, mas não acredito mais na resposta em si. (Ainda prefiro chaves públicas.)

Song, Wagner e Tian mostraram que é possível acelerar pesquisas de senha de força bruta cerca de 50 vezes ao usando informações de tempo de sessões ssh . Noack revisou seu estudo e encontrou SSH2 vulnerável à análise de tempo também.

O ataque faz duas suposições:

  • O hash de senha está disponível para cracking de força bruta.
  • Um invasor pode obter carimbos de data / hora precisos em pacotes enviados entre hosts ou, de outra forma, obter informações de tempo.

As chaves públicas não são apenas mais convenientes, mas também mais seguras contra certas ameaças.

Este comentário é enganoso e o escritor pode ter entendido mal o trabalho de Song et al. Só se aplica se você digitar sua senha por meio de uma conexão SSH, interativamente: por exemplo, se você usar SSH para fazer login em um host remoto, execute um comando com sudo para que você precise digitar sua senha para autenticação sudo pela conexão. Quando você faz isso, os tempos entre pacotes de suas teclas enquanto você digita a senha revelam informações sobre a senha. [continua…]
A questão, entretanto, não é sobre "digitar sua senha por SSH", mas sim sobre "autenticação de senha SSH", que não está totalmente relacionada. Quando você se autentica por meio de senha em um servidor SSH (com os métodos de userauth "senha" ou "teclado interativo"), você digita sua senha localmente - não por SSH. A senha é enviada em um único pacote para o servidor. O ataque de tempo é irrelevante aqui. Consulte: http://archive.oreilly.com/pub/a/linux/2001/11/08/ssh_keystroke.html
@RichardE.Silverman, obrigado. Eu editei minha resposta para refletir que eu li ou me lembrei mal do artigo. (Não me lembro agora, foi há muito tempo.)
martin
2011-06-12 20:11:15 UTC
view on stackexchange narkive permalink

Se estiver usando chaves de "software" (significando chaves armazenadas em seu diretório .ssh ou equivalente), você está basicamente no mesmo nível de armazenamento de senhas.

O OpenSSH agora tem um suporte PKCS # 11 quase decente, o mesmo está disponível no KiTTY (um fork do PuTTY), portanto, para realmente fazer uso da autenticação pubkey, escolha um cartão inteligente. Então, há uma diferença real de senhas. Um arquivo de chave de software, protegido por senha, pode ser replicado da mesma forma que uma senha simples, enquanto um cartão inteligente não pode.

Como as outras respostas observam, há muitos cenários nos quais o pk auth é uma proteção muito eficaz, então você deve pelo menos esclarecer os cenários de ameaças que está abordando.
Se o seu host for comprometido pelo adversário (diferente de perdido / roubado, o que significa que você foi hackeado / enraizado / keylogged etc) suas chaves privadas protegidas por uma senha são tão boas quanto senhas simples que são detectadas - ambas podem ser copiadas e usadas sem sua permissão. A clonagem de um cartão inteligente, por outro lado, provou ser "difícil o suficiente" para meros mortais como nós. Além disso, destruir um cartão inteligente geralmente destrói a chave privada, excluir uma cópia de um arquivo que você possui não significa que existem outras cópias "em algum lugar"
Certo. Mas você está ignorando a proteção que até mesmo o software pk auth oferece contra a perda de sua senha para o host remoto (para possível reutilização em outros hosts onde você a reutilizou, como muitas pessoas fazem), ou para um MITM, como outros apontaram.
Talvez. Mas espero ter chamado a atenção para problemas com autenticação baseada em chave (somente protegida por senha) também.


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...