OpenVPN lan2client / lan2lan

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:

  1. cambio dell’hostname
    • nano /etc/NetworkManager/NetworkManager.conf
    • nano /etc/hostname
    • nano /etc/sysconfig/network
    • hostname nuovoHostname
    • verifica hostaname posta
  2. configurazione OpenVPN
    • nano /etc/openvpn/openvpn-server-crt.conf
    • nano /etc/openvpn/openvpn-server-ldap.conf
    • nano /etc/openvpn/auth/ldap.conf
  3. eventuale riconfigurazione di agent installati (fusioninventory, zabbix ecc…)
Aggiungi ai preferiti : permalink.

I commenti sono chiusi.