Libro «Linux in azione»

Libro «Linux in azione» Ciao, Habrozhiteli! Nel libro, David Clinton descrive 12 progetti reali, tra cui l'automazione del sistema di backup e ripristino, la configurazione di un cloud personale in stile Dropbox e la creazione di un server MediaWiki. Attraverso esempi interessanti, studierai la virtualizzazione, il disaster recovery, la sicurezza, il backup, l'implementazione di DevOps e la risoluzione dei problemi di sistema. Ogni capitolo si conclude con una panoramica di raccomandazioni pratiche, un glossario di nuovi termini e esercizi.

Estratto «10.1. Creazione di un tunnel OpenVPN»

In questo libro ho già parlato ampiamente della crittografia. SSH e SCP possono proteggere i dati trasmessi attraverso connessioni remote (capitolo 3), la crittografia dei file consente di proteggere i dati quando sono memorizzati sul server (capitolo 8) e i certificati TLS/SSL possono proteggere i dati durante il trasferimento tra siti e browser client (capitolo 9). Ma a volte i tuoi dati richiedono protezione in un contesto più ampio. Ad esempio, alcuni membri del tuo team potrebbero dover lavorare in viaggio, connettendosi a una rete Wi-Fi tramite hotspot pubblici. Non si può sicuramente dare per scontato che tutti questi hotspot siano sicuri, ma i tuoi collaboratori hanno davvero bisogno di un modo per connettersi alle risorse aziendali — e in questo caso un VPN può essere utile.

Un tunnel VPN progettato correttamente fornisce una connessione diretta tra client remoti e server in modo da nascondere i dati durante la loro trasmissione su una rete non sicura. E allora? Hai già visto molti strumenti che possono farlo tramite crittografia. Il valore reale di un VPN sta nel fatto che, aprendo un tunnel, è possibile connettere reti remote come se fossero tutte locali. In un certo senso, stai utilizzando una sorta di bypass.

Utilizzando una rete estesa di questo tipo, gli amministratori possono svolgere il proprio lavoro sui propri server da qualsiasi luogo. Ma, cosa 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).

Il tunnel stesso non garantisce sicurezza. Ma uno degli standard di crittografia può essere integrato nella struttura di rete, il che aumenta notevolmente il livello di sicurezza. I tunnel creati utilizzando il pacchetto OpenVPN con codice sorgente aperto utilizzano la stessa crittografia TLS/SSL di cui hai già letto. OpenVPN non è l'unica opzione disponibile per il tunneling, ma è tra le più conosciute. Si considera che sia leggermente più veloce e sicuro rispetto a un protocollo di tunneling di livello 2 alternativo che utilizza la crittografia IPsec.

Vuoi che tutti nella tua squadra comunichino in modo sicuro tra di loro mentre sono in viaggio o lavorano in diversi edifici? Per farlo, è necessario creare un server OpenVPN per consentire la condivisione delle applicazioni e l'accesso all'ambiente di rete locale del server. Per far sì che ciò funzioni, è sufficiente avviare due macchine virtuali o due contenitori: uno per la funzione di server/host e l'altro per il cliente. Creare una VPN non è un processo semplice, quindi è probabile che valga la pena spendere qualche minuto per avere una visione d'insieme.

Libro «Linux in azione»

10.1.1. Configurazione del server OpenVPN

Prima di iniziare, voglio darti un consiglio utile. Se hai intenzione di fare tutto da solo (e ti consiglio vivamente di farlo), probabilmente scoprirai di lavorare con più finestre del terminale aperte sul desktop, ognuna delle quali collegata alla propria 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 indicherà chiaramente dove ti trovi. Una volta fatto, dovrai disconnetterti dal server e riconnetterti affinché le nuove impostazioni abbiano effetto. Ecco come appare:

Libro «Linux in azione»
Seguendo questo approccio e assegnando nomi appropriati a ciascuna delle macchine con cui lavori, potrai tenere traccia facilmente di dove ti trovi.

Dopo aver utilizzato il hostname, potresti imbattersi in messaggi fastidiosi Unable to Resolve Host OpenVPN-Server durante l'esecuzione dei comandi successivi. Aggiornare il 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 e easy-rsa (per gestire il processo di generazione della chiave di crittografia). Gli utenti di CentOS devono prima, se necessario, installare il repository epel-release, come hai fatto nel capitolo 2. Per essere in grado di controllare 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 22 (SSH) e 1194 (la porta predefinita di OpenVPN). Questo esempio illustra come funzionerà ufw su Ubuntu, ma sono sicuro che ti ricordi ancora del programma firewalld di CentOS dal capitolo 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Per consentire il routing interno tra le interfacce di rete sul server, devi 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 far funzionare la nuova impostazione, esegui sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

Ora l'ambiente server è completamente configurato, ma c'è ancora qualcosa da fare prima di essere pronti: dovrai seguire i passaggi seguenti (li esamineremo in dettaglio più avanti).

  1. Crea sul server un set di chiavi per l'infrastruttura a chiave pubblica (PKI) utilizzando gli script forniti con il pacchetto easy-rsa. Fondamentalmente, il server OpenVPN funge anche da propria autorità di certificazione (CA).
  2. Prepara le chiavi appropriate per il client
  3. Configura il file server.conf per il server
  4. Configura il tuo client OpenVPN
  5. Controlla la tua VPN

Generazione delle chiavi di crittografia

Per semplificare le cose, puoi configurare la tua infrastruttura di chiavi sulla stessa macchina dove gira il server OpenVPN. Tuttavia, nelle raccomandazioni di sicurezza si suggerisce di utilizzare un server CA separato per i deployment in ambiente di produzione. Il processo di generazione e distribuzione delle risorse di chiave crittografia da utilizzare in OpenVPN è illustrato nella figura 10.2.

Libro «Linux in azione»
Quando hai installato OpenVPN, è stata automaticamente creata la directory /etc/openvpn/, ma al momento non c'è nulla al suo interno. I pacchetti openvpn e easy-rsa vengono forniti con esempi di file di 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-rsa

Il catalogo easy-rsa conterrà ora diversi script. Nella tabella 10.1 sono elencati gli strumenti che utilizzerai per creare le chiavi.

Libro «Linux in azione»

Le operazioni elencate richiedono privilegi 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 durante la generazione delle chiavi. Dovrai modificare il file per utilizzare i tuoi valori invece di quelli predefiniti già presenti. Ecco come apparirà il mio file (listing 10.1).

Listing 10.1. Sezioni 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"

L'esecuzione del file vars permetterà di trasferire i suoi valori nell'ambiente della shell, da cui saranno 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, da cui saranno inclusi nel contenuto delle tue nuove chiavi.

Assicurati di eseguire nuovamente il file utilizzando una nuova shell per completare il processo incompleto. Una volta fatto, lo script ti chiederà di eseguire un altro script, clean-all, per rimuovere eventuali contenuti nella cartella /etc/openvpn/easy-rsa/keys/:

Libro «Linux in azione»
Naturalmente, il passo successivo sarà eseguire lo script clean-all, seguito da build-ca, che utilizza lo script pkitool per creare il certificato radice. Ti verrà chiesto di confermare le impostazioni di identificazione fornite da vars:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

Successivamente c'è lo script build-key-server. Poiché utilizza lo stesso script pkitool insieme al nuovo certificato radice, vedrai le stesse domande per confermare la creazione della coppia di chiavi. I nomi delle chiavi saranno assegnati in base agli argomenti che fornisci, che, a meno che tu non stia eseguendo più VPN su questo computer, di solito saranno 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 Updated

OpenVPN utilizza parametri generati tramite l'algoritmo di Diffie-Hellman (con l'uso di 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 genererai nuove chiavi RSA, dovrai aggiornare anche il file basato sull'algoritmo di Diffie-Hellman:

# ./build-dh

Le 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/openvpn

Preparazione delle chiavi di crittografia del cliente

Come hai già visto, nella crittografia TLS si utilizzano coppie di chiavi corrispondenti: una è installata sul server e l'altra è sul client remoto. Ciò significa che avrai bisogno delle chiavi del client. Il nostro vecchio amico pkitool è esattamente ciò di cui hai bisogno per questo scopo. In questo esempio, eseguendo il programma nella directory /etc/openvpn/easy-rsa/, gli passiamo l'argomento client per generare i file denominati client.crt e client.key:

# ./pkitool client

I due file del cliente insieme al file originale ca.crt, che si trova ancora nella directory keys/, devono ora essere trasferiti in modo sicuro al tuo cliente. A causa della loro proprietà e dei permessi di accesso, ciò potrebbe non essere così semplice. L'approccio più semplice è copiare manualmente il contenuto del file originale (e nient'altro oltre a questo contenuto) nel terminale che stai utilizzando sul desktop del tuo PC (seleziona il testo, fai clic destro e scegli nel menu l'opzione Copia). Poi, incolla questo in un nuovo file con lo stesso nome che stai creando nel secondo terminale collegato al tuo cliente.

Ma chiunque può copiare e incollare. Invece, pensate come un amministratore, perché non avrai sempre accesso a un'interfaccia grafica, dove è possibile eseguire operazioni di taglia/copiar. Copia i file nella directory home del tuo utente (affinché l'operazione scp remota possa accedervi), e poi utilizza chown per cambiare il proprietario dei file da root a un normale utente senza privilegi di root, in modo da consentire l'operazione scp remota. Assicurati che tutti i tuoi file siano impostati e accessibili in questo momento. Li trasferirai al client 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.crt

Con un set completo di chiavi di crittografia pronte all'uso, è necessario informare il server su come si desidera creare la VPN. Questo si fa utilizzando il file server.conf.

Riduciamo il numero di tasti premuti

Devi scrivere troppo? L'estensione con le parentesi aiuterà a ridurre queste sei comandi a due. Sono sicuro che riuscirai a studiare questi due esempi e capire cosa sta succedendo. Ancora più importante, potrai comprendere come applicare questi principi a operazioni che coinvolgono decine o persino 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

Da dove 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/. Mi baserò sul fatto che il modello è archiviato e ti presenterò uno strumento utile: zcat.

Sai già come visualizzare il contenuto testuale di un file sullo schermo usando il comando cat, ma cosa succede se il file è compresso con gzip? Puoi sempre decomprimere il file, e allora cat lo visualizzerà volentieri, ma questo richiede un passaggio in più. Invece, come avrai già intuito, puoi digitare il comando zcat per caricare il testo decompresso in memoria in un solo passaggio. Nell'esempio successivo, 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/openvpn

Mettiamo da parte la documentazione ampia e utile 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 né eseguire la riga successiva (elenco 10.2).

Libro «Linux in azione»
Esaminiamo alcune di queste impostazioni.

  • Per impostazione predefinita, OpenVPN opera sulla porta 1194. Puoi modificare questo valore, ad esempio per nascondere ulteriormente le tue attività o per evitare conflitti con altri tunnel attivi. Poiché 1194 richiede una coordinazione minima con i client, è meglio fare in questo modo.
  • OpenVPN utilizza per la trasmissione dei dati o il protocollo di controllo della trasmissione (TCP) o il protocollo dei datagrammi utente (UDP). Il TCP può essere un po' più lento, ma è più affidabile e ha maggiori probabilità di essere comprensibile alle applicazioni che operano ai due capi del tunnel.
  • È possibile specificare dev tun quando si desidera creare un tunnel IP più semplice ed efficiente, che trasmette esclusivamente contenuti di dati e nulla più. Se invece è necessario collegare più interfacce di rete (e le reti che esse rappresentano), creando un bridge Ethernet, è necessario scegliere dev tap. Se non si comprende cosa significhi, utilizzare l'argomento tun.
  • Le seguenti quattro righe informano OpenVPN sui nomi di tre file di autenticazione sul server e sul file di parametri dh2048 che hai creato in precedenza.
  • La riga server imposta l'intervallo e la maschera di rete che verranno utilizzati per assegnare indirizzi IP ai client quando si connettono.
  • Il parametro opzionale push "route 10.0.3.0 255.255.255.0" consente ai client remoti di accedere alle reti private dietro il server. Per far funzionare questa operazione è inoltre necessaria una configurazione della rete sul server stesso, affinché la rete privata conosca la rete OpenVPN (10.8.0.0).
  • La riga port-share localhost 80 consente di reindirizzare il traffico dei client che arriva tramite la porta 1194 al server web locale che ascolta sulla porta 80. (Questo sarà utile se intendi coinvolgere un server web per testare la tua VPN.) Funziona solo se viene selezionato il protocollo tcp.
  • Le righe user nobody e group nogroup devono essere attive: per questo è necessario rimuovere i punti e virgola (;). Forzare i client remoti a lavorare come nobody e nogroup garantisce che le sessioni sul server siano prive di privilegi.
  • log indica che i registri correnti sovrascriveranno i vecchi registri ad ogni avvio di OpenVPN, mentre log-append aggiunge nuove registrazioni al file di log esistente. Il file openvpn.log stesso viene registrato nella directory /etc/openvpn/.

Inoltre, nel file di configurazione si aggiunge spesso il valore client-to-client, affinché più client possano vedersi reciprocamente oltre al server OpenVPN. Se sei soddisfatto della tua configurazione, puoi avviare il server OpenVPN:

# systemctl start openvpn

A causa della natura mutevole dei rapporti tra OpenVPN e systemd, per avviare il servizio potrebbe occasionalmente essere necessario utilizzare questa sintassi: systemctl start openvpn@server.

Eseguire ip addr per visualizzare l'elenco delle interfacce di rete del tuo server ora dovrebbe restituire un riferimento al nuovo interfaccia chiamata tun0. OpenVPN lo creerà per gestire i client in arrivo:

$ 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 forever

Potrebbe essere necessario riavviare il server prima che tutto inizi a funzionare correttamente. La prossima tappa è il computer del cliente.

10.1.2. Configurazione del client OpenVPN

Tradizionalmente, i tunnel vengono creati con almeno due uscite (altrimenti li chiameremmo caverne). Un OpenVPN configurato correttamente sul server instrada il traffico nel tunnel e attraverso di esso da un lato. Ma avrai anche bisogno di un software in esecuzione sul lato client, ovvero all'altra estremità del tunnel.

In questa sezione mi concentrerò sulla configurazione manuale di un computer Linux di tipo qualsiasi per funzionare come client OpenVPN. Ma 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, oltre che su smartphone e tablet Android e iOS. Per maggiori dettagli, visitare il sito openvpn.net.

Il pacchetto OpenVPN dovrà essere installato sul computer client, come è stato installato sul server, anche se qui non è necessario easy-rsa, poiché le chiavi che stai utilizzando esistono già. Devi copiare il file modello client.conf nella directory /etc/openvpn/, che è stata appena creata. Questa volta il file non sarà compresso, quindi il comando comune cp sarà perfetto 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 tuo file client.conf saranno abbastanza comprensibili: devono corrispondere ai valori sul server. Come si può vedere dal seguente esempio di file, il parametro unico è 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 far controllare al computer client l'autenticità del certificato del server, per prevenire potenziali attacchi "man-in-the-middle". Un modo per farlo è aggiungere la riga remote-cert-tls server (elenco 10.3).

Libro «Linux in azione»
Ora puoi andare nella directory /etc/openvpn/ ed estrarre le chiavi di certificazione dal server. Sostituisci l'indirizzo IP del server o il nome di dominio nell'esempio con i tuoi valori:

Libro «Linux in azione»
Niente di emozionante accadrà, a meno che tu non avvii OpenVPN sul client. Poiché è necessario passare un paio di argomenti, lo farai dalla riga di comando. L'argomento --tls-client informa OpenVPN che agirai come client e ti collegherai tramite crittografia TLS, mentre --config indica il tuo file di configurazione:

# openvpn --tls-client --config /etc/openvpn/client.conf

Leggi attentamente l'output del comando per assicurarti di essere connesso correttamente. Se qualcosa va storto la prima volta, potrebbe essere dovuto a una discrepanza nelle impostazioni tra i file di configurazione del server e del client o a un problema di connessione di rete/firewall. Ecco alcuni suggerimenti su come risolvere i problemi.

  • Controlla attentamente 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 directory /etc/openvpn/ sul server.
  • Verifica i messaggi relativi a OpenVPN e pertinenti nel tempo nei log di sistema sul server e sul client. (journalctl -ce mostrerà le ultime voci.)
  • Assicurati di avere una connessione di rete attiva tra il server e il client (maggiori dettagli nel capitolo 14).

All'autore

David Clinton — amministratore di sistema, docente e scrittore. Ha amministrato, scritto a riguardo e creato materiale didattico per molte importanti discipline tecniche, inclusi sistemi Linux, cloud computing (in particolare AWS) e tecnologie container, come Docker. Ha scritto il libro Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Molti dei suoi corsi video didattici 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 bootstrap-it.com.

» Maggiori dettagli sul libro sono disponibili su sito dell'editore
» Indice
» Estratto

Per gli utenti di Habr sconto del 25% con il coupon — Linux
Una volta effettuato il pagamento della versione cartacea del libro, riceverai un'email con il libro elettronico.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster