Existe uma maneira de verificar uma chave SSH de usuários para ver se a frase secreta está em branco [duplicada]

8

Estou tentando bloquear nossos servidores Solaris 10, RHEL 5 e SLES 11.2. Chegou ao meu conhecimento que alguns dos usuários não têm senhas para suas chaves SSH. Existe uma maneira que eu possa verificar isso com um script?

Atualizar

Abaixo, postei o script que escrevi a partir da resposta que @tylerl me deu. Estou postando isso caso alguém mais precise dessa informação no futuro. Provavelmente há melhores maneiras de fazer isso, mas isso funciona. Ainda preciso escrever scripts adicionais para as contas que não estão montadas automaticamente. Obrigado a todos por toda a ajuda

#!/bin/bash
# This script is for checking for a blank passphrase. Meaning no passphrase to secure your SSH key.
# Script most be run as root.
# Example: sudo ./check-sshkeys

mount share:/vol/home /mnt
ls /mnt >/tmp/ls
for s in 'cat /tmp/ls'
do echo -e "\e[1m User $s 3[0m "

if ls /mnt/$s/.ssh/id_rsa 2>/dev/null
        then grep ENCRYPTED /mnt/$s/.ssh/id_rsa || echo -e "No RSA
passphrase"
        else echo "RSA key not found"
fi
if ls /mnt/$s/.ssh/id_dsa 2>/dev/null
        then grep ENCRYPTED /mnt/$s/.ssh/id_dsa || echo -e "No DSA
passphrase"
        else echo "DSA key not found"
fi
done
rm /tmp/ls
umount /mnt
    
por Cyberninja 19.03.2014 / 16:21

5 respostas

14

Se você estiver verificando do servidor que as pessoas estão se conectando a , não haverá dados. A chave SSH deve ser descriptografada na memória antes do uso, o que significa que o servidor tem a mesma aparência. A menos que você possa obter uma cópia do arquivo de chave real, você está perdido.

Mas se você está na máquina, as pessoas estão se conectando a partir de , então é trivial - basta olhar para o arquivo-chave.

Senhas em chaves SSH são usadas para criptografar a chave, e o arquivo indica se a criptografia é usada, bem como o tipo.

Uma chave privada criptografada tem esta aparência:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,259001658E2E5C2618A9648EA35122F4

GFzPnlYdGYVTmK5t45xv/m0Nok9czOuFNNuS+Sm5vzGaOa7LBMtRNJgWFBCGsfFl
wouThpuKxV+ArgmzPa9hnEmy18QW0sbza8SKm/3Hbqi8XwCliz2xP2xS+iGSkYDt
...
LAB/DZasuYBSsVadfemDsmrRvUz7/4eJZTxoEvwNQtAWhTS8j9RbRPee4rk1fwew
-----END RSA PRIVATE KEY-----

Enquanto um não criptografado tem esta aparência:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtdKjJa18HbagmuMvb/gDCpXXYPVqRsXDdwTcG3YY5RlJtdxY
TJD+626tLTyuzzw6ZsGJtScrSjm2Jp5uUrDXnkek39Zxj24bTM9k/tZBeAQubrwO
....
I8u05jPL1WZmre5SVexfFEvAGqMdiWLvURpnQkI7Wn6nXJjEbUOdGQ==
-----END RSA PRIVATE KEY-----

O olho treinado pode notar que a segunda linha contém a palavra " ENCRYPTED ". Essa é sua pista. Se o arquivo contém a palavra "ENCRYPTED" então é, se não for, então não é.

Então aqui está o seu script:

grep -L ENCRYPTED /home/*/.ssh/id_rsa

modifique para se adequar ao seu ambiente, mas você entende a ideia. Obviamente, as pessoas poderiam enganar seu script colocando a palavra "ENCRYPTED" na parte inferior do arquivo, mas estamos assumindo que não.

    
por 19.03.2014 / 18:44
11

O servidor não pode saber se a chave que você está usando para se conectar a ela tem uma frase secreta ou não.

O passphrase é usado para criptografar a chave SSH para armazenamento. Quando você usa uma chave SSH, ela é descriptografada na memória usando a frase secreta para que possa ser usada para conectar-se ao servidor. Portanto, o servidor não tem como saber se a chave usada foi descriptografada ou não.

Se as chaves privadas estão sendo armazenadas no servidor (ao invés de serem usadas para conectarem ao servidor), você pode verificar isso.

A resposta de Tylerl é a maneira mais fácil de encontrar chaves não criptografadas, embora isso possa quebrar se o OpenSSH introduzir um novo formato de chave (o que eles fizeram recentemente). Uma alternativa é usar ssh-keygen para verificar, mas essa abordagem tem seus próprios problemas.

É difícil fazer o script dessa verificação porque as ferramentas do OpenSSH são realmente complicadas com relação às suas chaves, e também querem conversar com o usuário se encontrarem uma chave criptografada. Aqui está uma maneira (aproximada) de verificar se você tem a ferramenta setsid do pacote util-linux :

if res="$(setsid </dev/null 2>&1 env -i ssh-keygen -y -f "$keyfile")" ; then
    echo "Unencrypted private key!"
else
    echo "Encrypted, or unreadable, or not a private key,"
    echo "or doesn't have correct permissions for a private key,"
    echo "or SSH doesn't like it for some reason."
    echo "More info that may or may not be helpful:"
    printf "%s\n" "$res"
fi

Se estiver escrito "Chave privada não criptografada!", você definitivamente encontrou um. Se isso não acontecer, você pode pelo menos apostar que se for uma chave não criptografada, o SSH não a usará como está.

(N.B., se acontecer de você descobrir que /etc/ssh/ssh_host_rsa_key ou algo parecido não está criptografado, deixe-o em paz - é suposto ser assim!)

    
por 19.03.2014 / 16:26
1
  1. Você pode usar a chave em um script. Certifique-se de que o ssh não use ssh-agent nesse caso: SSH_AUTH_SOCK=

  2. OpenSSH ssh-keygen pode converter chaves privadas, mas somente se elas não tiverem uma frase secreta. Então você pode apenas verificar o código de saída: ssh-keygen -f id_dsa -i

por 19.03.2014 / 16:30
0

Caveat H@x0r - The actions provided in this example could be considered a violation of user privacy and sysadmin trust. This example is offered for your knowledge and understanding; YOU are responsible to ensure you have the authority, permission, and responsibility to take action based on these examples.

TL;DR > If you maliciously hack it, it's your ass...not mine.

Se você tiver privilégios de superusuário no sistema com o arquivo de chaves particular, poderá testar se há uma frase de senha tentando alterar a senha existente. Se a chave privada tiver uma frase secreta, você será solicitado a usar a frase antiga antes de permitir que você a altere. (Não insira nenhum texto, basta pressionar <Enter> quando for solicitada a senha antiga.) Aqui está uma demonstração:

### Example: trying to change passphrase when one already exists ###

$ sudo ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa): /home/bob/.ssh/id_rsa
Enter old passphrase: 
Bad passphrase.
$ 

Não há surpresas lá. Veja como saber se eles não têm senhas configuradas.

### Example: trying to change passphrase, no phrase configured on key ###

$ sudo ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa): /home/bob/.ssh/id_rsa
Key has comment '/home/bob/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase): 
...
    
por 19.03.2014 / 17:24
0

Eu 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 está testando, convém copiar a chave primeiro. OTOH, desde que você acabou de pegar seu usuário com uma chave sem senha, talvez você não se importe se eles notarem. : 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
    
por 01.04.2015 / 21:39

Tags