PiumaLab

Idee, esperimenti, tentativi e molto altro

ssh / scp: password a linea di comando e shellselect

Perché è sbagliato

Vi sarà passato per la testa almeno una volta nella vita di poter passare la password come opzione al client ssh. Allora per quale motivo OpenSsh non lo ha previsto?

Alcuni motivi potrebbero essere questi

  • Non è sicuro, se passiamo la password come opzione verrà loggata tra i comandi digitati, la ritroveremo nel file ~/.bash_history, e vi assicuro che un ln -s /dev/null ~/.bash_history non risolve la situazione. Ci sono shell che loggano tutti i nostri comandi a nostra insaputa. Rimangono tracce della nostra password in molte parti del sistema.
  • Non è necessario, è possibile connettersi ad un server remoto anche senza digitare la password ogni volta, basta uno scambio di chiavi. Bisogna inserire la tua chiave pubblica nel file authorized_keys2 dell'host a cui vorremmo connetterci. Se nella generazione delle chiavi impostiamo una passfrase ci verrà chiesto di inserire quella.
  • Esiste ssh-agent che ci evita di dover inserire la passfrase ogni volta che apriamo una connessione ssh. Basta infatti inserirla una sola volta all'avvio del demone ssh-agent.

In alcuni casi risulta comodo

Allora perché nasce la necessità di passare la password come opzione ad ssh?

Può essere utile quando si lavora da remoto su una trentina di server in una intranet. Se non possiamo scambiare chiavi con tutti i server a cui dobbiamo accedere. Accade spesso che le password di server interni di una azienda sono conosciute da tutti i dipendenti, e spesso sono veramente imbarazzanti come "password", "admin", "pippo" o "root".

In questo caso perché non passarla ad ssh come opzione, in questo modo potremmo creare degli alias oppure usare dei semplici script shell, come shellselect che vedremo tra poco, che ci semplificano l'amministrazione dei server.

Come fare

Per prima cosa dobbiamo scaricarci i sorgenti di OpenSsl, capire come funziona, dove memorizza la password, modificarli in modo da leggerla anche da linea di comando, correggere eventuali errori, compilare tutto, verificare che funziona. Non vi spaventate, ho già fatto tutto questo io ed ho creato una patch, vi basterà scaricare i sorgenti ed applicare la mia patch.

Vi dico come fare:

  • scaricate la mia patch quì
  • Patch Valida per Note
    openssh-5.2p2-shellselect.patch openssh-5.2p1 Ultima versione, modifica anche scp e sftp
    openssh-5.2p1-shellselect.patch openssh-5.2p1 Migliora l'autenticazione
    openssh-4.9p1-shellselect.patch openssh-4.9p1 Prima versione
  • andate sul sito http://www.openssh.com/ e scaricate i sorgenti di openssh.
  • decomprimete il file scaricato
  • applicare la patch
    cd openssh-XXX
    patch -p2 < ../openssh-XXX-shellselect.patch
  • compilare
    ./configure
    make
  • installare
    make install

    Se vogliamo mantenere la versione di ssh del nostro sistema allora potremmo semplicemente copiare gli eseguibili modificati senza lanciare make install oppure possiamo specificare l'opzione - -prefix quando lanciamo il configure.

Abbiamo finito. Vediamo che se lanciamo ssh, verrà invocato quello di sistema. Verifichiamo

$ ssh --help
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

Mentre il nostro ssh accetterà le opzioni

$ ./ssh --help
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W password]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

come potete notare c'è [-W password] in più rispetto alla versione standard. Ora proviamo che tutto funzioni:
./ssh -W password username@hostname
se avete seguito correttamente la mia procedura vi siete loggati sul server hostname cone utente username.

Shellselect

shellselect è uno script Bash che sfrutta la capacità del nostro ssh di accettare la password da linea di comando per aprire una connessione remota.

Lanciandolo apparirà una finestra come quella mostrata quì sotto.

shellselect

shellselect


Per connettersi ad un server basta selezionarne uno dalla lista e premere il bottone OK. Semplice no!

La configurazione è ancora più semplice, basta riempire un file di testo con le seguenti informazioni: ip, etichetta, utente, protocollo (ssh o telnet) ed eventualmente una password. Se la password non viene specificata verrà chiamato il normale ssh di sistema che eventualmente vi chiederà le credenziali per l'accesso. Altrimenti verrà lanciato il nostro ssh con l'opzione -W. Come in questo esempio

10.50.2.101            DC-TIM       root     ssh     root
10.60.11.251           TECTEST      root     ssh     root_password
capsula.no-ip.org      capsula      root     ssh
92.243.11.13           metals       danilo   ssh
10.50.5.100            QuaggaTest   root     ssh     qpass
10.50.2.102            cisco        utente   telnet  cisco

Shellselect, lo script

#!/bin/bash
 
processLine() {
  line="$@"
 
  IP=$(echo $line | awk '{ print $1 }');
  HOST=$(echo $line | awk '{ print $2 }');
  USER=$(echo $line | awk '{ print $3 }');
  PROTOCOL=$(echo $line | awk '{ print $4 }');
  PASS=$(echo $line | awk '{ print $5 }');
 
  if [ "x$PASS" = "x" ]; then
      PASS="X"
  fi
 
  ZENITY_OPTIONS="$ZENITY_OPTIONS $PASS $IP $HOST $USER $PROTOCOL"
}
 
### Main ###
HOME="~"
SSH="$HOME/bin/ssh"
FILE="$HOME/prog/shellselect/hosts"
 
ZENITY_GENERAL_OPTIONS="--title shellSelect --width 420"
ZENITY_OPTIONS="$ZENITY_GENERAL_OPTIONS --list --print-column ALL --hide-column 1 --column pass --column IP --column Host --column User --column Protocol"
 
if [ "$1" != "" ]; then
    FILE="$1"
   if [ ! -f $FILE ]; then
       echo "$FILE : does not exists"
       exit 1
   elif [ ! -r $FILE ]; then
       echo "$FILE: can not read"
       exit 2
   fi
fi
 
# read $FILE using the file descriptors
exec 3<&0
exec 0<$FILE
 
COUNT_LINE=0
 
while read line; do
    processLine $line
    COUNT_LINE=$(($COUNT_LINE + 1))
done
exec 0<&3
 
# make zenity command
 
ZENITY_OPTIONS="$ZENITY_OPTIONS --height $((170 + ($COUNT_LINE - 1) * 26))"
ITEM=`zenity $ZENITY_OPTIONS | tr '|' ' '`
 
PASSWORD=$(echo $ITEM | awk '{ print $1 }')
IP=$(echo $ITEM | awk '{ print $2 }')
HOST=$(echo $ITEM | awk '{ print $3 }')
USER=$(echo $ITEM | awk '{ print $4 }')
PROTOCOLLO=$(echo $ITEM | awk '{ print $5 }')
 
case $PROTOCOLLO in
    ssh|ssh2)
        if [ "$PASSWORD" = "X" ]; then
            $SSH $USER@$IP
        else
            $SSH $USER@$IP -W $PASSWORD
        fi
        ;;
    telnet)
        telnet $IP 23
        ;;
    *)
        echo "protocollo sconosciuto"
        ;;
esac
exit 0

Gli unici parametri da configurare sono HOME, SSH e FILE. La home è la vostra home directory, SSH è il path più l'eseguibile dell'ssh (quello con la patch) che accetta l'opzione -W e in FILE va inserito il nome del file di configurazione.

9 Responses to ssh / scp: password a linea di comando e shellselect

  1. Nicola Greco says:

    Ottimo complimenti,
    soprattutto la patch a OpenSSH,

    Nicola

  2. Gianluca says:

    Ciao scusami ma ho installato openssh e la tua patch; tra le opzioni del nuovo ssh mi da -W per la password ma se la usi non fa niente te la chiede comunque; quindi ho i dettagli dell'installazione sono errati o quello che hai descritto sopra non funziona.

  3. Piuma says:

    La patch funziona con server ssh che usano la versione 2 del protocollo, il motivo per qui non ti funziona potrebbe errese che il server a cui tenti di connetterti accetta solo la versione 1. Prova a lanciarlo con l'opzione -v e verifica
    che compare la riga

    debug1: Remote protocol version 2.0

    Un altro motivo per cui potrebbe chiederti la password potrebbe essere che il server non accetta l'autenticazione "password", al posto di quella utilizza la "keyboard-interactive". Lo puoi verificare leggendo la riga

    debug1: Authentications that can continue: publickey,password,keyboard-interactive

    Ho scritto un'altra patch per far in modo che funzioni anche in questi due casi, si applica alla versione di ssh openssh-5.2p1 . Quindi dovresti scaricarti di nuovo i sorgenti ssh e applicare questa patch:

    http://www.piumalab.org/wp-content/uploads/openssh-5.2p1-shellselect.patch

    Buona compilazione.

  4. Maryuano says:

    Ottimo per la creazione di script bash per automatizzare il lavoro su diverse macchine.

    Grande PiumaLab

  5. Alessio says:

    Complimenti!!! è proprio quello che cercavo!!!

  6. francesco says:

    Ciao, ho eseguito la tua procedura ma senza risultati.
    Primo passo : tar xvf openssh-5.2p1.tar.gz
    Secondo passo : ./configure --prefix=/opt/openssh
    Terzo passo: patch -p2 < ../openssh-5.2p1-shellselect.patch
    patching file readconf.c
    patching file readconf.h
    patching file ssh.c
    patching file sshconnect1.c
    patching file sshconnect2.c
    Quarto passo : Make
    Quinto passo : sudo Make Install
    se eseguo lìHelp di ssh ottengo
    [francesco@latitudine bin]$ ssh --help
    usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
    [-D [bind_address:]port] [-e escape_char] [-F configfile]
    [-I pkcs11] [-i identity_file]
    [-L [bind_address:]port:host:hostport]
    [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
    [-R [bind_address:]port:host:hostport] [-S ctl_path]
    [-W host:port] [-w local_tun[:remote_tun]]
    [user@]hostname [command]

    Hai suggerimenti?
    Grazie

  7. Piuma says:

    Ciap francesco, non vedi l'opzione perché hai lanciato l'ssh vecchio, quello che già avevi installato sul sistema. il comando ssh con la modifica lo hai installato in /opt/openssh (come specificato nel --prefix) quindi dovrai lanciarlo specificando il percorso:

    /opt/openssh/bin/ssh --help

  8. francesco says:

    Hai ragione, ero convinto di aver lanciato ssh da quella directory ma avevo dimenticato di mettere ./ssh -help. Grazie

  9. pella says:

    OpenSSH_5.8p2, OpenSSL 1.0.0g-fips 18 Jan 2012

    include già l'opzione "-W" per connessioni host:porta

    consiglio di cambiare il tipo di opzione nella patch...!

Leave a Reply

Your email address will not be published. Required fields are marked *