24.2.4 ssh

Il comando ssh (secure shell - man page ssh(1)) è un client di comunicazione che, utilizzando il protocollo SSH (SSH1 o SSH2), permette di effettuare il login su una macchina remota. Se il login va a buon fine si avrà l’accesso alla shell definita per l’utente che ha effettuato il login e si potrà così interagire con il sistema remoto come se si impartissero i comandi direttamente sulla sua tastiera.

Quando ssh si connette a sshd, controlla la chiave pubblica di sistema della macchina S con quelle presenti nei file /etc/ssh/ssh_known_hosts e ~/.ssh/known_hosts. Nel caso in cui la chiave non sia presente ssh richiede interativamente se deve essere effettuata la connessione alla macchina S ed in caso affermativo memorizza la relativa chiave nel file ~/.ssh/known_hosts.

L’autenticazione tra il client (macchina C) ed il server (macchina S) può avvenire, dipendentemente dal protocollo utilizzato (SSH1 o SSH2), per mezzo di uno dei metodi nell’ordine di seguito riportati

____________________________________________________________________

Comando: ssh
Path: /usr/bin/ssh

SINTASSI  
# ssh [option] {host | username@host} [command]  
DESCRIZIONE

_____________________

Il comando ssh utilizza un file di configurazione (per default esiste un file di configurazione a livello di sistema, /etc/ssh/ssh_config, ed uno a livello utente, ~/.ssh/config) contenente le direttive per il funzionamento di ssh, secondo la seguente sintassi (v. man page ssh_config(5))

 
keyword [args]  
dove keyword indica una specifica direttiva e args sono gli eventuali argomenti relativi alla direttiva considerata. I possibili valori di keyword sono di seguito riportati

La direttiva viene presa in considerazione secondo l’elenco nell’ordine di seguito riportato

  1. opzione sulla riga di comando;
  2. file di configurazione a livello utente (~/.ssh/config);
  3. file di configurazione a livello di sistema (/etc/ssh/ssh_config);

Il file ~/.ssh/known_hosts contiene le chiavi delle macchine remote alle quali l’utente ha acceduto tramite ssh e che non sono elencate nel file /etc/ssh/ssh_known_hosts.

Chiavi private

Il file ~/.ssh/identity contiene la chiave privata RSA dell’utente. Viene utilizzato dal protocollo SSH1.

Il file ~/.ssh/id_rsa contiene la chiave privata RSA dell’utente. Viene utilizzato dal protocollo SSH2.

Il file ~/.ssh/id_dsa contiene la chiave privata DSA dell’utente. Viene utilizzato dal protocollo SSH2.

È possibile cifrare tramite 3DES il contenuto del file per mezzo di una passphrase in modo che soltanto l’utente sia in grado di leggerne il contenuto (il superuser infatti, sebbene possa accedere al file, non può in tal caso visualizzarne in chiaro il contenuto).

ssh ignora il file contenente la chiave privata dell’utente se esso è accessibile dagli altri (se è abilitato uno dei diritti di accesso per gli altri utenti non proprietari del file).

Chiavi pubbliche

Il file ~/.ssh/identity.pub contiene la chiave pubblica RSA dell’utente. Viene utilizzato dal protocollo SSH1.

Il file ~/.ssh/id_rsa.pub contiene la chiave pubblica RSA dell’utente. Viene utilizzato dal protocollo SSH2.

Il file ~/.ssh/id_dsa.pub contiene la chiave pubblica DSA dell’utente. Viene utilizzato dal protocollo SSH2.

Le chiavi pubbliche devono essere inserite nel file ~/.ssh/authorized_keys sulla macchina remota alla quale si vuole accedere.

Il file ~/.ssh/config contiene la configurazione di ssh per l’utente in questione.

Il file ~/.ssh/authorized_keys contiene l’elenco delle chiavi pubbliche (RSA/DSA) relative agli utenti ai quali è consentito l’accesso da remoto alla macchina considerata (v. sshd(8)).

Il file /etc/ssh/ssh_known_hosts contiene l’elenco delle chiavi delle macchine remote a cui si vuole accedere. È composta da righe secondo la seguente sintassi

 
system_name public_key [comment]  
Il file /etc/ssh/ssh_config contiene la configurazione di ssh a livello di sistema.

Il file /etc/ssh/ssh_host_key contiene la chiave privata RSA del sistema, utilizzata dal protocollo SSH1 (è accessibile in lettura soltanto dal superuser).

Il file /etc/ssh/ssh_host_rsa_key contiene la chiave privata RSA del sistema, utilizzata dal protocollo SSH2.

Il file /etc/ssh/ssh_host_dsa_key contiene la chiave privata DSA del sistema, utilizzata dal protocollo SSH2.

Il file ~/.rhosts contiene l’elenco delle macchine client e degli utenti che possono accedere da remoto, utilizzato dall’autenticazione hostbased.

Il file ~/.shosts è identico al file ~/.rhosts tranne per il fatto che mentre ~/.rhosts è accessibile anche da rsh e rlogin ~/.shosts è utilizzato soltanto da ssh.

Il file /etc/hosts.equiv contiene i nomi delle macchine client da cui può essere effettuato l’accesso alla macchina server in questione, utilizzato nel caso di autenticazione hostbased.

Il file /etc/shosts.equiv è identico al file /etc/hosts.equiv tranne per il fatto che mentre /etc/hosts.equiv è accessibile anche da rsh e rlogin /etc/shosts.equiv è utilizzato soltanto da ssh.

Il file /etc/ssh/sshrc è uno script (a livello di sistema) lanciato automaticamente da ssh non appena qualunque utente accede al sistema da remoto, prima ancora che l’utente abbia l’accesso alla shell.

Il file ~/.ssh/rc è uno script (a livello utente) lanciato automaticamente da ssh non appena l’utente in questione accede al sistema da remoto, prima ancora che abbia l’accesso alla shell.

Il file ~/.ssh/environment contiene eventuali definizioni di variabili d’ambiente.

[da completare ...]

24.2.4.1 Port forwarding

Il comando ssh permette anche di rendere sicure comunicazioni che utilizzano protocolli non sicuri, effettuando quello che viene definito un port forwarding, ovvero uno spostamento di porte di comunicazione. Ad esempio, si supponga di voler rendere sicura una comunicazione in chiaro dalla macchina C, porta c alla macchina S, porta s. Innanzitutto è necessario che lato server (macchina S) sia in esecuzione il daemon sshd e la relativa porta di ascolto (per default la 22) sia aperta. Lato client (macchina C) con il comando ssh si può instaurare un canale sicuro (cifrato) sul quale vengano redirette le richieste di comunicazione sulla porta c della macchina C, quindi la macchina S inoltrerà i pacchetti ricevuti alla porta s. E viceversa. Ovvero, quando la macchina C aprirà una connessione a se stessa sulla porta c, questa verrà reindirizzata, in maniera cifrata, alla porta sulla quale è in ascolto sshd (22) sulla macchina S, che poi reinoltrerà i pacchetti ricevuti alla porta s della macchina S stessa.

(figura) [da completare ...]

Si può anche utilizzare il port forwarding nel caso in cui sulla macchina S non sia in esecuzione sshd. In questo caso ci si può appoggiare su una terza macchina (macchina I) sulla quale sia in esecuzione sshd, in modo tale che il canale sicuro (cifrato) sul quale vengano redirette le richieste di comunicazione sulla porta c della macchina C porti i pacchetti alla macchina S, che a sua volta inoltrerà i pacchetti ricevuti alla porta i della macchina I. E viceversa. È chiaro che la sicurezza della comunicazione sarà in questo caso limitata soltanto al tratto che collega la macchina C con la macchina I.

(figura) [da completare ...]

Ad esempio, se si vuole rendere sicuro lo scarico di posta elettronica effettuato tramite il protocollo POP (porta 110) tra la macchina mypc.mydomain.it, sulla quale c’è il client di posta elettronica (ad esempio Evolution), ed il server di posta (macchina mail.mydomain.it), si può operare come segue. Innanzitutto sulla macchina mail.mydomain.it deve essere in esecuzione sshd e sulla macchina mypc.mydomain.it si può impartire il comando seguente:

 
$ ssh -L 1100:mail.mydomain.it:110 mail.mydomain.it  
Quindi si devono modificare le impostazioni del client di posta elettronica (su mypc.mydomain.it) in modo tale che per scaricare la posta non si colleghi più alla porta 110 di mail.mydomain.it, ma si colleghi alla porta 1100 di mypc.mydomain.it. In questo modo, quando il client di posta si connetterà alla porta 1100 di mypc.mydomain.it, la comunicazione verrà rediretta su un canale sicuro verso mail.mydomain.it che, ricevuti i pacchetti, li inoltrerà a se stesso sulla porta 110. Qui ci sarà il POP server che risponderà al mittente, anch’esso attraverso il canale di comunicazione sicuro.

Nel caso in cui sulla macchina mail.mydomain.it non sia in esecuzione sshd, si può reindirizzare la comunicazione sicura verso un’altra macchina sulla quale c’è sshd (ad esempio other.mydomain.it) e quindi impartire sulla macchina mypc.mydomain.it il comando seguente

 
$ ssh -L 1100:mail.mydomain.it:110 other.mydomain.it  
Quindi si devono modificare le impostazioni del client di posta elettronica (su mypc.mydomain.it) come descritto precedentemente. Quando il client di posta si connetterà alla porta 1100 di mypc.mydomain.it, la comunicazione verrà rediretta su un canale sicuro verso other.mydomain.it che, ricevuti i pacchetti, li inoltrerà a mail.mydomain.it sulla porta 110. Qui ci sarà il POP server che risponderà al mittente, anch’esso attraverso lo stesso meccanismo. In questo caso però la comunicazione avviene in modo sicuro soltanto tra mypc.mydomain.it e other.mydomain.it.

[da completare ...]