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.
|
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" |
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" |
|
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... |
|
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.
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
# 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 |
Il formato del file $HOME/.ssh/config é piuttosto semplice. Le opzioni da impostare non sono tante e non tutte sono opportune:
#
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.
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.
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.
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: