Ciao, Habrzhaliteli! Nel libro, David Clinton descrive 12 progetti reali, inclusa l'automazione del sistema di backup e ripristino, la configurazione di un cloud personale in stile Dropbox e la creazione di un proprio server MediaWiki. Attraverso esempi interessanti, studierai la virtualizzazione, il recupero d'emergenza, la sicurezza, il backup, l'implementazione di DevOps e la risoluzione dei problemi di sistema. Ogni capitolo si conclude con una panoramica delle raccomandazioni pratiche, un glossario di nuovi termini e esercizi.
Estratto «10.1. Creazione di un tunnel OpenVPN»
In questo libro ho già parlato molto della crittografia. SSH e SCP possono proteggere i dati trasmessi su connessioni remote (capitolo 3), la crittografia dei file protegge i dati memorizzati sui server (capitolo 8), e i certificati TLS/SSL possono proteggere i dati durante il trasferimento tra i siti web e i browser dei client (capitolo 9). Tuttavia, a volte i tuoi dati richiedono protezione in un ambito più ampio di connessioni. Ad esempio, è possibile che alcuni membri del tuo team debbano lavorare in viaggio, collegandosi a reti Wi-Fi tramite hotspot pubblici. Non bisognerebbe mai presumere che tutti questi hotspot siano sicuri, ma le persone hanno davvero bisogno di un modo per connettersi alle risorse aziendali — e in questo caso un VPN può aiutare.
Un tunnel VPN ben progettato crea una connessione diretta tra i client remoti e il server, in modo da nascondere i dati durante il loro trasferimento su una rete insicura. E allora? Hai già visto molti strumenti in grado di fare ciò tramite crittografia. Il vero valore di un VPN risiede nel fatto che, una volta aperto il tunnel, puoi collegare reti remote come se fossero tutte locali. In un certo senso, stai utilizzando un bypass.
Utilizzando una rete così estesa, gli amministratori possono lavorare sui propri server da qualsiasi luogo. Ma, cosa ancor più importante, un'azienda con risorse distribuite su più filiali può renderle tutte visibili e accessibili a tutti i gruppi che ne hanno bisogno, ovunque si trovino (fig. 10.1).
Un tunnel di per sé non garantisce la sicurezza. Tuttavia, uno dei standard di crittografia può essere integrato nella struttura della rete, migliorando notevolmente il livello di sicurezza. I tunnel creati utilizzando il pacchetto OpenVPN con codice sorgente aperto impiegano la stessa crittografia TLS/SSL di cui avete già sentito parlare. OpenVPN non è l'unica opzione disponibile per il tunneling, ma è una delle più conosciute. Si ritiene che sia leggermente più veloce e sicuro rispetto all'alternativo protocollo di tunneling di livello 2 che utilizza la crittografia IPsec.
Desideri che tutto il tuo team comunichi in modo sicuro tra loro, mentre sono in viaggio o lavorano in diversi edifici? È necessario creare un server OpenVPN per consentire la condivisione delle applicazioni e l'accesso all'ambiente di rete locale del server. Per farlo, è sufficiente avviare due macchine virtuali o due contenitori: uno per assumere il ruolo di server/host e l'altro per il client. Creare una VPN non è un processo semplice, quindi probabilmente varrà la pena dedicare qualche minuto per avere una visione d'insieme.

10.1.1. Configurazione del server OpenVPN
Prima di iniziare, voglio darti un consiglio utile. Se intendi fare tutto da solo (e ti consiglio vivamente di farlo), probabilmente scoprirai di lavorare con diverse finestre del terminale aperte sul desktop, ognuna delle quali collegata a una sua macchina. C'è il rischio che a un certo punto tu possa inserire un comando nella finestra sbagliata. Per evitare questo, puoi utilizzare il comando hostname per cambiare il nome della macchina visualizzato nella riga di comando in qualcosa che ti indichi chiaramente dove ti trovi. Una volta fatto, dovrai disconnetterti dal server e ricollegarti affinché le nuove impostazioni abbiano effetto. Ecco come appare:

Seguendo questo approccio e dando nomi appropriati a ciascuna delle macchine con cui lavori, sarai in grado di tenere facilmente traccia di dove ti trovi.
Dopo aver utilizzato hostname potresti imbatterti in fastidiosi messaggi Unable to Resolve Host OpenVPN-Server durante l'esecuzione di comandi successivi. L'aggiornamento del file /etc/hosts con il nuovo nome host appropriato dovrebbe risolvere il problema.
Preparare il tuo server per OpenVPN
Per installare OpenVPN sul tuo server, sono necessari due pacchetti: openvpn ed easy-rsa (per gestire il processo di generazione della chiave di crittografia). Gli utenti di CentOS devono prima installare il repository epel-release, se necessario, come hai fatto nel capitolo 2. Per poter verificare l'accesso all'applicazione server, puoi anche installare il server web Apache (apache2 per Ubuntu e httpd su CentOS).
Mentre configuri il server, ti consiglio di attivare il firewall, che blocca tutte le porte tranne quelle 22 (SSH) e 1194 (porta OpenVPN per impostazione predefinita). Questo esempio illustra come funzionerà ufw su Ubuntu, ma sono sicuro che ricordi ancora il programma firewalld di CentOS dal capitolo 9:
# ufw enable
# ufw allow 22
# ufw allow 1194Per consentire la routing interno tra le interfacce di rete sul server, è necessario decommentare una riga (net.ipv4.ip_forward = 1) nel file /etc/sysctl.conf. Questo permetterà di reindirizzare i client remoti secondo necessità dopo la loro connessione. Per applicare il nuovo parametro, esegui sysctl -p:
# nano /etc/sysctl.conf
# sysctl -pOra l'ambiente server è completamente configurato, ma c'è ancora qualcosa da fare prima di essere pronti: dovrai eseguire i seguenti passaggi (li esamineremo in dettaglio in seguito).
- Crea un set di chiavi per la crittografia dell'infrastruttura a chiave pubblica (PKI) sul server utilizzando gli script forniti con il pacchetto easy-rsa. Fondamentalmente, il server OpenVPN funge anche da propria autorità di certificazione (CA).
- Prepara le chiavi appropriate per il client
- Configura il file server.conf per il server
- Configura il tuo client OpenVPN
- Verifica la tua VPN
Generazione delle chiavi di crittografia
Per semplificare le cose, puoi configurare la tua infrastruttura di chiavi sulla stessa macchina su cui è in esecuzione il server OpenVPN. Tuttavia, le raccomandazioni di sicurezza normalmente suggeriscono di utilizzare un server CA separato per i dispiegamenti in ambiente di produzione. Il processo di generazione e distribuzione delle risorse della chiave di crittografia da usare con OpenVPN è illustrato nella figura 10.2.

Quando hai installato OpenVPN, è stata automaticamente creata la directory /etc/openvpn/, ma al momento è vuota. I pacchetti openvpn e easy-rsa vengono forniti con esempi di file modello che puoi utilizzare come base per la tua configurazione. Per avviare il processo di certificazione, copia la directory del modello easy-rsa da /usr/share/ in /etc/openvpn e vai nella directory easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaIl catalogo easy-rsa conterrà ora molti script. Nella Tab. 10.1 sono elencati gli strumenti che utilizzerai per creare le chiavi.

Le operazioni elencate richiedono diritti di root, quindi dovrai diventare root tramite sudo su.
Il primo file con cui lavorerai si chiama vars e contiene le variabili d'ambiente che easy-rsa utilizza per generare le chiavi. Devi modificare il file per usare i tuoi valori invece dei valori predefiniti già presenti. Ecco come apparirà il mio file (listing 10.1).
Listing 10.1. Parti principali del file /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"Eseguire il file vars permetterà di trasferire i suoi valori nell'ambiente della shell, dove verranno inclusi nel contenuto delle tue nuove chiavi. Perché il comando sudo da solo non funziona? Perché nella prima fase stiamo modificando lo script chiamato vars e poi lo applichiamo. Applicare significa che il file vars trasferisce i suoi valori nell'ambiente della shell, dove verranno inclusi nel contenuto delle tue nuove chiavi.
Assicurati di eseguire nuovamente il file utilizzando una nuova shell per completare il processo incompiuto. Una volta fatto, lo script ti chiederà di eseguire un altro script, clean-all, per rimuovere eventuali contenuti nella directory /etc/openvpn/easy-rsa/keys/:

Naturalmente, il passo successivo sarà eseguire lo script clean-all, seguito da build-ca, che utilizza lo script pkitool per creare il certificato root. Ti verrà chiesto di confermare le impostazioni di identificazione fornite in vars:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyIn seguito si utilizza lo script build-key-server. Poiché utilizza lo stesso script pkitool insieme al nuovo certificato root, vedrai le stesse domande per confermare la creazione della coppia di chiavi. Alle chiavi verranno assegnati nomi basati sugli argomenti che fornisci, che, a meno che tu non stia eseguendo più VPN su questo computer, saranno solitamente server, come nell'esempio:
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base UpdatedOpenVPN utilizza parametri generati tramite l'algoritmo Diffie-Hellman (con build-dh) per negoziare l'autenticazione per nuove connessioni. Il file creato qui non deve essere segreto, ma deve essere generato utilizzando lo script build-dh per le chiavi RSA attualmente attive. Se in futuro creerai nuove chiavi RSA, dovrai anche aggiornare il file basato sull'algoritmo Diffie-Hellman:
# ./build-dhLe tue chiavi sul lato server ora si troveranno nella directory /etc/openvpn/easy-rsa/keys/, ma OpenVPN non lo sa. Per impostazione predefinita, OpenVPN cercherà le chiavi in /etc/openvpn/, quindi copiale:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpnPreparazione delle chiavi di crittografia del client
Come già visto, nella crittografia TLS si utilizzano coppie di chiavi corrispondenti: una è impostata sul server e l'altra sul client remoto. Questo significa che avrai bisogno delle chiavi del client. Il nostro vecchio amico pkitool è ciò che ci vuole per questo. In questo esempio, avviando il programma nella directory /etc/openvpn/easy-rsa/, gli passiamo l'argomento client per generare i file denominati client.crt e client.key:
# ./pkitool clientI due file client insieme al file sorgente ca.crt, che si trova ancora nella cartella keys/, devono ora essere trasferiti in sicurezza al tuo cliente. A causa della loro proprietà e dei diritti di accesso, potrebbe non essere un compito così semplice. L'approccio più semplice è copiare manualmente il contenuto del file sorgente (e nulla oltre a questo contenuto) nel terminale funzionante sul desktop del tuo PC (evidenzia il testo, fai clic con il tasto destro del mouse e seleziona dal menu l'opzione Copia). Quindi incollalo in un nuovo file con lo stesso nome che stai creando nel secondo terminale collegato al tuo cliente.
Tuttavia, chiunque può copiare e incollare. Invece, pensate come amministratori, perché non avrete sempre accesso all'interfaccia grafica, dove è possibile l'operazione di copia/incolla. Copiate i file nella home del vostro utente (affinché l'operazione remota scp possa accedervi), poi usate chown per cambiare il proprietario dei file da root a un normale utente senza privilegi di root, così da poter eseguire l'azione remota scp. Assicuratevi che tutti i vostri file siano già impostati e accessibili. Sul client li sposterete un po' più tardi:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crtCon l'intero insieme di chiavi di crittografia pronte all'uso, dovete informare il server su come desiderate creare la VPN. Questo è fatto con il file server.conf.
Riduciamo il numero di tasti da premere
Devi digitare troppo? L'estensione con le parentesi aiuterà a ridurre queste sei comandi a due. Sono sicuro che riuscirete a studiare questi due esempi e a capire cosa sta succedendo. Ciò che è ancora più importante, sarete in grado di comprendere come applicare questi principi a operazioni che coinvolgono decine o addirittura centinaia di elementi:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Configurazione del file server.conf
Come puoi sapere come dovrebbe apparire il file server.conf? Ricorda il modello della directory easy-rsa che hai copiato da /usr/share/? Durante l'installazione di OpenVPN, è rimasto un file compresso del modello di configurazione che puoi copiare in /etc/openvpn/. Farò riferimento al fatto che il modello è compresso e ti presenterò uno strumento utile: zcat.
Sai già come visualizzare il contenuto di un file sullo schermo usando il comando cat, ma cosa succede se il file è compresso con gzip? Puoi sempre decomprimere il file, e poi cat lo visualizzerà volentieri, ma questo richiede uno o due passaggi in più del necessario. Invece, come avrai già intuito, puoi inserire il comando zcat per caricare il testo decompresso in memoria in un solo passaggio. Nell'esempio seguente, invece di stampare il testo sullo schermo, lo reindirizzerai in un nuovo file chiamato server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnLasciamo da parte la vasta e utile documentazione allegata al file e vediamo come potrebbe apparire quando hai finito di modificarlo. Nota che il punto e virgola (;) indica a OpenVPN di non leggere e non eseguire la riga successiva (elenco 10.2).

Esaminiamo alcune di queste impostazioni.
- Per impostazione predefinita, OpenVPN funziona sulla porta 1194. Puoi modificarla, ad esempio, per rendere ancora più difficile seguire le tue attività o evitare conflitti con altri tunnel attivi. Poiché la porta 1194 richiede una minima coordinazione con i client, è meglio procedere in questo modo.
- OpenVPN utilizza per il trasferimento dei dati il protocollo di controllo di trasmissione (TCP) oppure il protocollo UDP (User Datagram Protocol). Il TCP può essere leggermente più lento, ma è più affidabile e con maggiore probabilità è comprensibile per le applicazioni che operano su entrambe le estremità del tunnel.
- Puoi specificare dev tun quando desideri creare un tunnel IP più semplice ed efficiente, che trasmette solo il contenuto dei dati e nient'altro. D'altra parte, se hai bisogno di collegare più interfacce di rete (e le reti che rappresentano), creando un bridge Ethernet, dovrai scegliere dev tap. Se non comprendi il significato di tutto ciò, utilizza l'argomento tun.
- Le seguenti quattro righe trasmettono a OpenVPN i nomi di tre file di autenticazione sul server e il file di parametri dh2048 che hai creato in precedenza.
- La stringa server imposta l'intervallo e la maschera di rete da utilizzare per l'assegnazione degli indirizzi IP ai client al momento dell'accesso.
- Il parametro facoltativo push «route 10.0.3.0 255.255.255.0» consente ai client remoti di accedere a sottoreti private dietro al server. Per far funzionare questa operazione è necessaria anche una configurazione di rete sul server stesso, affinché la sottorete privata riconosca la sottorete OpenVPN (10.8.0.0).
- La stringa port-share localhost 80 permette di reindirizzare il traffico dei client in arrivo tramite la porta 1194 al server web locale che ascolta sulla porta 80. (Questo sarà utile se si intende utilizzare un server web per testare la VPN.) Funziona solo quando viene selezionato il protocollo tcp.
- Le righe user nobody e group nogroup devono essere attive: per fare ciò è necessario rimuovere i punti e virgola (;). Forzare i client remoti a lavorare sotto nobody e nogroup garantisce che le sessioni sul server siano prive di privilegi.
- Il log indica che le attuali voci nel registro sovrascriveranno le voci più vecchie ad ogni avvio di OpenVPN, mentre log-append aggiunge nuove voci al file di log esistente. Il file openvpn.log viene registrato nella cartella /etc/openvpn/.
Inoltre, nel file di configurazione si aggiunge spesso il valore client-to-client, in modo che più client possano vedersi tra loro oltre al server OpenVPN. Se sei soddisfatto della tua configurazione, puoi avviare il server OpenVPN:
# systemctl start openvpnA causa della natura mutevole della relazione tra OpenVPN e systemd, può essere necessario utilizzare la seguente sintassi per avviare il servizio: systemctl start openvpn@server.
L'esecuzione di ip addr per visualizzare l'elenco delle interfacce di rete del tuo server dovrebbe ora restituire un riferimento alla nuova interfaccia chiamata tun0. OpenVPN la creerà per gestire i client in entrata:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft foreverPotrebbe essere necessario riavviare il server prima che tutto inizi a funzionare correttamente. La prossima tappa è il computer client.
10.1.2. Configurazione del client OpenVPN
Tradizionalmente, i tunnel vengono costruiti con almeno due uscite (altrimenti li chiameremmo grotte). Un OpenVPN correttamente configurato sul server dirige il traffico nel tunnel e fuori da esso da un lato. Ma avrai anche bisogno di un qualche software in esecuzione sul lato client, cioè all'altra estremità del tunnel.
In questa sezione mi concentrerò sulla configurazione manuale di un computer con Linux di qualsiasi tipo per funzionare come client OpenVPN. Ma questo non è l'unico modo in cui è disponibile tale possibilità. OpenVPN supporta applicazioni client che possono essere installate e utilizzate su desktop e laptop con Windows o macOS, così come su smartphone e tablet basati su Android e iOS. Per ulteriori dettagli, vedere openvpn.net.
Il pacchetto OpenVPN deve essere installato sul computer client proprio come è stato installato sul server, anche se qui non è necessaria easy-rsa, poiché le chiavi utilizzate esistono già. È necessario copiare il file modello client.conf nella cartella /etc/openvpn/, che è stata appena creata. Questa volta il file non sarà compresso, quindi il comando cp funzionerà perfettamente per questo compito:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/La maggior parte delle impostazioni nel file client.conf saranno abbastanza comprensibili: dovrebbero corrispondere ai valori sul server. Come si può vedere dal seguente esempio di file, l'impostazione unica è remote 192.168.1.23 1194, che indica al client l'indirizzo IP del server. Assicurati nuovamente che questo sia l'indirizzo del tuo server. Devi anche fare in modo che il computer client verifichi l'autenticità del certificato del server per prevenire possibili attacchi 'man-in-the-middle'. Un modo per farlo è aggiungere la riga remote-cert-tls server (listing 10.3).

Ora puoi andare nella cartella /etc/openvpn/ e estrarre le chiavi di certificazione dal server. Sostituisci l'indirizzo IP del server o il nome di dominio nell'esempio con i tuoi valori:

Probabilmente non succederà nulla di emozionante fino a quando non avvierai OpenVPN sul client. Poiché devi passare un paio di argomenti, lo farai dalla riga di comando. L'argomento --tls-client indica a OpenVPN che agirai come client e ti connetterai tramite crittografia TLS, mentre --config specifica il tuo file di configurazione:
# openvpn --tls-client --config /etc/openvpn/client.confLeggi attentamente l'output del comando per assicurarti di essere connesso correttamente. Se qualcosa va storto la prima volta, potrebbe essere dovuto a una discordanza tra le impostazioni nei file di configurazione del server e del client o a un problema di connessione di rete/firewall. Ecco alcuni suggerimenti per la risoluzione dei problemi.
- Leggi con attenzione l'output dell'operazione OpenVPN sul client. Contiene spesso consigli preziosi su cosa non può essere eseguito e perché.
- Controlla i messaggi di errore nei file openvpn.log e openvpn-status.log nella cartella /etc/openvpn/ sul server.
- Controlla i messaggi relativi a OpenVPN e con timestamp appropriati nei log di sistema sia sul server che sul client. (journalctl -ce mostrerà le voci più recenti.)
- Assicurati di avere una connessione di rete attiva tra il server e il client (maggiori dettagli nel capitolo 14).
Informazioni sull'autore
David Clinton — sistemista, insegnante e scrittore. Ha amministrato, scritto e creato materiali didattici per molte importanti discipline tecniche, comprese le piattaforme Linux, il cloud computing (in particolare AWS) e le tecnologie containers come Docker. Ha scritto il libro Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Molti dei suoi corsi video possono essere trovati su Pluralsight.com e i link ad altri suoi libri (sull'amministrazione di Linux e sulla virtualizzazione dei server) sono disponibili su .
» Puoi approfondire con il libro su
»
»
Per gli utenti di Habr, uno sconto del 25% con il coupon — Linux
Dopo il pagamento della versione cartacea del libro, verrà inviato un libro elettronico via email.
Fonte: habr.com
