30.4.2018
Čas od času potřebuju zveřejnit na webu nějaké informace z intranetové sítě. Důležité je pro mě zabezpečení, samozřejmostí je pro mě proto využití šifrovaného protokolu HTTPS s certifikáty od Let's Encrypt. Často využívám také serveru, na kterém je umístěný náš web https://www.hobrasoft.cz (umístěný v Praze), pro zprostředkování přístupu do naší interní kancelářské sítě. Případný zájemce o informace komunikuje pouze s pražským serverem, o interní kancelářské síti nemá ani ponětí. Přímo s kanceláří komunikuje pouze revezní proxy server v Praze.
V mnoha případech mám tento mechanismus využitý i u zákazníků. Zde bývá nejčastějším požadavkem zabezpečený přístup do interního informačního systému.
U nás ve firmě máme většinu dat na internetu, reverzní proxy proto využíváme i z jiných důvodů. Například pro přednášku o BeagleBone jsme připravili malinké městečko řízené počítačem BeagleBone. Protože je tento počítač pomalý, použití https by mohlo vrhnout nehezké světlo na jinak přiměřeně rychlou technologii. Proto https zajišťuje pražský http server, BeagleBone komunikuje bez šifrování. Přenos mezi revezní proxy a počítačem BeagleBone je zabezpečený pomocí IPSEC (nastavený na pražském serveru a routeru v kanceláři), komunikace je čistě na IPv6. IPv6 je u nás v kanceláři silně preferovaný protokol a na BeagleBone nemáme žádný důvod nastavovat IPv4. Reverzní proxy tak kromě zprostředkování přístupu do vnitřní sítě poskytuje i výpočetní sílu pro SSL a bezproblémový přechod ze světa IPv6 do IPv4.
Přes reverzní proxy je vyřešený i výpis barometrického tlaku ( Pa) v článku Připojení tlakového sensoru k Beaglebone Black. Zde je pomocí reverzní proxy zveřejněná pouze URL adresa https://www.hobrasoft.cz/meteo. Vše ostatní zůstává běžnému návštěvníkovi našeho webu skryto.
Chceme zpřístupnit pod jménem weblight-demo.hobrasoft.cz zařízení v kanceláři tak, aby bylo přístupné protokolem HTTPS (šifrovaně na portu 443) jak na IPv6, tak IPv4. Přístup přes HTTP by neměl být možný, pokus o přístup přes HTTP by měl být automaticky přesměrovaný na HTTPS.
Požadavky bude vyřizovat server na adrese 178.238.42.9 nebo 2a01:430:59:1:3::1.
Samotné zařízení, které má být zpřístupněno, běží na adrese 2001:DB8::11. Z internetu není běžně dostupné, firewall umožňuje přístup pouze z adresy 2a01:430:59:1:3::1.
Certifikáty se vystavují automaticky přes Let's Encrypt utilitou acme.sh.
V různých distribucích (Debian, Gentoo) se umístění konfiguračních souborů liší. Lišit se může i formát v závislosti na různých verzích Apache – zde je použitá syntax Apache verze 2.4. U verze 2.2 a starší se může lišit především nastavení domácího adresáře (direktiva Directory).
Nastavení se týká pouze jednoho virtuálního hosta. Veškerá konfigurace webového serveru a ostatních virtuálních webů může být řádově složitější.
# # Důležitý je přístup přes HTTP (bez šifrování). Důvody jsou dva: # přesměrování na https pro běžné požadavky # vystavení certifikátů Let's Encrypt # <VirtualHost *:80> ServerName weblight-demo.hobrasoft.cz # # Redirect dovolí přes HTTP vyřídit pouze požadavky do adresáře /.well-known # Vše ostatní je přesměrované na HTTPS verzi # RedirectMatch permanent ^/(?!(\.well-known)) https://weblight-demo.hobrasoft.cz/ # # Adresář je potřebný pouze pro vystavení certifikátů # Bez něj by to však nefungovalo # DocumentRoot /var/www/localhost/well-known <Directory /var/www/localhost/well-known> Order allow,deny Allow from all AllowOverride All Require all granted </Directory> </VirtualHost> # # Všechny požadavky kromě požadavků certifikační autority se vyřizují protokolem HTTPS # Aby to běhalo správně podle jména virtuálního serveru, je nutné mít na serveru # rozšíření SNI, což v současných verzi apache (verze 2.4) je asi samozřejmost # <VirtualHost *:443> ServerName weblight-demo.hobrasoft.cz # # Zařízení ve skutečnosti běží jinde. Apache potřebuje vědět, kde. # Ve skutečnosti běží weblight-demo na dvou různých zařízeních # (BeagleBone a web kamera) a požadavek se přesměruje na správné # zařízení podle URL adresy požadavku pravidly RewriteRule. # # Zde je pro jednoduchost uvažováno, že adresa zařízení je jen jedna. # # Konfigurační volba ProxyPass* má dva parametry: # / Jaké URL se přesměruje # http://[... Kam se URL přesměruje # # Pomocí reverzní proxy tak lze snadno ovlivnit, kam se jaký požadavek pošle. # ProxyRequests off ProxyPass / http://[2001:db8::11]:8099/ ProxyPassReverse / http://[2001:db8::11]:8099/ # # V IPv6 prostředí bývá zvykem, že jeden počítač má množství různých adres. # Umožňuje to tak mít například vlastní IP adresy pro jednotlivé služby # běžící na serveru. Zde lze říci, která IP adresa se má použít pro odchozí # požadavky. To je důležité především v případě, že máte přístup omezený # firewallem na vstupu sítě pouze pro některé IP adresy. # ProxySourceAddress 2a01:430:59:1:3::1 # # Nastavení cest k certifikátům, zapnutí SSL, nastavení SSL # Z bezpečnostních důvodů jsou certifikáty uložené pod uživatelským účtem "certificates", # Apache proto musí mít přístup do adresáře s certifikáty. # # Povolené jsou pouze silné šifry (více v odkazech) # SSLEngine on SSLCipherSuite \ HIGH:!aNULL:!MD5 SSLCertificateFile /home/certificates/.acme.sh/weblight-demo.hobrasoft.cz/weblight-demo.hobrasoft.cz.cer SSLCertificateKeyFile /home/certificates/.acme.sh/weblight-demo.hobrasoft.cz/weblight-demo.hobrasoft.cz.key SSLCertificateChainFile /home/certificates/.acme.sh/weblight-demo.hobrasoft.cz/fullchain.cer </VirtualHost>
Pro své weby používáme certifikáty od certifikační autority Let's Encrypt utilitou acme.sh. Utilitu je možné stáhnout zde: https://github.com/Neilpang/acme.sh. Instalace je velmi jednoduchá a dobře popsaná v dokumentaci. Některé nepříjemné chyby však mohou nastat při vystavování certifikátů.
Pokud pracujete pod uživatelem root, obvykle není třeba nastavovat přístupová práva pro adresáře. Jestliže však trpíte chorobnou paranoiou a spouštíte podobně jako já utilitu acme.sh pod vyhraženým uživatelským účtem, musíte nastavit přístupová práva pro adresář /var/www/localhost/well-known tak, abyste mohli z tohoto účtu do adresáře zapisovat.
Než spustíte samotnou utilitu acme.sh, vyzkoušejte, jestli vše funguje tak, jak má. Vytvořte v adresáři /var/www/localhost/well-known soubor a vyzkoušejte, jestli je tento soubor přístupný přes internet:
echo "ahoj" > /var/www/localhost/well-known/abcd.txt curl -X GET http://weblight-demo.hobrasoft.cz/well-known/abcd.txt
Curl musí vypsat řetězec "ahoj" – pokud se vám nezadaří, zkuste spustit curl s parametrem -v a prostudovat získaný výpis síťové komunikace.
Pokud je vše v pořádku, můžete se pokusit vystavit certifikáty:
acme.sh --issue -d weblight-demo.hobrasoft.cz -w /var/www/localhost/well-known
Jakmile jsou certifikáty vystavené, můžete restartovat apache a vyzkoušet, jestli reverzní proxy funguje, jak je od ní požadováno:
Utilitu acme.sh přidejde do crontab. Po změně certifikátů musí být restartovaný apache server. To můžete zajistit volbou --post-hook. Volba má jeden parametr – skript, který se spustí po vystavení nových certifikátů. V případě, že používáte pro správu certifikátů vyhražený uživatelský účet, může být dobrým pomocníkem při automatizovaném restartu systémová utilita sudo.
V popisovaném případě je reverzní proxy server v Praze a zařízení v Rožnově pod Radhoštěm. Veškerý přenos je uskutečněný nezabezpečeným protokolem HTTP přes internet. V případě webu weblight-demo.hobrasoft.cz by to vadit nemuselo, ale v jiných případech ano. Přenos je proto zabezpečený protokolem IPSEC. Nastavení IPSEC je na IPv6 jednoduché, velmi jednoduché je i nastavení pravidel na firewallu. To je však námět na jiný článek.