|
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
- 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ì
- 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.
| 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 |
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
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.


Ottimo complimenti,
soprattutto la patch a OpenSSH,
Nicola
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.
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.
Ottimo per la creazione di script bash per automatizzare il lavoro su diverse macchine.
Grande PiumaLab
Complimenti!!! è proprio quello che cercavo!!!
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
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
Hai ragione, ero convinto di aver lanciato ssh da quella directory ma avevo dimenticato di mettere ./ssh -help. Grazie