3 Installazione e Setup

 

3.1 Installazione

OpenSSH può venire scaricato dal sito http://www.openssh.com/. È possibile ottenerla sia in formato sorgente sia in formato binario RPM. Se si ha intenzione di scaricare i binari RPM, allora si ha bisogno dei seguenti file:

 

Il programma Zlib è un progetto open source e free che ha come obiettivo quello di costruire una libreria per la compressione dei dati. Questo programma, in genere, si trova già all'interno di quasi tutte le principali distribuzioni di linux. Se non lo fosse, risulta possibile scaricarlo dal sito www.freesoftware.com/pub/infozip/zlib/. Sono disponibili sia il formato binario RPM sia il sorgente.

Il programma OpenSSL è un altro sforzo open source, mirato a creare uno strumento (toolkit) commerciale per realizzare il Secure Socket Layer (SSL), Transport Layer Securety (TLS) e librerie per la realizzazione di sistemi fortemente crittografati. Anche questo programma è disponibile sia come sorgente sia come pacchetto RPM. I pacchetti RPM si possono reperire insieme a quelli del programma OpenSSH. I sorgenti sono invece disponibili presso il sito http://www.openssl.org/.

Vengono riportate tutte le istruzioni necessarie per installare il programma SSH in una macchina Linux.

 

Installazione del programma Zlib

 

Se si è prelevato il pacchetto in formato RPM, basta digitare alla riga di comando quanto segue:

 

rpm -ivh zlib-versione.rpm

 

altrimenti, se si preferisce usare il formato tar.gz, si deve scrivere:

 

tar xzvf zlib-versione.tar.gz

cd zlib-versione

./configure

make

su -c "make install"

 

 

Installazione del programma OpenSSL

Se si dispone del pacchetto in formato RPM, alla riga di comando si deve scrivere:

 

rpm -ivh openssl-versione.rpm

 

diversamente, per il pacchetto in formato tar.gz:

 

tar xzvf openssl- versione.tar.gz

cd openssl- versione

./configure

make

su -c "make install"

  

Installazione del programma OpenSSH

 

Se si sono prelevati i pacchetti in formato RPM, é sufficiente scrivere alla riga di comando quanto riportato:

 

rpm -ivh versionep.i386.rpm

rpm -ivh openssh-clients- versionep.rpm

rpm -ivh openssh-server- versionep.rpm

 

per il pacchetto in formato tar.gz, si deve invece digitare:

 

tar xzvf openssh- versione.tar.gz

cd openssh- versione

./configure --prefix=/usr --sysconfdir=/etc/ssh

 

Il parametro "--prefix" impone di porre i file binari nelle directoty bin, sbin ed i manuali nella directory man. Per default OpenSSH pone i file di configurazione all'interno della cartella /usr/local/etc. Utilizzando il parametro sysconfdir risulta possibile modificare l'impostazione di default e impostare, a propria scelta, la cartella contenente i file di configurazione. I comandi:

 

make

su -c "make install"

su -c "make host-key"

 

consentono di installare i file generati e creare sia le chiavi host RSA sia quelle DSA relative al particolare sistema che si utilizza. Il programma ssh per funzionare impiega un metodo a coppia di chiavi pubblica/privata. Lo RSA é il formato piú vecchio, mentre il DSA é quello piú recente e risulta pure possibile utilizzarlo per la SHH2.

All'interno della sotto-cartella contrib ci sono pochi file importanti. Il principale dei quali é sshd.pam.generic. La maggior parte delle recenti distribuzioni Linux usano PAM per l'autenticazione. Questi é un file generico che si adatta alla maggior parte delle distribuzioni. Una versione per la Red Hat può essere trovata all'interno della sotto-cartella redhat. Per utilizzarlo è sufficiente copiarlo all'interno della cartella /etc/pam.d/ col nome di sshd:

 

cp sshd.pam.generic /etc/pam.d/sshd.

 

Sempre all'interno di questa cartella si trovano gli script init relativi alle distribuzioni SuSE e Red Hat. La cartella corrispondente alla SuSE contiene inoltre un file di configurazione che andrebbe copiato in /etc rc.config/:

 

cp rc.config.sshd /etc/rc.config.d/sshd.rc.config.z

 

Questi script possono venire utilizzati con la maggior parte delle distribuzioni con pochi cambiamenti. Uno dei cambiamenti necessari da fare sullo script della SuSE é quello del path da /usr/sbin a /usr/local/sbin.

Si deve poi copiare lo script di startup all'interno della cartella /etc/rc.d/init.d (per la Red Hat), /sbin/init.d (per la SuSE). Fatto ciò non resta che avviare il demone ssh: /etc/rc.d/init.d/sshd start (Red Hat), /sbin/init.d/sshd start (SuSE).

Per verificare se il demone SSH é in esecuzione, si può provare a fare un collegamento via telnet alla porta 22 della propria macchina. Se il demone é in esecuzione si dovrebbe ottenere quanto segue:

 

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'
SSH-1.99-OpenSSH_2.3.)p1

 

File Interessati

 

·        $HOME/.ssh/identity, $HOME/.ssh/id_dsa - Contengono le chiavi private RSA e DSA dell'utente rispettivamente. Nota che SSH ingnora una chiave privata registrata in un file accessibile da altri.

 

3.2 Configurazione

Di default la configurazione di OpenSSH funziona per chiunque si colleghi. Si possono trovare i vari file di configurazione in /etc/ssh o, se si lasciano le impostazioni di default, in /usr/local/etc. All'interno di queste cartelle ci sono due file, ssh_config e sshd_config. Il file ssh_config imposta le opzioni per il programma SSH client che verrà utilizzato. Il secondo file, sshd_config, é il file di configurazione del demone SSH.

Quando viene lanciato il programma ssh, questi per prima cosa consulta le opzioni inserite alla riga di comando, poi il file $HOME/.ssh/config e alla fine il file /etc/ssh/ssh_config. Questo consente ad un utente di impostare le proprie opzioni senza modificare quelle comuni che si trovano in /etc/ssh/ssh_config. Il formato del file /etc/ssh/sshd_config é piuttosto semplice. I files di configurazione possono contenere: righe di commento evidenziate dal simbolo ‘#’ iniziale, righe vuote (che vengono ignorate), righe contenenti direttive, composte da coppie <nome> <valore>, spaziate, senza alcun simbolo di assegnamento

 

/etc/ssh/sshd_config: Principali direttive

 

etc/ssh/sshd_config: Esempio

# This is ssh server systemwide configuration file.

Port 22

ListenAddress 0.0.0.0

HostKey /etc/ssh/ssh_host_key

RandomSeed /etc/ssh/ssh_random_seed

ServerKeyBits 768

LoginGraceTime 600

KeyRegenerationInterval 3600

PermitRootLogin yes

IgnoreRhosts no

StrictModes yes

QuietMode no

X11Forwarding yes

X11DisplayOffset 10

FascistLogging no

PrintMotd yes

KeepAlive yes

SyslogFacility AUTH

RhostsAuthentication no

RhostsRSAAuthentication yes

RSAAuthentication yes

PasswordAuthentication yes

PermitEmptyPasswords yes

UseLogin no

# PidFile /var/run/sshd.pid

# AllowHosts *.our.com friend.other.com

# DenyHosts lowsecurity.theirs.com *.evil.org evil.org

# Umask 022

# SilentDeny on

 

$HOME/.ssh/config: Principali direttive

Il formato del file $HOME/.ssh/config é piuttosto semplice. Le opzioni da impostare non sono tante e non tutte sono opportune:

 

/etc/ssh/ssh_config: Esempio

# Site-wide defaults for various options

# Host *

# ForwardAgent yes

# ForwardX11 yes

# RhostsAuthentication yes

# RhostsRSAAuthentication yes

# RSAAuthentication yes

# TISAuthentication no

# PasswordAuthentication yes

# FallBackToRsh yes

# UseRsh no

# BatchMode no

# StrictHostKeyChecking no

# IdentityFile ~/.ssh/identity

# Port 22

# Cipher idea

# EscapeChar ~

 

3.3 Comandi Principali

Per prima cosa quello che ogni utente deve fare é creare una propria coppia di chiavi pubblica/privata. Questo viene realizzato dal programma ssh-keygen, basta infatti scrivere alla riga di comando: ssh-keygen -d. Il comando ssh-keygen é sufficiente a realizzare una chiave RSA. L'opzione -d permette di costruire in luogo di una chiave RSA una chiave DSA che potrà essere utilizzata in seguito insieme a SSH2. Verrà chiesto di inserire il nome del file in cui salvare le chiavi. Questo consente di avere coppie di chiavi pubbliche/private differenti per collegarsi ai vari host. La chiave privata viene salvata, col nome del file specificato, in $HOME/.ssh/NomeFileScelto (per default il nome del file é identity per la coppia di chiavi RSA e id_dsa per quella DSA) mentre la parte pubblica della chiave creata viene posta nel file $HOME/.ssh/NomeFileScelto.pub. Successivamente viene chiesto di inserire la frase (passpharse) per criptare la chiave privata. Sebbene si possa fare a meno di inserire questa frase, per motivi di sicurezza é meglio farlo !

$ ssh-keygen -b 1024 -N 'password'

ssh é molto semplice da usare. Come sostituto di telnet ha una miriade di opzioni che lo rendono estremamente flessibile. Per collegarsi ad una macchina remota di nome NomeHost basta scrivere al prompt di shell:

$ ssh NomeHost

Questo é tutto ciò che si deve fare per rendere sicura la connessione con la macchina “NomeHost. Se é la prima volta che ci si collega a NomeHost, comparirà un messaggio simile al seguente:

The authentication of host NomeHost can't be established.
RSA key fingerprint is 3b:60:57:4e:6c:59:5a:99:cf:41:d5:e0:14:af:0d:a1.
Are you sure you want to continue connecting (yes/no) ?

Scrivere “yes per aggiungere la chiave relativa al host alla lista degli host conosciuti da SSH. Questa lista viene collocata all'interno del file $HOME/.ssh/know_hosts. Una volta che si ha digitato la password la connessione ha luogo.Per le connessioni successive alla prima(verso lo steso host) il precedente messaggio non appare ma la chiave inviata dal server viene confrontata con quella memorizzata e nel caso siano differenti appare un messaggio di avviso. Se il confronto ha successo si prosegue normalmente. Un comando che probabilmente si vorrà utilizzare é il seguente:

 

ssh -C -i NomeFileConteneteLaCoppiaDiChiavi -v –x NomeUtente@NomeHost [comando]

 

Dove:

 

·        -C: Indica di usare la compressione dei dati. Per le connessioni via modem é un ottima idea.

·        -i: Se si usano piú coppie di chiavi pubbliche/private per collegarsi ai vari host, questa opzione consente di specificare quella da impiegare per connettersi al host NomeHost. In particolare va indicato il percorso e il nome del file che contiene la chiave privata che deve venire usata.

·        -x: Disabilita il forward automatico delle connessioni X11;

·        -v: Mostra le informazioni necessarie a conoscere l'andamento della connessione.

·        NomeUtente: Il nome utente con cui ci si vuole collegare.

·        NomeHost: Il nome della macchina a cui ci si desidera collegare.

·        [comando]: È opzionale e serve ad eseguire un comando appena viene stabilita la connessione.

 

Un ulteriore vantaggio dello SSH é la possibilità di collegarsi agli host remoti senza specificare alcuna password. Basta copiare il file contenente la chiave pubblica, sia RSA o DSA, sul server a cui si desidera connettersi. Sul server, é poi sufficiente aggiungere il riferimento a questo file alla lista dei file che si trova all'interno del $HOME/.ssh/authorized_keys (se si tratta di una chiave RSA) o $HOME/.ssh/authorized_key2 (se si tratta invece di una chiave DSA). Una volta eseguite queste configurazioni, per collegarsi alla propria cartella home sul server remoto, non resta che eseguire normalmente il comando ssh.

 

Trasferimenti di file sicuri

Il programma SSH fornisce inoltre un modo sicuro di trasferire i propri file attraverso internet. Il programma da impiegare in questo caso é scp (secure copy). La sintassi di scp é al solito molto semplice:

scp NomeUtente@NomeHostDiPartenza:NomeFileDaCopiare NomeUtente@NomeHostDiArrivo:NomeFile

Se si desidera copiare un file che si trova in locale in un altro host facendo uso di SSH si può scrivere:

scp NomeFileDaCopiare NomeUtente@NomeHost:NomeFile da copiare.

Questo comando copierà il file NomeFileDaCopiare che si trova nella directory corrente in quella dell'utente NomeUtente dell'host NomeHost. I Il simbolo di punteggiatura (:) serve ad evitare che il comando scp copi in locale il file NomeFileDaCopiare in uno dal nome NomeUtente@NomeHost! Per copiare un file che si trova in un host remoto nella cartella locale, si deve invece scrivere:

scp NomeUtenteRemoto@NomeHostRemoto:NomeFileDaCopiare.

In questo modo verrà copiato il file NomeFileDaCopiare dell'utente NomeUtenteRemoto che si trova nell'host remoto NomeHostRemoto all'interno della cartella locale corrente. Esiste inoltre l'opzione -r per copiare in modo ricorsivo i file da una cartella ad un altra.

 

 

Ulteriori esempi pratici

 

 

Esempio: Port Forwarding

Come già detto, il port forwarding permette di creare un canale di comunicazione sicuro attraverso il quale veicolare qualsiasi conenssione TCP. Il suo funzionamento può essere spiegato attraverso un esempio. Immaginiamo il seguente scenario:

 

 

Host A è separato dalla intranet da una rete insicura e deve comunicare via telnet con Host C. Host B permette connessioni SSH. Con il port forwarding di SSH viene creato il canale sicuro tra Host A e Host B, mentre la connessione telnet vera e propria viene effettuata tra Host B e Host C. Con il seguente comando, dato su Host A:

hostA>   ssh   -L   1111:HostC:23   HostB   sleep   100

viene allocata la porta TCP 1111 su Host A attraverso la quale, passando per il canale sicuro, si arriva alla porta 23 (telnet) di Host C. Per completare la connessione vera e propria bisogna effettuare un telnet a questa porta:

hostA>   telnet   localhost   1111

Da notare che Host B e Host C possono coincidere. L'esempio illustrato riguarda il forwarding di una porta dall'host locale verso un host remoto. E' possibile effettuare anche l'operazione inversa, ossia il forward di una porta remota attraverso l'host locale.

 

3.4 Dimostrazione di utilizzo

Dopo aver installato con successo il pacchetti che compongono OpenSSH, la prima cosa che occorre fare è munirsi delle coppie di chiavi pubblica/privata per gli algoritmi a chiave pubblica supportati. Il comando per generare una coppia di chiavi è ssh-keygen che permette di creare chiavi RSA e DSA di lunghezza variabile e nel formato relativo al protocollo SSH1 ed SSH2.

Il comando ssh-keygen ci chiederà di specificare i file in cui vogliamo salvare le nostre chiavi ed opzionalmente di cifrare la parte privata della chiave con una “passphrase". Gli esempi di seguito generano nell'ordine:

 

·        Una coppia di chiavi RSA relative al protocollo SSH1

·        Una coppia di chiavi RSA relative al protocollo SSH2

·        Una coppia di chiavi DSA relative al protocollo SSH2

(Tutte le chiavi hanno una dimensione di default di 1024 bit)





Il comando ssh é molto semplice da usare. Come sostituto di telnet ha una miriade di opzioni che lo rendono estremamente flessibile. Per collegarsi ad una macchina remota di nome NomeHost basta scrivere al prompt della shell:

ssh NomeHost -l “login remota”-v

L'opzione “-v” attiva la modalità di verbose, che fornisce un output dettagliato su come sta procedendo la connessione, si possono infatti riconoscere tutti i passi del protocollo SSH2, dallo scambio delle versioni del software per stabilire la compatibilità alla richiesta di una shell interattiva ed all'inoltro del traffico X11.


Se durante questa operazione avessimo fatto partire un programma di analisi del traffico TCP/IP (sniffer) con l'intenzione di catturare la password digitata dall'utente avremmo irrimediabilmente fallito. A dimostrazione di ciò mostriamo cosa avrebbe catturato uno degli sniffer più famosi e semplici da usare: Ethereal.


Come si può notare, le uniche parti in chiaro sono quelle relative allo scambio delle versioni ed alla negoziazione degli algoritmi. Terminate queste fasi, tutto il traffico catturato successivamente risulta cifrato.

Mostriamo ora come sia possibile rendere sicura qualsiasi connessione TCP/IP tramite il meccanismo di port forwarding fornitoci da SSH. Come esempio mostriamo come rendere sicura una connessione HTTP, protocollo che prevede scambio di dati in chiaro. Per sincerarci di questo mostriamo cosa accade quando il nostro sniffer viene posto in ascolto durante la nostra sessione HTTP. L'esempio si basa sulla richiesta della pagina di default del server junior, in cui è presente un form HTTP, nei cui campi inseriamo dei dati di prova. 


Alla pressione del bottone "Submit Query" i dati vengono inviati con il metodo POST ad uno script CGI scritto nel linguaggio Perl. Tale script risponde semplicemente dando l'eco dei dati immessi. Di seguito mostriamo il codice sorgente dello script e l'output di esso mostrato nella finestra del browser.

#!/usr/bin/perl

use CGI;
$p=CGI->new;

print $p->header;
print "<html><title>Riepilogo dati immessi</title>
<body><font size=+2><center><bold>riepilogo dati immessi</bold></center>";

print "<left><br>Nome = ".$p->param("nome");
print "<left><br>Cognome = ".$p->param("cognome");
print "<left><br>Numero di carta di credito = ".$p->param("numerocarta");
print "<left><br>Login = ".$p->param("login");
print "<left><br>Password = ".$p->param("password");
print "</font></body></html>";

Con il seguente comando inoltriamo la connessione al server HTTP sul canale cifrato creato con il server SSH. Nel comando specifichiamo la porta locale a cui si connetterà in seguito il nostro web browser, il nome dell'host e la porta su cui gira il server HTTP, ed infine il nome dell'host su cui gira il server SSH (nel nostro esempio i due server girano sullo stesso host: "junior").

Fatto ciò, non resta altro che specificare la seguente URL nel nostro browser: http://localhost:1111/ e la richiesta sarà automaticamente inoltrata all'host junior.



Il. nostro sniffer Ethereal non può fornirci nessuna informazione significativa, in quanto, avendo noi stabilito una connessione con un server SSH che si è occupato di inoltrare la connessione al server HTTP, il traffico catturato risulta cifrato e dunque incomprensibile: