4.2.  SSH: operazione di rete protette

L'incremento del numero di computer connessi alle rete rende spesso necessario accedere a host da ubicazioni remote. Per effettuare questa operazione, l'utente deve generalmente inviare le stringhe relative al nome utente e al password a scopo di autenticazione. Se queste stringhe vengono inviate come testo normale, possono essere intercettate e usate in modo improprio per accedere all'account utente in questione senza l'autorizzazione dell'utente o senza che questi ne sia a conoscenza. In questo modo il malintenzionato può non solo accedere a tutti i file dell'utente, ma anche usare l'account per ottenere privilegi amministrativi o root oppure per accedere al sistema. In passato le connessioni remote venivano stabilite tramite telnet, che non garantisce alcuna forma di protezione in termini di cifratura o altri meccanismi di protezione contro accessi non autorizzati. Esistono anche altri canali di comunicazione non protetti come il protocollo FTP tradizionale e alcuni programmi di copia remoti.

La suite SSH fornisce la protezione necessaria poiché consente di cifrare sia le stringhe di autenticazione (costituite generalmente dal nome utente e dalla password) che tutti gli altri dati scambiati dagli host. Anche se la suite SSH non impedisce di fatto a terze parti di accedere ai dati, provvede comunque a cifrare i dati che possono essere convertiti in testo normale solo se si è in possesso della chiave di cifratura. Quindi, la suite SSH assicura comunicazioni protette anche su reti insicure come l'Internet. La suite SSH fornita con SUSE Linux è di tipo OpenSSH.

4.2.1. Il pacchetto OpenSSH

Il pacchetto OpenSSH viene installato per default da SUSE Linux. Dopo l'installazione è possibile usare i programmi ssh, scp e sftp in alternativa a telnet, rlogin, rsh, rcp e ftp. Nella configurazione di default l'accesso a un sistema SUSE Linux è possibile solo utilizzando le utility Open SSH e solo se il firewall consente l'accesso.

4.2.2. Il programma ssh

Il programma ssh consente di accedere ai sistemi remoti e di lavorare in modalità interattiva. In altre parole questo programma sostituisce sia telnet che rlogin. Il programma slogin è solo un collegamento simbolico che punta a ssh. Accedere ad esempio all'host sun con il comando ssh sun. L'host richiede di immettere la password per sun.

Se l'autenticazione ha esito positivo, è possibile usare sia le righe di comando remote che le applicazioni interattive come YaST. Se il nome utente locale è diverso da quello remoto, è possibile anche accedere al sistema con un nome di accesso diverso con i comandi ssh -l augustine sun o ssh augustine@sun.

Inoltre, il programma ssh consente anche di eseguire comandi sui sistemi remoti, al pari di rsh. Nell'esempio che segue, eseguire il comando uptime sull'host sun e creare una directory denominata tmp. Il risultato del programma viene visualizzato sul terminale locale dell'host earth.

ssh otherplanet "uptime; mkdir tmp" 
tux@otherplanet's password:
1:21pm  up  2:17,  9 users,  load average: 0.15, 0.04, 0.02

In questo caso le virgolette sono indispensabili per poter inviare entrambe le istruzioni con un unico comando. Solo questo formato consente di eseguire il secondo comando su sun.

4.2.3. scp—Copie sicure

scp copia i file su un sistema remoto. Rappresenta un'alternativa sicura e cifrata di rcp. Ad esempio scp MyLetter.tex sun: copia il file MyLetter.tex dall'host earth all'host sun. Se il nome utente dell'host earth è diverso da quello di sun, è necessario specificare quest'ultimo tramite il formato username@host. Non esistono opzioni -l per questo comando.

Se la password immessa è corretta, scp inizia a trasferire i dati visualizzando una riga di asterischi che incrementa man man che l'operazione avanza. Il programma visualizza inoltre il tempo stimato di arrivo sul lato destro della barra di avanzamento. Eliminare tutto l'output selezionando l'opzione -q.

scp fornisce anche una funzione di copia ricorsiva per tutte le directory. Il comando scp -r src/ sun:backup/ copia tutto il contenuto della directory src comprese le eventuali subdirectory nella directory backup dell'host sun. Se questa sottodirectory non è ancora stata creata, viene creata automaticamente.

L'opzione -p indica al programma scp di lasciare invariato il contrassegno orario dei file. -C comprime il trasferimento dei dati. Questa opzione riduce il volume dei dati da trasferire, ma incide significativamente sull'uso delle risorse del processore.

4.2.4. sftp—Trasferimento sicuro dei file

Il programma sftp può essere usato in alternativa al programma scp per trasferire i file in modo sicuro. Durante una sessione sftp, è possibile usare molti dei comandi del protocollo ftp. Il programma sftp è preferibile a scp soprattutto se si trasferiscono dati associati a file il cui nome è sconosciuto.

4.2.5. Il daemon SSH (sshd) - Lato server

Per poter usare i programmi client SSH ssh e scp, è necessario verificare che sia in esecuzione un server, ovvero il daemon SSH, in background e che sia in ascolto delle connessioni sulla porta 22 TTCP/IP. Quando viene avviato per la prima volta, il daemon genera tre coppie di chiavi. Ciascuna coppia di chiavi è costituita da una chiave privata e da una pubblica, quindi la procedura viene indicata come una procedura basata su chiavi pubbliche. Per proteggere le comunicazioni tramite SSH, è indispensabile che l'accesso ai file contenenti le chiavi private sia permesso solo all'amministratore del sistema. Le autorizzazioni di accesso ai file vengono impostate in base alla configurazione di default. Le chiavi private vengono utilizzate solo localmente dal daemon SSH e non devono essere assegnate ad altri utenti. I componenti delle chiavi pubbliche (che hanno l'estensione .pub) vengono invece inviati al client che richiede la connessione. Queste chiavi possono essere lette da tutti gli utenti.

La connessione viene stabilita dal client SSH. Il daemon SSH in attesa e il client SSH che invia la richiesta si scambiano i dati di identificazione necessari per consentire il confronto delle versioni del software e del protocollo nonché per evitare che le connessioni vengano stabilite sulle porte errate. Poiché la risposta alla richiesta viene inviata da un processo figlio del daemon originale, è possibile stabilire più connessioni SSH contemporaneamente.

OpenSSH supporta le versioni 1 e 2 del protocollo SSH per le comunicazioni tra il server e il client SSH. Le nuove installazioni di SUSE Linux vengono automaticamente impostate sulla versione 2. Per informazioni su come continuare a usare la versione 1 dopo un aggiornamento, seguire le istruzioni riportate in /usr/share/doc/packages/openssh/README.SuSE. Questo documento spiega anche come convertire un ambiente SSH 1 in un ambiente di lavoro SSH 2 con alcune semplici operazioni.

Quando si utilizza la versione 1 di SSH, il server invia la chiave dell'host pubblica e la chiave del server, che viene rigenerata dal daemon SSH ogni ora. Entrambe queste chiavi permettono al client SSH di criptare una chiave scelta liberamente che viene successivamente inviata al server SSH. Il client SSH indica anche al server quale metodo di cifratura usare.

La versione 2 del protocollo SSH non richiede una chiave per il server. Entrambi i lati usano un algoritmo basato sul modello Diffie-Helman per scambiare le chiavi.

Le chiavi private dell'host e del server sono indispensabili per poter decrittare la chiave della sessione e non possono essere ricavate dalle chiavi pubbliche. Solo il daemon SSH a cui è stata inviata la richiesta è in grado di decrittare la chiave della sessione utilizzando le proprie chiavi private (per ulteriori informazioni, vedere man /usr/share/doc/packages/openssh/RFC.nroff). Per monitorare attentamente la fase di connessione iniziale, è possibile attivare l'opzione di debugging verbose -v del client SSH.

Per default viene usata la versione 2 del protocollo SSH. Per usare la versione 1 del protocollo con lo swtich -1, è necessario ignorare l'impostazione di default. Il client salva tutte le chiavi pubbliche dell'host in ~/.ssh/known_hosts dopo il primo contatto con l'host remoto. Ciò ha lo scopo di evitare attacchi "intermedi" ossia di prevenire che server SSH sconosciuti utilizzino nomi e indirizzi IP acquisiti illegalmente da altri server. Questi attacchi vengono identificati come tali sia quando la chiave dell'host non è compresa in ~/.ssh/known_hosts sia nel caso in cui il server non sia in grado di decrittare la chiave della sessione senza la chiave privata corrispondente.

È sempre consigliabile effettuare una copia di backup delle chiave private e pubbliche salvate in /etc/ssh/ e custodirle in un'ubicazione esterna e protetta. Questa precauzione permette sia di individuare eventuali modifiche apportate alle chiavi di poter riutilizzare le chiavi originali dopo la reinstallazione. Inoltre, questo accorgimento evita che vengano visualizzati avvisi preoccupanti. Se il server SSH risulta corretto nonostante l'avviso, è necessario rimuovere la voce esistente del sistema da ~/.ssh/known_hosts.

4.2.6. Metodi di autenticazione SSH

È a questo punto che avviene l'autenticazione vera e propria che, nella forma più semplice, consiste nell'immettere una password come spiegato in precedenza. SSH è stato introdotto allo scopo di fornire un software sicuro e facile da usare. Essendo stato progettato per sostituire rsh e rlogin, SSH deve essere anche in grado di fornire un metodo di autenticazione adatto per gli usi di tutti i giorni. SSH soddisfa queste esigenze usando un'altra coppia di chiavi generata dall'utente. Il pacchetto SSH fornisce un programma di guida, ssh-keygen, che consente di eseguire questa operazione. Quando si immette ssh-keygen -t rsa o ssh-keygen -t dsa, il programma genera la coppia di chiavi e visualizza un messaggio che chiede all'utente di immettere il nome del file di base in cui salvare le chiavi.

Confermare l'impostazione di default e rispondere alla richiesta di una stringa di cifratura. Anche se il software suggerisce di immettere una stringa di cifratura vuota, è consigliabile immettere un testo compreso tra 10 e 30 caratteri per la procedura qui descritta. Non usare parole o frasi corte o semplici. Confermare la stringa di cifratura immessa. Successivamente viene visualizzato il file in cui vengono salvate le chiavi private e pubbliche, ossia i file id_rsa e id_rsa.pub nell'esempio.

Usare ssh-keygen -p -t rsa o ssh-keygen -p -t dsa per modificare la stringa di cifratura esistente. Copiare il componente della chiave pubblica (id_rsa.pub nell'esempio) sul computer remoto e salvarlo in ~/.ssh/authorized_keys. Questi dati vengono normalmente richiesti quando si stabilisce una nuova connessione. Se ciò non accade, controllare la posizione e il contenuto dei file.

Poiché a lungo andare questa procedura è più complessa che dover inserire ogni volta una password, Il pacchetto SSH fornisce un altro strumento, ssh-agent, che memorizza le chiavi private per tutta la durata di una sessione X. La sessione X in questione viene avviata come processo figlio di ssh-agent. Il modo migliore per effettuare questa operazione consiste nell'impostare la variabile usessh all'inizio del file .xsession su e accedere tramite un gestore di visualizzazione come KDM o XDM. In alternativa è possibile anche immettere ssh-agent startx.

A questo punto è possibile usare ssh o scp in modo normale. Se le chiavi pubbliche sono state distribuite come descritto in precedenza, non viene più visualizzata alcuna richiesta di immissione di password. Ricordarsi di terminare la sessione X o di bloccarla con un'applicazione protetta mediante password come xlock.

Tutte le modifiche più significative introdotte con la versione 2 del protocollo SSH sono descritte anche nel file /usr/share/doc/packages/openssh/README.SuSE.

4.2.7. Meccanismi X, di autenticazione e di inoltro

Oltre alle funzioni specificatamente studiate per migliorare la sicurezza, SSH semplifica anche l'uso di applicazioni X remote. Se si esegue ssh con l'opzione -X, la variabile DISPLAY viene impostata automaticamente sul computer remoto e l'output X viene esportato sul computer remoto tramite la connessione SSH esistente. Le applicazioni X avviate remotamente e visualizzate localmente con questo metodo non possono essere intercettate da utenti non autorizzati.

L'aggiunta dell'opzione -A permette di trasferire il meccanismo di autenticazione dell'agente ssh-agent al computer successivo. Ciò offre il vantaggio di poter lavorare su più computer senza dover immettere ogni volta la password. Tuttavia, ciò è possibile solo se la chiave pubblica è stata distribuita agli host di destinazione e opportunamente salvata.

Entrambi i meccanismi sono disattivati nelle impostazioni di default, ma possono essere attivati permanentemente in qualsiasi momento nel file di configurazione del sistema /etc/ssh/sshd_config o nel file di configurazione dell'utente ~/.ssh/config.

ssh può essere usato anche per reindirizzare le connessioni TCP/IP. Negli esempi che seguono, a SSH viene indicato di reindirizzare rispettivamente SMTP e la porta POP3:

ssh -L 25:sun:25 earth

Questo comando permette di reindirizzare qualsiasi connessione diretta alla porta 25 (SMTP) alla porta SMTP sull'host sun tramite il canale cifrato. Ciò è particolarmente utile se si utilizzano server SMTP senza funzioni SMTP-AUTH o POP-before-SMTP. In questo caso è possibile trasferire i messaggi al server di posta "home" da qualunque posizione arbitraria della rete per consentirne la consegna. Questo comando consente anche di trasferire tutte le richieste POP3 (sulla porta 110) su earth alla porta POP3:

ssh -L 110:sun:110 earth

Entrambi i comandi devono essere eseguiti come root poiché la connessione viene stabilita tramite porte locali. I messaggi e-mail vengono inviati e recuperati dagli utenti utilizzando la connessione SSH esistente. Per effettuare questa operazione è necessario impostare l'host SMTP e POP3 su localhost. Per ulteriori informazioni , consultare i manuali di ciascuno dei programmi descritti e i file nella directory /usr/share/doc/packages/openssh.