Perché è sbagliatoVi 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
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.
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:
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 è 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"][/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
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" }
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
exec 3<&0 exec 0<$FILE
COUNT_LINE=0
while read line; do processLine $line COUNT_LINE=$(($COUNT_LINE + 1)) done exec 0<&3
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.