Di seguito è spiegato come creare un server OpenVPN e realizzare un’infrastrtuttura in modo che i client OpenVPN possano connettersi alla rete in cui il server è inserito, ed eventualmente il viceversa.
Installazione e configurazione di CentOS 7
Installare il necessario (se si vuole interfacciare a LDAP per l’autenticazione va installato anche il relativo pacchetto che esiste per Fedora 23)
yum -y install net-tools nano epel-release openvpn yum install ftp://bo.mirror.garr.it/1/fedora/linux/releases/23/Everything/x86_64/os/Packages/o/openvpn-auth-ldap-2.0.3-17.fc23.x86_64.rpm
Configrazione delle schede di rete con nmtui (il server potrebbe essere collegato a una sola rete oppure a due reti con 2 schede).
Sostituzione del firewall FirewallD con IPTables
service firewalld stop systemctl disable firewalld yum install -y iptables-services iptables --flush
Installazione di webmin
nano /etc/yum.repos.d/webmin.repo [Webmin] name=Webmin Distribution Neutral #baseurl=http://download.webmin.com/download/yum mirrorlist=http://download.webmin.com/download/yum/mirrorlist enabled=1 rpm --import http://www.webmin.com/jcameron-key.asc
Abilitazione del net forward per i pacchetti (si può fare anche scegliendo Abilita router su Webmin)
nano /etc/sysctl.conf net.ipv4.ip_forward = 1
Configurazione IPTables consentendo la connessione dall’esterno sulle porte 22/TCP, 10000/TCP e 1194/UDP e aggiungendo la regola per il masquerading dei pacchetti da parte della rete dedicata al tunnel
iptables -t nat -A POSTROUTING -s ReteInternaDaGirareInVpn/Maschera -o interfacciaUscitaDiQuellaRete -j MASQUERADE
Creazione della configurazione del server OpenVPN con autenticazione tramite certificati
Installazione del modulo webmin per OpenVPN
Installa modulo da URL http://www.openit.it/index.php?option=com_content&view=section&id=12&Itemid=88
Sostituzione dell’algoritmo per il message digest (con uno non deprecato) in /etc/openvpn/openvpn-ssl.cnf
- default_md = md5 + default_md = sha256
Creazione della Certification Authority nel modulo Webmin
Creazione dei certificati per il server e per il client
Creazione del server OpenVPN (openvpn-server-crt) tramite il modulo webmin
- utilizzando come device tun
- aggiungendo le impostazioni
topology subnet #Per fare in modo che il server fornisca ai client gli indirizzi IP push "route subnetDaRaggiungereDalClient mashceraDellaSubnetDaRaggiungere" #Rotte da aggiungere nel client che instraderanno il traffico verso il tunnel VPN al server OpenVPN
- sostituzione del path dei file di log in /var/log/
- alla fine otterremo un file come il seguente
port 1195 proto udp dev tun ca keys/openvpn-ca/ca.crt cert keys/openvpn-ca/openvpn-server.crt key keys/openvpn-ca/openvpn-server.key dh keys/openvpn-ca/dh2048.pem crl-verify keys/openvpn-ca/crl.pem cipher AES-256-CBC topology subnet #Indirizzo, e conseguente subnet, che si desidera dare a ciò che sarà all'interno del tunnel OpenVPN server 192.168.11.0 255.255.255.0 ifconfig-pool-persist servers/openvpn-server/logs/ipp.txt user nobody group nobody status /var/log/openvpn-server-crt-status.log log-append /var/log/openvpn-server-crt.log verb 2 mute 20 max-clients 10 management 127.0.0.1 8876 keepalive 10 120 client-config-dir /etc/openvpn/servers/openvpn-server/ccd #Se si vuole far connettere solo i client che hannoun file (anche vuoto) nella cartella ccd ccd-exclusive comp-lzo persist-key persist-tun #Rotte da aggiungere nel client per raggiungere le reti in cui il server è inserito push "route 192.168.0.0 255.255.255.0" push "route 192.168.1.0 255.255.255.0" push "route 192.168.10.0 255.255.255.0" #Rete di uno dei client a cui voglio accedere route 192.168.3.0 255.255.255.0 #Direttiva per consentire la connessione tra client OpenVPN connessi al server client-to-client
- l’autenticazione del client è basata su certificato, risulta quindi necessario che ogni client abbia un proprio certificato (in quanto l’indirizzo IP all’interno del tunnel è riservato per certificato e non è possibile effettuare 2 connessioni contemporanee con lo stesso certificato) a meno di aggiungere la seguente direttiva nel file di configurazione
#Allow multiple clients with the same common name to concurrently connect. In the absence of this option, OpenVPN will disconnect a client instance upon connection of a new client having the same common name duplicate-cn
Inserimento all’interno del gateway della rete del server delle rotte necessarie a indirizzare la subnet della VPN (192.168.11.0), e l’eventuale subnet del client (192.168.3.0) all’IP server OpenVPN
Creazione della configurazione del client OpenVPN con autenticazione tramite certificati
Aggiunta al server OpenVPN dei client tramite il modulo Webmin
- otterremo un file di configurazione come il seguente
client proto udp dev tun ca ca.crt dh dh2048.pem cert certName.crt key certName.key remote IpPubblicoDelServer 1195 resolv-retry infinite cipher AES-256-CBC #Cambia porta sorgente ogni volta che si connette nobind user nobody group nobody verb 2 mute 20 keepalive 10 120 comp-lzo persist-key persist-tun float
- se si desidera aggiungere rotte specifiche per il client verso il server possiamo aggiungere nel relativo file CCD
push "route subnetDaRaggiungereDalClient mashceraDellaSubnetDaRaggiungere"
Nel caso in cui sia necesario far raggiungere l’intera rete in cui il client è inserito alla rete del server o solo al server stesso è necessario:
- aggiungere nel relativo file CCD del client la direttiva
iroute subnetDelClient mashceraDellaSubnetDelClient
- aggiungere nel file di configurazione del server la direttiva
#Nel caso si desideri fare in modo che il server (ed eventualmente la rete in cui è inserito, configuarndo le rotte nel default gateway) raggiunga la rete del/dei client route subnetDelClient mashceraDellaSubnetDelClient
Creazione della configurazione del server OpenVPN con autenticazione tramite LDAP
Supponendo di avere già a disposizione una CA e un certificato per il server OpenVPN il file di configurazione (openvpn-server-ldap) per l’autenticazione tramite LDAP sarà il seguente
#Porta diversa dal server con autenticazione tramite certificato in modo da consentire l'esecuzione contemporanea port 1196 proto udp dev tun ca keys/openvpn-ca/ca.crt cert keys/openvpn-ca/openvpn-server.crt key keys/openvpn-ca/openvpn-server.key dh keys/openvpn-ca/dh2048.pem cipher AES-256-CBC topology subnet #Indirizzo, e conseguente subnet, che si desidera dare a ciò che sarà all'interno del tunnel OpenVPN (diversa da quella di altre subnet OpenVPN contemporanee) server 192.168.130.0 255.255.255.0 ifconfig-pool-persist servers/openvpn-server-ldap/logs/ipp.txt user nobody group nobody status /var/log/openvpn-server-ldap-status.log log-append /var/log/openvpn-server-ldap.log verb 2 mute 20 max-clients 10 #Porta di management diversa da quella di altri server OpenVPN in esecuzione management 127.0.0.1 8877 keepalive 10 120 client-config-dir /etc/openvpn/servers/openvpn-server-ldap/ccd comp-lzo persist-key persist-tun #Path del plugin per LDAP e del file di configurazione plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf" #Direttiva per evitare l'autenticazione tramite certificato client-cert-not-required #Utilizzo l'username come CN username-as-common-name #Rotte da aggiungere nel client per raggiungere le reti in cui il server è inserito push "route 192.168.0.0 255.255.255.0" #Rete di uno dei client a cui voglio accedere route 192.168.3.0 255.255.255.0 #Direttiva per consentire la connessione tra client OpenVPN connessi al server client-to-client
Il file di configurazione del plugin /etc/openvpn/auth/ldap.conf sarà il seguente
<LDAP> # LDAP server URL URL ldap://ipServerLDAP # Bind DN (If your LDAP server doesn't support anonymous binds) BindDN cn=userPerQuery,cn=Users,dc=domain,dc=local # Bind Password Password passworduUserPerQuery # Network timeout (in seconds) Timeout 15 # Enable Start TLS TLSEnable no # Follow LDAP Referrals (anonymously) FollowReferrals yes # TLS CA Certificate File TLSCACertFile /usr/local/etc/ssl/ca.pem # TLS CA Certificate Directory TLSCACertDir /etc/ssl/certs # Client Certificate and key # If TLS client authentication is required TLSCertFile /usr/local/etc/ssl/client-cert.pem TLSKeyFile /usr/local/etc/ssl/client-key.pem # Cipher Suite # The defaults are usually fine here # TLSCipherSuite ALL:!ADH:@STRENGTH </LDAP> <Authorization> # Base DN BaseDN "CN=Users,DC=domain,DC=local" # User Search Filter SearchFilter "(&(sAMAccountName=%u)(memberOf=CN=VPN Users,CN=Users,DC=domain,DC=loca))" # Require Group Membership RequireGroup true # Add non-group members to a PF table (disabled) #PFTable ips_vpn_users <Group> BaseDN "CN=Users,DC=domain,DC=local" SearchFilter "(CN=VPN Users)" MemberAttribute "member" # Add group members to a PF table (disabled) #PFTable ips_vpn_eng </Group> </Authorization>
Creazione della configurazione del client OpenVPN con autenticazione tramite LDAP
Il file di configurazione sarà il seguente
client proto udp dev tun #Verrà utilizzato solo il certificato della CA ca ca.crt remote IpPubblicoDelServer 1196 cipher AES-256-CBC verb 2 mute 20 keepalive 10 120 comp-lzo persist-key persist-tun float resolv-retry infinite nobind #Per richeidere il popup con l'autenticazione va aggiunta la direttiva seguente (se si specifica anche a fianco il nome di un file si possono inserire in esso nome utente e password uno sotto l'altro) auth-user-pass
Creazione della configurazione del server OpenVPN con autenticazione tramite Carta Nazionale dei Servizi (CNS) e LDAP
Le modifiche che andranno effettuate al file precedente (autenticazione solo con LDAP) sono le seguenti:
- eliminazione delle direttive
username-as-common-name client-cert-not-required
- inserimento della direttiva seguente, in modo da poter definire nella directory ccd impostata i file per ognuna delle smart card che si desidera si connettano alla VPN
ccd-exclusive
- modifica della direttiva per la ca, creando un file .crt concatenando le certification authority valide per la verifica delle smart card che si utilizzeranno, in questo caso andranno inserite la CA di emissione delle CNS e la CA che ha emesso il certificato utilizzato dal server OpenVPN
ca keys/caCNS.crt
Per la creazione del file caCNS.crt è possibile utilizzare questo script https://gist.github.com/3v1n0/e371f58162795e0635f2 (parse-gov-certs.py)
mkdir /tmp/certs #Scarica nella cartella creata i certificati delle CA per le CNS ./parse-gov-certs.py --output-folder /tmp/certs cd /tmp/certs #Concateno la CA del certificato del server OpenVPN con quelli delle CA delle regioni che mi interessano cat ca keys/openvpn-ca/ca.crt >> /etc/openvpn/keys/caCNS.crt cat Regione_Lombardia* >> /etc/openvpn/keys/caCNS.crt
Nella directory ccd andranno poi creati dei file chiamati con il CN delle smart card CNS che si vorrà far accedere alla VPN, tale CN è reperibile dando il seguente comando sul client avendo inserita la smart card nel lettore
#Per Windows openvpn.exe --show-pkcs11-ids "C:\Windows\System32\opensc-pkcs11.dll" #Per Linux openvpn --show-pkcs11-ids /usr/lib/pkcs11/
Se il CN contiene il carattere / nel nome del file andrà sostituito con il carattere _
Creazione della configurazione del client OpenVPN con autenticazione tramite Carta Nazionale dei Servizi (CNS) e LDAP
Nel sistema operativo client andrà installato il pacchetto OpenSC scaricabile da qui https://github.com/OpenSC/OpenSC/wiki
Il file di configurazione sarà il seguente
client proto udp dev tun #Stesso file utilizzato per il server ca caCNS.crt remote IpPubblicoDelServer 1196 cipher AES-256-CBC verb 2 mute 20 keepalive 10 120 comp-lzo persist-key persist-tun float resolv-retry infinite nobind #DLL relativa al lettore smart card pkcs11-providers C:\\WINDOWS\\system32\\opensc-pkcs11.dll pkcs11-id 'serializedId' pkcs11-pin-cache 300 #Per richeidere il popup con l'autenticazione va aggiunta la direttiva seguente (se si specifica anche a fianco il nome di un file si possono inserire in esso nome utente e password uno sotto l'altro) auth-user-pass
Il serializedId da inserire è reperibile dando il seguente comando sul client avendo inserita la smart card CNS nel lettore
#Per Windows openvpn.exe --show-pkcs11-ids "C:\Windows\System32\opensc-pkcs11.dll" #Per Linux openvpn --show-pkcs11-ids /usr/lib/pkcs11/
Il tunnel VPN non è avviabile utilizzando OpenVPN GUI in quanto non supporta la richiesta del PIN della smart card via GUI, andrà quindi avviato cliccando con il tasto destro sul file .ovpn ed avviando il software dalla relativa opzione. Oppure va installato il software OpenVPN Manager.
Creazione della configurazione del server OpenVPN con autenticazione tramite Google Authenticator e certificati
Questa configurazione permette l’autenticazione utilizzando i certificati nominali in aggiunta agli utenti locali della macchina server (sfruttando PAM) inserendo nome utente e password seguita dal numero restituito dall’app Authenticator dello smartphone. Se poi la macchina stessa è in dominio gli utenti locali saranno quelli di dominio.
Procedura per predisporre Google Authenticator sul server:
- installazione del pacchetto google-autententicator
#Per Centos yum install ftp://fr2.rpmfind.net/linux/fedora/linux/releases/23/Everything/x86_64/os/Packages/g/google-authenticator-1.0-0.gita096a62.fc23.5.x86_64.rpm
- fare il login sulla macchina con l’utente che si desidera abilitare a Google Authenticator
- lanciare il comando google-authenticator e scansionare il QR con l’app installata sullo smartphone (verrà creato un file .google_authenticator nella home dir dell’utente)
Le modifiche che andranno effettuate al file relativo alla configurazione del server con autenticazione tramite certificati sono le seguenti:
- eventuale inserimento della direttiva seguente per dare maggior protezione al canale TLS (il file viene generato con il comando openvpn –genkey –secret openvpn-server-tls.key)
tls-auth keys/openvpn-server-tls.key 0
- inserimento della direttiva seguente per sfruttare il plugin di Google Authenticator
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
Andrà poi creato il file /etc/pam.d/openvpn con il seguente contenuto
auth required pam_google_authenticator.so forward_pass auth required pam_sss.so use_first_pass account required pam_nologin.so account include system-auth password include system-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth -session optional pam_ck_connector.so
Creazione della configurazione del client OpenVPN con autenticazione tramite Google Authenticator e certificati
Il file di configurazione sarà il seguente
client proto udp dev tun ca ca.crt dh dh2048.pem cert certName.crt key certName.key remote IpPubblicoDelServer 1198 tls-auth openvpn-server-tls.key 1 cipher AES-256-CBC verb 2 mute 20 keepalive 10 120 comp-lzo persist-key persist-tun float resolv-retry infinite nobind auth-user-pass
La direttiva tls-auth andrà inserita solo se è stata inserita nella configurazione del server.
Installazione del servizio su Linux
Per impostare l’avvio automatico del tunnel allo start del sistema
systemctl -f enable openvpn@nomeFileConfig.service
dove nomeFileConfig è il nome del file .conf del server OpenVPN presente nella cartella /etc/openvpn
Per avviare il client come programma bisogna posizionarsi nella cartella dove è presente il fiel di configurazione e dare il comando
openvpn --config nomeFileConfig.ovpn
Per avviare il servizio
service openvpn@nomeFileConfig start
Se si desidera togliere la passphrase dalla chiave sul client OpenVPN si può utilizzare il comando
openssl rsa -in client.key -out client.nopass.key
Se si volesse consentire al client di creare più tunnel OpenVPN contemporaneamente (su diversi server e con diversi file di configurazione) vanno installati più adattatori di rete, lo si può fare specificando l’adapter nel file di configurazione, ad esempio dev tun1, dev tun2 ecc… [da verificare il funzionamento]
Installazione del client su Windows
Il client per Windows è quello ufficiale scaricabile da http://www.openvpn.net, di seguito la istruzioni
- installare il client OpenVPN
- creare la cartella C:\Program Files\OpenVPN\config\nomeTunnelOpenVPN
- inserire nella cartella nomeTunnelOpenVPN i file contenuti nell’archivio .tgz scaricato dall’interfaccia di Webmin
- modificare eventualmente il nome dei file .conf e .ovpn in nomeTunnel.conf e nomeTunnel.ovpn (serve per distinguerla poi da altre connessioni successive che si potranno aggiungere)
- avviare il client OpenVPN GUI
- cliccare con il tasto dx sull’icona nella tray (monito grigio con lucchettino) e selezionare connetti
- inserire la password del certificato e attendere
- quando l’icona diventa verde il client è connesso, verrà assegnato l’IP deciso dal server OpenVPN e aggiunta la rotta per accedere alla sua rete
Se si volesse consentire al client di creare più tunnel OpenVPN contemporaneamente (su diversi server e con diversi file di configurazione) vanno installati più adattatori di rete, lo si può fate avviando il file addtap.bat nella cartella C:\Program Files\TAP-Windows\bin\
Installazione client per Mac
Il client per Mac da utilizzare è TunnelBlick https://tunnelblick.net
- installare il client
- decomprimere l’archivio .tgz scaricato dall’interfaccia di Webmin
- entrare nella cartella creata e fare doppio click sul file .ovpn per avviare la connessione
Riconfigurazione macchina virtuale
In caso abbiamo costruito una VM da clonare di volta in volta e inserire in diverse infrastrutture per potersi collegare in VPN i passi da seguire dopo il deploy sarannoi seguenti:
- cambio dell’hostname
- nano /etc/NetworkManager/NetworkManager.conf
- nano /etc/hostname
- nano /etc/sysconfig/network
- hostname nuovoHostname
- verifica hostaname posta
- configurazione OpenVPN
- nano /etc/openvpn/openvpn-server-crt.conf
- nano /etc/openvpn/openvpn-server-ldap.conf
- nano /etc/openvpn/auth/ldap.conf
- eventuale riconfigurazione di agent installati (fusioninventory, zabbix ecc…)