Como posso determinar se a chave SSH de alguém contém uma senha vazia?

44

Alguns dos meus sistemas Linux e FreeBSD têm dezenas de usuários. A equipe usará esses nós "ssh gateway" para SSH em outros servidores internos.

Estamos preocupados com o fato de algumas dessas pessoas usarem uma chave SSH privada não criptografada (uma chave sem uma senha) . Isso é ruim , porque se um cracker obtiver acesso à sua conta nesta máquina, eles poderão roubar a chave privada e agora terão acesso por qualquer máquina que use essa mesma chave Por motivos de segurança, exigimos que todos os usuários criptografem suas chaves SSH privadas com uma senha.

Como posso saber se uma chave privada não está criptografada (por exemplo, não contém uma senha)? Existe um método diferente para fazer isso em uma chave blindada ASCII vs. uma chave não blindada ASCII?

Atualizar:

Para esclarecer, suponha que eu tenha acesso de superusuário na máquina e que possa ler as chaves privadas de todos.

Stefan Lasiewski
fonte
2
grumble ssh-agent grumble Não deve haver nenhuma chave privada no gateway.
derobert
Algumas notas pedantes: - Os usuários geralmente têm uma senha incorreta . - Os usuários podem alterar as senhas. - O usuário pode armazenar suas chaves em vários lugares. - É provável que os usuários usem o agente ssh para desbloquear a chave uma vez, digamos no laptop.
Ben Hyde

Respostas:

59

Bem, as chaves privadas do OpenSSH com senhas vazias não são realmente criptografadas.

As chaves privadas criptografadas são declaradas como tal no arquivo de chave privada. Por exemplo:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7BD2F97F977F71FC

BT8CqbQa7nUrtrmMfK2okQLtspAsZJu0ql5LFMnLdTvTj5Sgow7rlGmee5wVuqCI
/clilpIuXtVDH4picQlMcR+pV5Qjkx7BztMscx4RCmcvuWhGeANYgPnav97Tn/zp
...
-----END RSA PRIVATE KEY-----

Então, algo como

# grep -L ENCRYPTED /home/*/.ssh/id_[rd]sa

deve fazer o truque.

codehead
fonte
3
@ jmanning2k: Acabei de criar uma chave privada RSA sem senha, e ela não contém a string 'Criptografia: nenhuma'.
precisa saber é o seguinte
@ jmanning2k: o -Lsinalizador lista apenas nomes de arquivos que não correspondem ao padrão. Portanto, esta resposta está correta por si só.
bahamat
Fico corrigido, comentário removido para maior clareza. Para o registro, tenho alguns arquivos de chave privada do Putty copiados, que leem 'Criptografia: nenhuma'.
Jsonning2k # 4/12
2
ou string OPENSSH: consulte tedunangst.com/flak/post/…
Jack Wasey 27/10/16
10

Procurei por tudo isso e nunca encontrei uma resposta satisfatória, mas consegui construir uma, então ...

Observe que isso atualizará o arquivo, se funcionar, portanto, se você estiver tentando não ser notado pelos usuários cujas chaves você está testando, copie a chave primeiro. OTOH, como você acabou de pegar seu usuário com uma chave sem senha, talvez você não se importe se ele perceber. : D

$ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST
Key has comment '/home/rlpowell/.ssh/KEYTEST'
Your identification has been saved with the new passphrase.
$ echo $?
0

$ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST
Bad passphrase.
$ echo $?
1
rlpowell
fonte
3
Por que não, -N ''para que a senha não seja alterada?
tratar os seus mods bem
facepalm que é perfeito, muito obrigado.
Rlpowell #
+1 porque essa solução funciona até com o novo formato de chave privada do SSH.
Sebastian Krysmanski
8

Se você tem acesso à chave privada, suponho, você pode usá-la sem senha para se autenticar na chave pública. Se isso funcionar, você sabe que não tem senha. Se tivesse, seria exibida uma mensagem de erro.

Se você não tiver acesso à chave privada, duvido que possa detectar isso. O objetivo da frase secreta é "desbloquear" a chave privada; ela não tem função em relação à chave pública.

De fato, se fosse, tornaria o sistema menos seguro. Pode-se usar a chave pública, disponível para tentar montar força bruta ou outros ataques que tentam decifrar a senha.

txwikinger
fonte