Libro "Linux in azione"

Libro "Linux in azione" Ciao, residenti di Khabro! Nel libro, David Clinton descrive 12 progetti di vita reale, tra cui l'automazione del sistema di backup e ripristino, la creazione di un cloud di file personale in stile Dropbox e la creazione del proprio server MediaWiki. Esplorerai virtualizzazione, ripristino di emergenza, sicurezza, backup, DevOps e risoluzione dei problemi di sistema attraverso interessanti case study. Ogni capitolo termina con una rassegna delle migliori pratiche, un glossario di nuovi termini ed esercizi.

Estratto “10.1. Creazione di un tunnel OpenVPN"

Ho già parlato molto della crittografia in questo libro. SSH e SCP possono proteggere i dati trasferiti tramite connessioni remote (Capitolo 3), la crittografia dei file può proteggere i dati mentre sono archiviati sul server (Capitolo 8) e i certificati TLS/SSL possono proteggere i dati trasferiti tra siti e browser client (Capitolo 9) . Ma a volte i tuoi dati devono essere protetti su una gamma più ampia di connessioni. Ad esempio, è possibile che alcuni membri del tuo team lavorino in viaggio mentre si connettono al Wi-Fi tramite hotspot pubblici. Sicuramente non dovresti dare per scontato che tutti questi punti di accesso siano sicuri, ma i tuoi dipendenti hanno bisogno di un modo per connettersi alle risorse aziendali, ed è qui che una VPN può aiutare.

Un tunnel VPN progettato correttamente fornisce una connessione diretta tra client remoti e il server in modo da nascondere i dati mentre viaggiano su una rete non sicura. E allora? Hai già visto molti strumenti che possono farlo con la crittografia. Il vero valore di una VPN è che aprendo un tunnel è possibile connettere reti remote come se fossero tutte locali. In un certo senso, stai usando un bypass.

Utilizzando questa rete estesa, gli amministratori possono svolgere il proprio lavoro sui propri server da qualsiasi luogo. Ma, cosa ancora più importante, un’azienda con risorse distribuite in più sedi può renderle tutte visibili e accessibili a tutti i gruppi che ne hanno bisogno, ovunque si trovino (Figura 10.1).

Il tunnel stesso non garantisce la sicurezza. Ma nella struttura della rete è possibile includere uno degli standard di crittografia, il che aumenta notevolmente il livello di sicurezza. I tunnel creati utilizzando il pacchetto OpenVPN open source utilizzano la stessa crittografia TLS/SSL di cui hai già letto. OpenVPN non è l'unica opzione di tunneling disponibile, ma è una delle più conosciute. È considerato leggermente più veloce e più sicuro del protocollo tunnel alternativo Layer 2 che utilizza la crittografia IPsec.

Desideri che tutti i membri del tuo team comunichino tra loro in modo sicuro mentre sono in viaggio o lavorano in edifici diversi? Per fare ciò, è necessario creare un server OpenVPN per consentire la condivisione delle applicazioni e l'accesso all'ambiente di rete locale del server. Perché funzioni, tutto ciò che devi fare è eseguire due macchine virtuali o due contenitori: uno che funga da server/host e uno che funga da client. Costruire una VPN non è un processo semplice, quindi probabilmente vale la pena dedicare qualche minuto per avere in mente il quadro generale.

Libro "Linux in azione"

10.1.1. Configurazione del server OpenVPN

Prima di iniziare ti darò qualche consiglio utile. Se hai intenzione di farlo da solo (e ti consiglio vivamente di farlo), probabilmente ti ritroverai a lavorare con più finestre di terminale aperte sul desktop, ciascuna connessa a un computer diverso. C'è il rischio che ad un certo punto inserisci il comando sbagliato nella finestra. Per evitare ciò, puoi utilizzare il comando hostname per modificare il nome della macchina visualizzato sulla riga di comando in qualcosa che ti indichi chiaramente dove ti trovi. Una volta fatto questo, dovrai disconnetterti dal server e accedere nuovamente affinché le nuove impostazioni abbiano effetto. Ecco come appare:

Libro "Linux in azione"
Seguendo questo approccio e dando nomi appropriati a ciascuna delle macchine con cui lavori, puoi facilmente tenere traccia di dove ti trovi.

Dopo aver utilizzato il nome host, potresti riscontrare fastidiosi messaggi Unable to Resolve Host OpenVPN-Server durante l'esecuzione dei comandi successivi. L'aggiornamento del file /etc/hosts con il nuovo nome host appropriato dovrebbe risolvere il problema.

Preparare il server per OpenVPN

Per installare OpenVPN sul tuo server, hai bisogno di due pacchetti: openvpn e easy-rsa (per gestire il processo di generazione della chiave di crittografia). Gli utenti CentOS dovrebbero prima installare il repository epel-release, se necessario, come hai fatto nel capitolo 2. Per poter testare l'accesso all'applicazione server, puoi anche installare il server web Apache (apache2 su Ubuntu e httpd su CentOS).

Durante la configurazione del server, ti consiglio di attivare un firewall che blocchi tutte le porte tranne la 22 (SSH) e la 1194 (la porta predefinita di OpenVPN). Questo esempio illustra come funzionerebbe ufw su Ubuntu, ma sono sicuro che ricordi ancora il programma firewalld CentOS del capitolo 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Per abilitare il routing interno tra le interfacce di rete sul server, è necessario rimuovere il commento da una riga (net.ipv4.ip_forward = 1) nel file /etc/sysctl.conf. Ciò consentirà ai client remoti di essere reindirizzati secondo necessità una volta connessi. Per far funzionare la nuova opzione, esegui sysctl -p:

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

Il tuo ambiente server è ora completamente configurato, ma c'è ancora un'altra cosa da fare prima di essere pronto: dovrai completare i seguenti passaggi (ne parleremo in dettaglio in seguito).

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

Generazione di chiavi di crittografia

Per semplificare le cose, puoi configurare la tua infrastruttura chiave sulla stessa macchina su cui è in esecuzione il server OpenVPN. Tuttavia, le migliori pratiche di sicurezza suggeriscono in genere di utilizzare un server CA separato per le distribuzioni di produzione. Il processo di generazione e distribuzione delle risorse chiave di crittografia da utilizzare in OpenVPN è illustrato in Fig. 10.2.

Libro "Linux in azione"
Quando hai installato OpenVPN, la directory /etc/openvpn/ è stata creata automaticamente, ma non contiene ancora nulla. I pacchetti openvpn e easy-rsa vengono forniti con file modello di esempio che puoi utilizzare come base per la tua configurazione. Per avviare il processo di certificazione, copiare la directory del modello easy-rsa da /usr/share/ a /etc/openvpn e passare alla directory easy-rsa/:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

La directory easy-rsa ora conterrà alcuni script. Nella tabella 10.1 elenca gli strumenti che utilizzerai per creare le chiavi.

Libro "Linux in azione"

Le operazioni di cui sopra richiedono i privilegi di root, quindi è necessario diventare root tramite sudo su.

Il primo file con cui lavorerai si chiama vars e contiene le variabili di ambiente che easy-rsa utilizza durante la generazione delle chiavi. È necessario modificare il file per utilizzare i propri valori invece dei valori predefiniti già presenti. Questo è l'aspetto del mio file (Listato 10.1).

Listato 10.1. Frammenti 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="[email protected]"
export KEY_OU="IT"

L'esecuzione del file vars trasmetterà i suoi valori all'ambiente shell, dove verranno inclusi nel contenuto delle nuove chiavi. Perché il comando sudo da solo non funziona? Perché nel primo passaggio modifichiamo lo script denominato vars e poi lo applichiamo. Applicare e significa che il file vars passa i suoi valori all'ambiente shell, dove verranno inclusi nel contenuto delle nuove chiavi.

Assicurati di rieseguire il file utilizzando una nuova shell per completare il processo incompleto. Al termine, lo script ti chiederà di eseguire un altro script, clean-all, per rimuovere qualsiasi contenuto nella directory /etc/openvpn/easy-rsa/keys/:

Libro "Linux in azione"
Naturalmente, il passo successivo è 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 identità fornite da vars:

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

Poi arriva lo script build-key-server. Poiché utilizza lo stesso script pkitool insieme a un nuovo certificato root, vedrai le stesse domande per confermare la creazione della coppia di chiavi. Le chiavi verranno denominate in base agli argomenti passati che, a meno che non si stiano eseguendo più VPN su questa macchina, 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 dall'algoritmo Diffie-Hellman (utilizzando build-dh) per negoziare l'autenticazione per le nuove connessioni. Non è necessario che il file creato qui sia segreto, ma deve essere generato utilizzando lo script build-dh per le chiavi RSA attualmente attive. Se creerai nuove chiavi RSA in futuro, dovrai aggiornare anche il file Diffie-Hellman:

# ./build-dh

Le chiavi lato server ora finiranno 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 client

Come hai già visto, la crittografia TLS utilizza coppie di chiavi corrispondenti: una installata sul server e una installata sul client remoto. Ciò significa che avrai bisogno delle chiavi client. Il nostro vecchio amico pkitool è esattamente ciò di cui hai bisogno per questo. In questo esempio, quando eseguiamo il programma nella directory /etc/openvpn/easy-rsa/, gli passiamo un argomento client per generare file chiamati client.crt e client.key:

# ./pkitool client

I due file client, insieme al file ca.crt originale che si trova ancora nella directory keys/, dovrebbero ora essere trasferiti in modo sicuro al client. A causa della loro proprietà e dei diritti di accesso, questo potrebbe non essere così semplice. L'approccio più semplice è copiare manualmente il contenuto del file sorgente (e nient'altro che quel contenuto) in un terminale in esecuzione sul desktop del tuo PC (seleziona il testo, fai clic con il pulsante destro del mouse su di esso e seleziona Copia dal menu). Quindi incollalo in un nuovo file con lo stesso nome che crei in un secondo terminale connesso al tuo client.

Ma chiunque può tagliare e incollare. Pensa invece come un amministratore perché non avrai sempre accesso alla GUI dove sono possibili le operazioni taglia/incolla. Copia i file nella directory home del tuo utente (in modo che l'operazione scp remota possa accedervi), quindi usa chown per modificare la proprietà dei file da root a un utente normale non root in modo che l'azione scp remota possa essere eseguita. Assicurati che tutti i tuoi file siano attualmente installati e accessibili. Li sposterai sul client poco dopo:

# 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 per l’uso, devi dire al server come desideri creare la VPN. Questo viene fatto utilizzando il file server.conf.

Ridurre il numero di sequenze di tasti

C'è troppa digitazione? L'espansione con parentesi aiuterà a ridurre questi sei comandi a due. Sono sicuro che puoi studiare questi due esempi e capire cosa sta succedendo. Ancora più importante, sarai in grado di capire come applicare questi principi alle 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 di directory easy-rsa che hai copiato da /usr/share/? Quando hai installato OpenVPN, ti è rimasto un file modello di configurazione compresso che puoi copiare in /etc/openvpn/. Partirò dal fatto che il modello è archiviato e ti presenterò uno strumento utile: zcat.

Sai già come stampare il contenuto testuale di un file sullo schermo usando il comando cat, ma cosa succede se il file viene compresso usando gzip? Puoi sempre decomprimere il file e poi cat lo emetterà felicemente, ma sono uno o due passaggi in più del necessario. Invece, come avrai intuito, puoi eseguire 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 a 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 estesa e utile fornita con il file e vediamo come potrebbe apparire una volta terminata la modifica. Da notare che il punto e virgola (;) indica a OpenVPN di non leggere o eseguire la riga successiva (Listato 10.2).

Libro "Linux in azione"
Esaminiamo alcune di queste impostazioni.

  • Per impostazione predefinita, OpenVPN funziona sulla porta 1194. Puoi modificarla, ad esempio, per nascondere ulteriormente le tue attività o evitare conflitti con altri tunnel attivi. Poiché 1194 richiede un coordinamento minimo con i clienti, è meglio farlo in questo modo.
  • OpenVPN utilizza il protocollo TCP (Transmission Control Protocol) o il protocollo UDP (User Datagram Protocol) per trasmettere i dati. TCP può essere un po' più lento, ma è più affidabile e ha maggiori probabilità di essere compreso dalle applicazioni in esecuzione su entrambe le estremità del tunnel.
  • Puoi specificare dev tun quando desideri creare un tunnel IP più semplice ed efficiente che trasporti il ​​contenuto dei dati e nient'altro. Se invece hai bisogno di connettere più interfacce di rete (e le reti che rappresentano), creando un bridge Ethernet, dovrai scegliere dev tap. Se non capisci cosa significa tutto questo, usa l'argomento tun.
  • Le quattro righe successive forniscono a OpenVPN i nomi dei tre file di autenticazione sul server e del file delle opzioni dh2048 creato in precedenza.
  • La riga del server imposta l'intervallo e la maschera di sottorete che verranno utilizzati per assegnare gli indirizzi IP ai client al momento dell'accesso.
  • Il parametro push opzionale "route 10.0.3.0 255.255.255.0" consente ai client remoti di accedere alle sottoreti private dietro il server. Per far funzionare tutto questo è necessario anche configurare la rete sul server stesso in modo che la sottorete privata sia a conoscenza della sottorete OpenVPN (10.8.0.0).
  • La linea localhost 80 di condivisione porta ti consente di reindirizzare il traffico client in arrivo sulla porta 1194 a un server Web locale in ascolto sulla porta 80. (Questo sarà utile se utilizzerai il server Web per testare la tua VPN.) Funziona solo quindi quando viene selezionato il protocollo TCP.
  • Le linee utente nessuno e gruppo nogruppo devono essere abilitate rimuovendo il punto e virgola (;). Forzare l'esecuzione dei client remoti come nessuno e nessun gruppo garantisce che le sessioni sul server non siano privilegiate.
  • log specifica che le voci di registro correnti sovrascriveranno le vecchie voci ogni volta che viene avviato OpenVPN, mentre log-append aggiunge le nuove voci al file di registro esistente. Il file openvpn.log stesso viene scritto nella directory /etc/openvpn/.

Inoltre, al file di configurazione viene spesso aggiunto anche un 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 openvpn

A causa della natura mutevole della relazione tra OpenVPN e systemd, a volte potrebbe essere necessaria la seguente sintassi per avviare un servizio: systemctl start openvpn@server.

L'esecuzione di ip addr per elencare le interfacce di rete del tuo server dovrebbe ora restituire un collegamento a una nuova interfaccia chiamata tun0. OpenVPN lo creerà per servire i clienti 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 forever

Potrebbe essere necessario riavviare il server prima che tutto inizi a funzionare correttamente. La fermata successiva è il computer client.

10.1.2. Configurazione del client OpenVPN

Tradizionalmente le gallerie vengono costruite con almeno due uscite (altrimenti le chiameremmo grotte). Un OpenVPN configurato correttamente sul server dirige il traffico dentro e fuori dal tunnel su un lato. Ma avrai bisogno anche di software in esecuzione sul lato client, cioè dall'altra parte del tunnel.

In questa sezione, mi concentrerò sulla configurazione manuale di un tipo di computer Linux affinché funga da client OpenVPN. Ma questo non è l’unico modo in cui questa opportunità è disponibile. OpenVPN supporta applicazioni client che possono essere installate e utilizzate su desktop e laptop con Windows o macOS, nonché su smartphone e tablet Android e iOS. Vedi openvpn.net per i dettagli.

Il pacchetto OpenVPN dovrà essere installato sul computer client così come è stato installato sul server, anche se in questo caso non è necessario easy-rsa poiché le chiavi che stai utilizzando esistono già. Devi copiare il file modello client.conf nella directory /etc/openvpn/ che hai appena creato. Questa volta il file non verrà compresso, quindi il normale comando cp farà perfettamente il lavoro:

# 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 autoesplicative: dovrebbero corrispondere ai valori sul server. Come puoi vedere dal seguente file di esempio, il parametro univoco è remote 192.168.1.23 1194, che comunica al client l'indirizzo IP del server. Ancora una volta, assicurati che questo sia l'indirizzo del tuo server. Dovresti anche forzare il computer client a verificare l'autenticità del certificato del server per prevenire un possibile attacco man-in-the-middle. Un modo per farlo è aggiungere la riga remote-cert-tls server (Listato 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"
Probabilmente non accadrà nulla di interessante finché non eseguirai OpenVPN sul client. Dato che 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 e --config punta al 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 mancata corrispondenza nelle impostazioni tra i 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 attentamente l'output dell'operazione OpenVPN sul client. Spesso contiene preziosi consigli su cosa non si può fare esattamente e perché.
  • Controlla i messaggi di errore nei file openvpn.log e openvpn-status.log nella directory /etc/openvpn/ sul server.
  • Controlla i registri di sistema sul server e sul client per i messaggi relativi a OpenVPN e a tempo. (journalctl -ce visualizzerà le voci più recenti.)
  • Assicuratevi di avere una connessione di rete attiva tra il server e il client (maggiori informazioni nel Capitolo 14).

Chi l'Autore

David Clinton - amministratore di sistema, docente e scrittore. Ha amministrato, scritto e creato materiali didattici per molte importanti discipline tecniche, tra cui sistemi Linux, cloud computing (in particolare AWS) e tecnologie container come Docker. Ha scritto il libro Impara Amazon Web Services in un mese di pranzi (Manning, 2017). Molti dei suoi corsi di formazione video possono essere trovati su Pluralsight.com e i collegamenti ad altri suoi libri (sull'amministrazione Linux e sulla virtualizzazione dei server) sono disponibili su bootstrap-it.com.

» Per ulteriori informazioni sul libro, visitare il sito sito web dell'editore
» Sommario
» Estratto

Per Khabrozhiteli sconto del 25% sul coupon - Linux
Dopo il pagamento della versione cartacea del libro, viene inviato un e-book all'indirizzo di posta elettronica.

Fonte: habr.com

Aggiungi un commento