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. [caption id="attachment_133" align="alignnone" width="426" caption="shellselect"]shellselect[/caption] 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.