{"id":1440,"date":"2023-02-15T13:02:57","date_gmt":"2023-02-15T12:02:57","guid":{"rendered":"https:\/\/www.mc-data.it\/?p=1440"},"modified":"2023-04-12T15:14:37","modified_gmt":"2023-04-12T13:14:37","slug":"openvpn-google-authenticator-pam","status":"publish","type":"post","link":"https:\/\/www.mc-data.it\/?p=1440","title":{"rendered":"OpenVPN + Google Authenticator + PAM"},"content":{"rendered":"\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"1000\" data-attachment-id=\"1442\" data-permalink=\"https:\/\/www.mc-data.it\/?attachment_id=1442\" data-orig-file=\"https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1.jpg\" data-orig-size=\"1000,1000\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"original-1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1-300x300.jpg\" data-large-file=\"https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1.jpg\" src=\"https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1.jpg\" alt=\"\" class=\"wp-image-1442 size-full\" srcset=\"https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1.jpg 1000w, https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1-300x300.jpg 300w, https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1-150x150.jpg 150w, https:\/\/www.mc-data.it\/wp-content\/uploads\/2023\/02\/original-1-768x768.jpg 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p>Breve guida per rinforzare la sicurezza della Vostra Rete Informatica Virtuale (VPN) utilizzando Software Open Source, gratuito e modificabile a piacimento.<\/p>\n\n\n\n<p>Ambiente Server: Linux Ubuntu Server 22.04; OpenVPN 2.5.5; OpenSSL 3.0.2. <\/p>\n\n\n\n<p>Ambiente Client: Windows 10; OpenVPN GUI 11.15.0.0<\/p>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Accessi Remoti all&#8217;epoca dello Smart Working<\/h3>\n\n\n\n<p>Il lavoro da remoto e il c.d. smart working, sono stati i protagonisti degli ultimi 3 anni.<\/p>\n\n\n\n<p>Quasi chiunque, attivit\u00e0 lvorativa permettendo, ha provato l&#8217;ebrezza di svolgere sessioni di lavoro recluso all&#8217;interno delle mura domestiche.<\/p>\n\n\n\n<p>Purtroppo questo, spesso, ha comportato l&#8217;uso di strumenti poco ortodossi per accedere alle risorse digitali archiviate all&#8217;interno dei Server aziendali.<\/p>\n\n\n\n<p>Nel migliore dei casi l&#8217;Utente, provvisto di chiavetta USB, ha copiato i file di propria pertinenza per lavorarci da Casa.<\/p>\n\n\n\n<p>In altre occasioni, la sovrabbondanza di Software di controllo remoto (a base VNC e similari, che non cito per copyright), ha fatto tenere accesi computer per settimane in attesa del collegamento da remoto. Collegamento che, nella maggior parte dei casi, avveniva tramite computer Portatili con schermi cos\u00ec piccoli da consumarsi la vista a leggere cosa ci fosse scritto sul computer remoto. Tranne poi ricevere un messaggio derrore e la disconnessione perch\u00e8 &#8220;si sta facendo un uso professionale del Software&#8221;. E credo che questo l&#8217;abbiamo provato tutti.<\/p>\n\n\n\n<p>La VPN (Virtual Private Network), nella sua accezione tradizionale, \u00e8 un&#8217;ottima alternativa. Consente di accedere alla rete LAN Aziendale (Interna) da qualsiasi parte del mondo, purch\u00e8 connessa alla rete Internet.<\/p>\n\n\n\n<p>Questo, naturalmente, solleva questioni di sicurezza. Prima fra tutte: Ma se si &#8220;apre&#8221; un accesso da tutto il mondo, non capita poi che tutto il mondo possa accedervi?<br>Questo \u00e8 il problema: una porta affacciata al mondo esterno deve avere una chiave sicura per poter essere aperta. La semplice combinazione &#8220;username + password&#8221; , in questo caso, non possono essere considerate una chiave sicura. Soprattutto oggi che, con sistemi che utilizzano la AI (o IA, Intelligenza Artificiale) gli attacchi di &#8216;Brute Force&#8217; sono diventati pi\u00f9 aggressivi.<\/p>\n\n\n\n<p>Perci\u00f2 stanno prendendo sempre pi\u00f9 piede i MFA (Multi Factor Authentication) o fattori multipli di autenticazione. Ossia Username + Password + qualcos&#8217;altro che so solo io. Per la precisione gli MFA si compingono, per definizione, di qualcosa che sai = Username + Password assieme a qualcosa che hai = un oggetto posseduto da chi \u00e8 titolato ad accedere. Something You Know + Something You Have.<\/p>\n\n\n\n<p>Tornando alle VPN, fino ad oggi, il massimo cui si pteva ambire era una combinazione tra Username + Password + Certificato rilasciato dal Server che autentica la connessione. Il sistema rispetta di fatto il Principio di SYK + SYH, ma, in caso di furto del computer portatile, (perch\u00e8 quasi tutti installano le VPN sui PC portatili, e questi sono frequente oggetto di furto), il ladro si trova ad avere entrambi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Google Authenticator<\/h3>\n\n\n\n<p>Google Authenticator viene incontro a queste esigenze di sicurezza offrendo chiavi e toppe a prova di &#8220;scassinatore&#8221;.<br>In questo caso Google Authenticator diventa &#8220;Something You Have Elsewhere&#8221; ovvero qualcosa che si ha, ma da un&#8217;altra parte, tipicamente sul telefonino.<br>Si tratta, in sostanza di una APP di google che, tramite un codice, si collega ad un sistema di autenticazione e ogni 30 secondi rilascia una OTP (One Time Password), sincronizzata con il Server.<\/p>\n\n\n\n<p>Questa \u00e8 un&#8217;aggiunta preziosa per rendere inviolabile la propria porta d&#8217;accesso alla Rete Aziendale.<\/p>\n\n\n\n<p>Ovviamente questo non significa che la Rete Aziendale sia del tutto inviolabile; i mostri sacri dell&#8217;Informatica insegnano che qualsiasi sistema esposto alla Rete \u00e8 potenzialmente violabile, ma passando da porte sul retro, o finestre, perch\u00e8 il portone principale \u00e8 blindato. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Configurazioni lato Server<\/h4>\n\n\n\n<p>Iniziamo a vedere le configurazioni minime indispensabili lato Server.<\/p>\n\n\n\n<p>come da premessa per la costruzione del Server ci siamo avvalsi di Ubuntu Server 22.04 in versione &#8220;minimal&#8221; per minimizzare le risorse HW sfruttate.<\/p>\n\n\n\n<p>Al termine dell&#8217;installazione, accedendo da remoto tramite ssh con un qualsiasi client ssh (Per la cronaca Windows, nelle versioni pi\u00f9 recenti, ha incluso &#8216;ssh&#8217; tra i suoi strumenti da riga di comando. Le opzioni sono le stesse di Linux), eseguire le seguenti operazioni<\/p>\n\n\n\n<p>Omettiamo volutamente il &#8216;sudo&#8217; ma questo \u00e8 da aggiungere se le operazioni vengono lanciate da utente non &#8216;root&#8217;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt upgrade\napt update\napt install easy-rsa\napt install openvpn\napt install libpam-google-authenticator\napt install libqrencode3\napt install build-essential<\/code><\/pre>\n\n\n\n<p>Tutto ci\u00f2 per avere tutti i software necessari installati.<\/p>\n\n\n\n<p>Per le informazioni su come configurare, avviare e mettere in avvio automatico il Server OpenVPN rimando alle tonnellate di Tutorial presenti in Rete, anche se suggerisco sempre di prendere ad esempio quanto indicato sul Sito ufficiale di OpenVPN, tenendo conto che ci si riferisce alla verione &#8220;Community Edition&#8221;.<\/p>\n\n\n\n<p>Personalmente preferiamo creare una cartella sotto \/etc\/openvpn all&#8217;interno della quale mettere certificati Server creati da easy-rsa, la cartella easy-rsa stessa e la configurazione server (server.conf)<\/p>\n\n\n\n<p>Ad uso promemoria ricordiamo che Ubuntu Server, come CentOS e altri, ormai utilizzano &#8216;systemctl&#8217; per avviare, riavviare, stoppare, abilitare e disabilitare servizi, e che, nel caso di &#8216;openvpn&#8217; il comando \u00e8:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl &#91;start] &#91;restart] &#91;stop] &#91;enable] &#91;disable] openvpn-server@server &#91;o il nome che \u00e8 stato dato al file di configurazione *.conf]<\/code><\/pre>\n\n\n\n<p>Una volta avviata la VPN, andare a modificare il file &#8216;server.conf aggiungendo le seguenti righe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># enable multi-factor authentication with google authenticator\n\nreneg-sec 0\nplugin \/usr\/lib\/openvpn\/openvpn-plugin-auth-pam.so \"openvpn login USERNAME password PASSWORD 'verification code' OTP\"\nverify-client-cert none\nusername-as-common-name<\/code><\/pre>\n\n\n\n<p>*Da notare che per evitare equivoci abbiamo inserito il path assoluto di &#8216;openvpn-plugin-auth-pam.so&#8217;<\/p>\n\n\n\n<p>Questo significa che stiamo imponendo a OpenVPN di richiamare il modulo PAM. a questo punto, quindi, bisogner\u00e0 dire a PAM di utilizzare il modulo Google Authenticator.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/pam.d\/openvpn &lt;&lt; EOM\nauth    optional   pam_faildelay.so  delay=3000000\nauth    &#91;success=1 default=ignore]      pam_unix.so nullok_secure\nauth    requisite                       pam_deny.so\nauth    required                        pam_permit.so\nauth    required pam_google_authenticator.so nullok\nEOM<\/code><\/pre>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<p>Cos\u00ec abbiamo generato un file &#8216;openvpn&#8217; all&#8217;interno di \/etc\/pam.d\/ con tutte le info necessarie ad avviare Google Authenticator.<\/p>\n\n\n\n<p>In base a come vengono generati i codici di Google Authenticator potrebbe essere necessario aggiungere alcune informazioni al file \/etc\/pam.d\/openvpn; ad esempio nell&#8217;ultima riga:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auth    required \/usr\/lib\/x86_64-linux-gnu\/security\/pam_google_authenticator.so secret=\/home\/${USER}\/.google_authenticator user=root nullok<\/code><\/pre>\n\n\n\n<p>Dove abbiamo ribadito il path assoluto del modulo google_authenticator ed abbiamo insegnato dove andare a trovare la corrispondente chiave di google, ossia all&#8217;interno della home dell&#8217;utente.<br>L&#8217;opzione nullok alla fine della riga significa che se ancora non \u00e8 stato creato un qrcode per l&#8217;utente, questo accede ugualmente. <br>Per motivi di sicurezza, alla fine della preparazione degli utenti, sarebbe opportuno rimuoverla.<\/p>\n\n\n\n<p>Quello che manca, a questo punto, \u00e8<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creare Utente di sistema con Password<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>useradd utente<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creare e firmare il Certificato corrispondente per l&#8217;utente creato<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/easyrsa gen-req utente nopass\n.\/easyrsa sign-req client utente<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Scaricare sul telefonino l&#8217;app Google Authenticator da &#8216;google play&#8217; o &#8216;apple store&#8217;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generare il codice di Google Authenticator dell&#8217;utente creato<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>su - utente\ngoogle-authenticator<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inquadrare il qrcode generato da google authenticator; si creer\u00e0 un OTP riservato al Server OpenVPN<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creare il flie Client di OpenVPN, tipicamente, per Windows &#8216;utente.ovpn&#8217; con le varie opzioni, che non \u00e8 questo il luogo per trattare, ma rimandiamo al solito forum della Community di OpenVPN. In aggiunta ad esse le seguenti righe:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>reneg-sec 0\nauth-user-pass\nstatic-challenge \"Codice Google Authenticator\" 1<\/code><\/pre>\n\n\n\n<p>Cos\u00ec, avviando la VPN verranno richiesti:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Nome Utente\nPassword\n\nCodice Google Authenticator\nRisposta:<\/code><\/pre>\n\n\n\n<p>Se tutto \u00e8 stato correttamente configurato il Server accetter\u00e0 la chiamata.<\/p>\n\n\n\n<p>Una ultima considerazione \u00e8 d&#8217;obbligo:<br>Perch\u00e8 tutto funzioni correttamente l&#8217;ora del Server DEVE essere esatta, quindi consigliamo di sincronizzarla con qualche Server NTP.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Supplemento 1.<\/p>\n\n\n\n<p>Nel caso in cui la VPN si aprisse anche con codici google sbagliati, o addirittura senza immettere alcun codice &#8230; niente panico semplicemente il modulo &#8216;pam_google_authenticator.so&#8217; \u00e8 in grado di leggere il file &#8216;.google_authenticator&#8217; generato al momento della creazione dei codici da parte dell&#8217;utente. Sar\u00e0 necessario copiare tale codice in una cartella leggibile. Ad esempio noi abbiamo copiato i codici google in una cartella denominata: \/var\/unencrypted-home\/ all&#8217;interno della quale ogni utente ha la propria cartella sotto cui copiamo i rispettivi file .google_authenticator.<br>A questo punto  \/etc\/pam.d\/openvpn dovr\u00e0 diventare:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auth    optional   pam_faildelay.so  delay=3000000\nauth    &#91;success=1 default=ignore]      pam_unix.so nullok_secure\nauth    requisite                       pam_deny.so\nauth    required                        pam_permit.so\nauth    required   pam_google_authenticator.so secret=\/var\/unencrypted-home\/${USER}\/.google_authenticator user=root nullok<\/code><\/pre>\n\n\n\n<p>L&#8217;aggiunta merita una breve spiegazione: &#8220;secret=&#8221; indica a pam_google_authentiator dove andare a cercare il file di autenticazione &#8216;${USER}&#8217; per ciascun user il proprio codice; &#8216;user=root&#8217; \u00e8 l&#8217;utente con cui andiamo a leggere il contenuto del file; infine &#8216;nullok&#8217; indica al &#8216;pam_google_authenticator.so&#8217; di verificare la presenza del file .google_authenticator all&#8217;interno dalla cartella dell&#8217;utente. Nel caso non esistesse, di accettare ugualmente l&#8217;autenticazione senza il doppio fattore. Quest&#8217;ultimo punto, in particoalre, \u00e8 importante per aggiungere il doppio fattore a VPN gi\u00e0 implementata, a caldo, diciamo, concede il tempo di completare i lavori. Tuttavia, a fine lavori, per maggior sicurezza, sarebbe bene toglierlo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p class=\"qua-blog-post-description\">Breve guida per rinforzare la sicurezza della Vostra Rete Informatica Virtuale (VPN) utilizzando Software Open Source, gratuito e modificabile a piacimento. Ambiente Server: Linux Ubuntu Server 22.04; OpenVPN 2.5.5; OpenSSL 3.0.2. Ambiente Client: Windows 10; OpenVPN GUI 11.15.0.0 Accessi Remoti all&#8217;epoca dello Smart Working Il lavoro da remoto e il c.d. smart working, sono stati [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"jetpack_post_was_ever_published":true,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[29,3,1],"tags":[18],"class_list":["post-1440","post","type-post","status-publish","format-standard","hentry","category-may-i-help-you","category-news","category-tutorial","tag-covid-19"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9p8lv-ne","jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/posts\/1440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1440"}],"version-history":[{"count":5,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/posts\/1440\/revisions"}],"predecessor-version":[{"id":1455,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=\/wp\/v2\/posts\/1440\/revisions\/1455"}],"wp:attachment":[{"href":"https:\/\/www.mc-data.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mc-data.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}