{"id":280,"date":"2017-05-05T17:19:37","date_gmt":"2017-05-05T16:19:37","guid":{"rendered":"http:\/\/eppesuigoccas.homedns.org\/wordpress\/?p=280"},"modified":"2017-05-07T23:22:34","modified_gmt":"2017-05-07T22:22:34","slug":"come-accedere-a-piu-macchine-in-dmz-tramite-un-solo-indirizzo-ip-e-un-forward-proxy","status":"publish","type":"post","link":"https:\/\/blog.sguazz.it\/index.php\/archives\/280","title":{"rendered":"Come accedere a pi\u00f9 macchine in DMZ tramite un solo indirizzo IP e un forward proxy"},"content":{"rendered":"<p>In ufficio abbiamo un domino Internet locale e varie macchine con alcune applicazioni web che operano in maniera federata, vale a dire che quando ci si collega alla prima si viene rimandati ad un&#8217;altra per l&#8217;autenticazione e comincia un rimpallo tra le varie macchine (sempre tramite http redirect, cio\u00e8 tramite il browser sul PC client) finch\u00e9 non si supera sia l&#8217;autenticazione che l&#8217;autorizzazione. Questa modalit\u00e0 di autenticazione \u00e8 chiamata federativa o anche \u00abper attestazioni\u00bb, poich\u00e9 in una applicazione ci si fida di un server di autenticazione, il quale pu\u00f2 essere federato con altri tra i quali \u00e8 stabilita la fiducia. L&#8217;idea \u00e8 che si arrivi ad autenticare l&#8217;utente in maniera automatica, tramite il single sign on, vale a dire che l&#8217;utente viene riconosciuto perch\u00e9 ha gi\u00e0 fatto il login nel suo sistema operativo e non deve rifarlo per ogni applicazione. Il protocollo utilizzato per scambiare informazioni tra i vari siti implicati \u00e8 quello SAML, mentre, per fare un po&#8217; di nomi, le tecnologie coinvolte sono la fedlet di Java, la AD FS di Microsoft e altre meno conosciute.<\/p>\n<p>Facciamo l&#8217;esempio dell&#8217;ufficio con tutte le macchine nel dominio ufficio.local. Avremo quindi dei nomi di macchine fisiche come vm1.ufficio.local o vm2.ufficio.local, e CNAME per le applicazioni, come adfs.ufficio.local e app1.ufficio.local. Le applicazioni sono tutte web, ma utilizzano le porte pi\u00f9 disparate, la 443, 8443, la 9653 ed altre ancora, tutte rigorosamente cifrate tramite SSL con certificati emessi dalla ca.ufficio.local.<\/p>\n<p>Il problema \u00e8: voglio permettere l&#8217;accesso da fuori dell&#8217;ufficio protetto dal firewall, senza utilizzare nessuna VPN che dia accesso a tutta la rete interna o che richieda di configurare il firewall in maniera potenzialmente errata.<\/p>\n<p>La soluzione \u00e8 stata la seguente:<\/p>\n<ul>\n<li>\n<p>configurare il primo firewall per inoltrare tutte le porte delle varie applicazioni web al secondo firewall,<\/p>\n<\/li>\n<li>\n<p>configurare il secondo firewall in modo che inoltri tutte le porte delle varie applicazioni ad una sola porta di una macchina proxy sulla quale \u00e8 configurato pound,<\/p>\n<\/li>\n<li>\n<p>configurare pound perch\u00e9 inoltri le varie richieste alla macchina corretta nella LAN.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.apsis.ch\/pound\/\">pound<\/a> \u00e8 un proxy HTTP, vale a dire che si mette in ascolto su una porta e, tramite protocollo HTTP, riceve le richieste che poi smista in base a regole sulle intestazioni della richiesta HTTP. pound \u00e8 in grado di mettersi in ascolto su una porta SSL e di comunicare con il server effettivo, sempre via SSL.<\/p>\n<p>Perch\u00e9 il certificato SSL di pound sia riconosciuto e accettato dai browser per tutti i nomi delle varie macchine, ci sono alcune strade:<\/p>\n<ul>\n<li>\n<p>la prima \u00e8 avere un certificato per ogni macchina (in questo caso pound usa l&#8217;estensione <a href=\"https:\/\/en.wikipedia.org\/wiki\/Server_Name_Indication\">SNI<\/a> (sigla che sta per Server Name Indication: suggerimento sul nome del server) del protocollo TLS (l&#8217;attuale estensione di SSL) per capire quale servername \u00e8 richiesto dal client),<\/p>\n<\/li>\n<li>\n<p>la seconda \u00e8 avere un certificato che corrisponde a tanti nomi (in questo caso di utilizza l&#8217;estensione subjectAlternativeNames del certificato),<\/p>\n<\/li>\n<li>\n<p>la terza \u00e8 avere un certificato che vale per tutto il dominio.<\/p>\n<\/li>\n<\/ul>\n<p>Utilizzo la seconda possibilit\u00e0 e genero un certificato e una richiesta di firma (CSR: Certificate Sign Request) usando lo strumento keytool di java. Nota: questo strumento non crea automaticamente la CSR con tutti i subjectAlternativeNames, ma li si deve specificare sia per la creazione delle chiavi iniziali, sia per la creazione della CSR.<\/p>\n<p>User\u00f2 pound.ufficio.local che \u00e8 il nome della macchina sulla quale ho messo pound, xi12.ufficio.local che \u00e8 una delle applicazioni, erpln.ufficio.local \u00e8 la seconda applicazione, adfs.ufficio.local \u00e8 la terza.<\/p>\n<pre>keytool -genkeypair -alias pound -keyalg RSA -keysize 2048 \\\r\n-dname \"CN=pound.ufficio.local, OU=demo, O=ufficio, L=Torino, C=IT\" \\\r\n-ext SAN=dns:pound.ufficio.local,dns:xi12.ufficio.local,\\\r\ndns:erpln.ufficio.local,dns:adfs.ufficio.local \\\r\n-validity 3650 -keypass 'password' -keystore pound.pfx \\\r\n-storepass 'password' -storetype PKCS12\r\n\r\nkeytool -certreq -alias pound -file pound.csr \\\r\n-ext SAN=dns:pound.ufficio.local,dns:xi12.ufficio.local,\\\r\ndns:erpln.ufficio.local,dns:adfs.ufficio.local \\\r\n-keypass 'password' -keystore pound.pfx -storepass 'password' \\\r\n-storetype PKCS12<\/pre>\n<p>A questo punto prendo il file pound.csr, lo porto alla mia autorit\u00e0 di certificazione, la quale restituisce il certificato pound.cer.<\/p>\n<p>Poich\u00e9 pound vuole un solo file con la chiave privata e con il certificato, tutto in formato PEM, estraggo la chiave privata da file PFX iniziale e le tolgo la password di protezione, poi creo il file completo per pound:<\/p>\n<pre>openssl pkcs12 -in pound.pfx -nocerts -out pound.pw.key # sempre con password\r\nopenssl rsa -in pound.pw.key -out pound.nopw.key # senza password\r\ncat pound.cer pound.nopw.key &gt; ssl.pem\r\nrm pound.pfx pound.csr pound.cer pound.nopw.key pound.pw.key\r\nsudo mv ssl.pem \/etc\/pound\/ssl.pem\r\nsudo chown root:root \/etc\/pound\/ssl.pem\r\nsudo chmod go-rwx \/etc\/pound\/ssl.pem<\/pre>\n<p>Infine creo il file di configurazione per pound, \/etc\/pound\/pound.cfg:<\/p>\n<pre>ListenHTTPS\r\n  Address 192.168.245.99\r\n  Port 8442\r\n  Cert \"\/etc\/pound\/ssl.pem\"\r\n  LogLevel 5\r\n\r\n  ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:\r\n  xHTTP 1\r\n\r\n  Service\r\n      IgnoreCase 1\r\n      URL \".*\"\r\n      HeadRequire \"Host:.*xi12.ufficio.local:9543.*\"\r\n      BackEnd\r\n        Address xi12.ufficio.local\r\n        Port 9543\r\n        HTTPS\r\n      End\r\n  End\r\n\r\n  Service\r\n      IgnoreCase 1\r\n      URL \"^\/(bundles\/|Scripts\/|infor|api\/|template\/|Content\/|CollaborationUI\/|webresource\/|user\/|IONAPIUI\/).*\"\r\n      HeadRequire \"Host:.*xi12.ufficio.local.*\"\r\n      BackEnd\r\n         Address xi12.ufficio.local\r\n         Port 8443\r\n         HTTPS\r\n      End\r\n  End\r\n\r\n  Service\r\n      IgnoreCase 1\r\n      URL \"^\/lnui\/.*\"\r\n      HeadRequire \"Host:.*erpln.ufficio.local.*\"\r\n      BackEnd\r\n        Address erpln.ufficio.local\r\n        Port 8443\r\n        HTTPS\r\n      End\r\n  End\r\n\r\n  Service\r\n      IgnoreCase 1\r\n      URL \"^\/adfs.*\"\r\n      HeadRequire \"Host:.*adfs.ufficio.local.*\"\r\n      BackEnd\r\n        Address adfs.ufficio.local\r\n        Port 443\r\n        HTTPS\r\n      End\r\n  End\r\nEnd<\/pre>\n<p>Ora si pu\u00f2 avviare pound.<\/p>\n<p>Come punto finale, per potersi collegare dall&#8217;esterno, si deve inserire nel proprio file \/etc\/hosts una riga con l&#8217;ip pubblico dell&#8217;ufficio (quello associato al firewall esterno) e tutti i nomi delle macchine e applicazioni alle quali si deve accedere.<\/p>\n<p>Una volta fatta la prova, si vede che questa configurazione non funziona. Il problema che ho riscontrato \u00e8 che il server adfs.ufficio.local utilizza a sua volta la SNI, ma pound non imposta l&#8217;estensione servername di openssl e quindi la SNI non funziona. A questo punto ho cercato la soluzione sul web e ho trovato che il problema \u00e8 gi\u00e0 stato sollevato da un&#8217;altra persona, alla quale \u00e8 stata fornita una patch non ancora inserita nel codice di pound. La patch per\u00f2 funziona: difatti l&#8217;ho scaricata, poi ho fatto le modifiche suggerite nella pagina in questione, ho ricompilato il pacchetto Debian e l&#8217;ho installato e provato. Funziona. La patch \u00e8 in <a href=\"https:\/\/groups.google.com\/forum\/#!topic\/pound_proxy\/POky0qsDrSM\">questo<\/a> thread.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In ufficio abbiamo un domino Internet locale e varie macchine con alcune applicazioni web che operano in maniera federata, vale a dire che quando ci si collega alla prima si viene rimandati ad un&#8217;altra per l&#8217;autenticazione e comincia un rimpallo tra le varie macchine (sempre tramite http redirect, cio\u00e8 tramite il browser sul PC client) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3,11],"tags":[],"class_list":["post-280","post","type-post","status-publish","format-standard","hentry","category-sysadmin","category-computer","category-debian"],"_links":{"self":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/comments?post=280"}],"version-history":[{"count":4,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":284,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions\/284"}],"wp:attachment":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/tags?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}