Uživatelské nástroje

Nástroje pro tento web


Squid a cachování https provozu

V základním návodu jsme si ukázali, jak zprovoznit squid. V takovém nastavení cachuje provoz protokolu http. Avšak šifrovaný provoz přes protokol https prochází zcela nezměněn skrz, tedy při přístupu k zabezpečeným stránkám nepocítíme žádné zrychlení ani zmenšení provozu.

Abychom pochopili, proč tomu tak je, podíváme se jak funguje protokol https. Na začátku se naváže spojení a poté si klient se serverem vyjedná šifrování. V rámci tohoto vyjednávání se server představí certifikátem. Tento certifikát obsahuje informaci, pro kterou doménu je vystaven a je podepsán některou certifikační autoritou. Klient zkontroluje, že doména v certifikátu odpovídá té, kterou požadoval a že dané autoritě věří (seznam důvěryhodných autorit má klient uložený). Tím je zaručeno, že se jen tak někdo nemůže vydávat za server, kterým není. A pomocí šifrování je zaručeno, že se někdo uprostřed nemůže jen připojit k opravdovému serveru a certifikát přeposlat.

Což je ovšem přesně to, co by taková proxy potřebovala udělat. Připojit se na původní server a představit se jeho certifikátem. To však nejde, proto squid v základním nastavení pouští šifrovaný provoz skrz. Ale ono by stačilo představit se certifikátem od některé důvěryhodné autority.

A přesně to lze udělat. Vytvoříme si svoji certifikační autoritu a tu nastavíme v prohlížečích jako důvěryhodnou. Tuto autoritu dáme k dispozici naší proxy. Kdykoliv se klient pokusí vyjednat šifrované spojení skrz proxy na některý server, proxy toto spojení odchytí. Připojí se na požadovaný server, prohlédne si certifikát a pomocí naší autority vystaví podobný. Tím se poté představí klientovi a ten mu bude důvěřovat.

Je třeba však poznamenat, že šifrování je výpočetně náročná operace a v případě rychlých přípojek bude mít toto nastavení přesně opačný efekt, než zamýšlený ‒ stahování dat je rychlé, ale jejich rozšifrování a opětovné zašifrování v routeru jej brzdí.

Morální, právní a bezpečnostní hledisko

Je třeba si uvědomit, že zde provádíme něco, čemu se celý systém šifrování snaží bránit. Toto je totiž učebnicová ukázka takzvaného MITM útoku (Man-In-The-Middle, útoku člověka ve středu). Tato funkcionalita je ve squid proto, aby umožnila cachovat i šifrované stránky, avšak s vědomím a souhlasem uživatelů. Provádět toto bez vědomí uživatele je určitě nemorální (protože má dojem, že jeho komunikaci vidí jen koncový server) a pravděpodobně i nelegální. O otázkách zkoumání či upravování obsahu pomocí proxy snad nemusí být ani řeč.

Další úhel pohledu je bezpečnostní. Jednak je v systému navíc další zařízení, přes které se dá do komunikace dostat, kdyby bylo napadené. V případě, že máte nastavené ukládání dat na disk, ukládají se i zabezpečené stránky ‒ tedy například obsah vašeho internetového bankovnictví. Dále, rozhodování o důvěryhodnosti certifikátu a šifrování provádí proxy, nikoliv klient (tedy, má vlastní sadu důvěryhodných autorit, vlastní pravidla o dostatečně silných šifrách).

A poslední, některé bezpečnostní prvky, jako například DNSSEC validator, budou hlásit, že došlo k podvržení certifikátu (což je pravda).

Výroba autority

Nyní vyrobíme vlastní autoritu.

cd /etc/squid
mkdir ssl_cert
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout authority.pem -out authority.pem

Toto vytvoří nový klíč a k němu odpovídající certifikát v souboru /etc/squid/ssl_cert/authority.pem. Na jménu souboru nezáleží, ale pokud jej změníte, je třeba odpovídajícím způsobem upravit i konfiguraci. Tento příkaz se bude vyptávat na informace, které má do certifikátu zapsat. Je celkem jedno, co tam bude uvedeno, protože certifikát budete používat pouze vy.

Tento certifikát bude platný po dobu jednoho roku. Lze buď změnit dobu platnosti (365 dní), nebo po roce vytvořit nový a vyměnit.

Zatímco squid požaduje autoritu ve formátu PEM, prohlížeče, do kterých budeme certifikát přidávat, obvykle chtějí DER. Tímto příkazem převedeme certifikát do požadovaného formátu.

openssl x509 -in authority.pem -outform DER -out authority.der

Stáhněte si certifikát do počítače (spuštěno na počítači):

scp root@192.168.1.1:/etc/squid/ssl_cert/authority.der .

Nyní jej vložte do prohlížeče. Toto se liší podle prohlížeče, například ve Firefoxu to lze provést následujícím způsobem: V nastavení navštívíte záložku Rozšířené, v ní Certifikáty. Tlačítkem Certifikáty se otevře nový dialog a v něm se na záložce Autority vyskytuje seznam aktuálně důvěryhodných autorit. Pomocí tlačítka Import lze přidat novou autoritu.

Pokud někdo nepovolaný získá soubor s klíčem (authority.pem), je schopný obdobným způsobem podvrhovat certifikáty. Pravděpodobně to však nebude dělat jen za účelem cachování provozu. Je tedy třeba soubor dobře chránit před únikem. Pokud k úniku přesto dojde, je nutné autoritu ze všech prohlížečů neprodleně odstranit.

Nastavení squid

To, jestli squid nahlíží do šifrovaných spojení je vlastnost portu, na kterém poslouchá. To umožňuje mít více portů, z nichž některé do spojení nahlíží a jiné ne. Na daném portu je třeba povolit jednak ssl-bump (nahlížení do šifrovaných spojení) a jednak dynamické generování certifikátů. Taktéž nastavíme velikost cache pro nagenerované certifikáty a kterou autoritu použít. Při použití stejného portu (jako v tomto případě) je třeba původní řádek s daným portem nahradit.

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/authority.pem

Dále je třeba povolit funkcionalitu pro všechna spojení:

always_direct allow all
ssl_bump server-first all

V tomto místě by šlo nastavit, aby se do komunikace s některými servery nenahlíželo, nebo aby některý z počítačů byl z nahlížení vyňat. Například nahrazením předchozího tímto:

# Domény, které se nebudou dešifrovat
acl nobump_domains example.bank.com
acl nobump_domains another.excluded.domain.cz

# Klienti, kterým se nebude nahlížet
acl nobump_clients src 192.168.1.13

always_direct allow all
ssl_bump nobump_domains none
ssl_bump nobump_clients none
ssl_bump server-first all

Důvěryhodnost certifikátů

Jak již bylo zmíněno výše, důvěryhodnost certifikátu serveru posuzuje squid. Ve výchozím nastavení, pokud usoudí, že certifikát není důvěryhodný, jednoduše vrátí klientovi stránku s chybou. Toto chování mu lze vymluvit, například globálně:

sslproxy_cert_error allow all

Poté squid místo chybové stránky vyrobí certifikát, který simuluje stejný problém (tedy, pro self-signed vyrobí self-signed certifikát, pro neznámou certifikační autoritu vyrobí nějakou neznámou certifikační autoritu a k ní certifikát, a tak podobně). Ten poté pošle klientovi, a uživatel vidí obdobnou chybovou hlášku. Může se tedy rozhodnout stejně, jako by to mohl udělat bez proxy.

Druhý problém je, že Turris v základní instalaci obsahuje jen velmi malé množství důvěryhodných certifikátů. Tedy, většina stránek se bude tvářit nedůvěryhodně. Větší sadu lze doinstalovat ve Forisu, v záložce Updater (seznam balíčků Certifikáty kořenových autorit). Tento seznam je převzatý z Debianu. Pozor, některé programy na Turrisu (například wget) začnou věřit certifikátům vydaným libovolnou z těchto autorit. V případě, že vám toto nevyhovuje, správa certifikátů je na vás, balíček neinstalujte.