Caddy: web server s Let's Encrypt v základní výbavě

Michal Halenka 14. 3. 2016

Caddy je webový server, který integruje moderní webové technologie již ve výchozím nastavení. Přidává jednoduchou konfiguraci a automatickou podporu Let's Encrypt. Výsledkem je ideální server pro statické stránky.

První webový server byl napsán již před více než čtvrt stoletím. Za tu dobu přibyla k primitivnímu protokolu HTTP celá řada dalších technologií (namátkou HTTP/2, HTTPS, HSTS, FastCGI…), které se snaží přiblížit původní návrh dnešním nárokům na webový server. Ačkoliv se autoři nejrozšířenějších implementací webových serverů (Apache a Nginx) snaží držet krok, na výsledných programech je vidět, že některé prvky nebyly součástí návrhu od počátku a jejich integrace neprošla ještě natolik do hloubky, jak by v ideálním případě měla.

V reakci na tento stav vznikl na začátku roku 2015 projekt Caddy, který si klade za cíl podporovat moderní webové technologie při zachování velmi jednoduché konfigurace a správy. Už ve výchozím konfiguraci podporuje IPv6 a sám se postará o zajištění certifikátů od Let's Encrypt pro HTTPS. Celý web serveru je napsán v jazyce Go a lze jej tedy i se všemi moduly zkompilovat do jediného statického binárního souboru bez dalších závislostí. V případě 64bitového Linuxu má binárka velikost téměř 23 MB. Pro srovnání: balíček nginx-full v Debian Jessie sice zabírá po rozbalení jen lehce přes 1 MB, pokud jej však instalujete na minimální systém, vyvolá stažení dalších závislostí, které si řeknou o dalších 62 MB.

Instalace

Připravený balíček s web serverem Caddy se mi povedlo objevit jen v distribuci Arch Linux a navíc pouze v uživatelském repozitáři AUR. Uživatel je tak odkázán na připravené binární soubory, které jsou ale k dispozici pro všechny obvyklé platformy (Linux, FreeBSD, OpenBSD, OS X i Windows) na stránkách projektu. Po stažení není třeba nic dalšího instalovat. Staticky kompilovaný binární soubor obsahuje vše potřebné. Posledním krokem je tedy příprava konfigurace.

Základní konfigurace

Konfigurační soubor web serveru Caddy se v dokumentaci označuje jako Caddyfile, i když se může jmenovat jinak, nebo může být rozčleněný do více souborů. V tomto článku se ale budeme držet ducha jednoduchosti, proto zůstaneme u obvyklého názvu souboru. Struktura Caddyfile je velice podobná struktuře konfiguračního souboru Nginx. Nejjednodušší web server tedy může být v Caddyfile popsán takto:

http://caddy.halenka.eu, https://caddy.halenka.eu {
    root ./muj-web/
}

Tento třířádkový Caddyfile nastaví web server slyšící na jméno caddy.halenka.eu na portu 80 (HTTP) a 443 (HTTPS), který poskytuje soubory z adresáře  ./muj-web/. V tomto výchozím stavu je zapnutá podpora HTTP/2 a Caddy se sám postará o zajištění certifikátu od autority Let's Encrypt. Ten je prozíravě umístěn do složky .caddy v domovském adresáři uživatele pro pozdější potřebu.

HTTP Strict Transport Security

Podle testu SSL společnosti Qualys nám v takovémto případě pro dosazžení nejvyššího hodnocení chybí už jen vhodná podpora HSTS. I v tomto případě je nastavení velmi prosté. Stačí oddělit HTTP instanci od HTTPS instance, pro HTTP zajistit přesměrování na HTTPS a pro HTTPS doplnit vhodné parametry do hlavičky. Po provedení zmíněných úprav bude náš Caddyfile vypadat takto:

http://caddy.halenka.eu {
    redir https://caddy.halenka.eu/
}
https://caddy.halenka.eu {
    header / Strict-Transport-Security "max-age=1814400; includeSubDomains; preload"
    root ./muj-web/
}

Netradiční funkce

Web server obvykle chápeme jako aplikaci, která odpovídá na HTTP požadavky a buď v odpovědi posílá soubory z disku, nebo data, která obdržel jako reakci od webové aplikace. Caddy web server v tomto ohledu poněkud leze do zelí webovým aplikacím a sám o sobě některé základní vlastnosti poskytuje. Namátkou se jedná o interpretaci Markdown souborů do HTML, nebo implementaci REST API. Těmto netradičním funkcionalitám se budeme více věnovat v příštím článku, ale malou ukázku si můžeme dovolit i nyní.

Řekněme, že náš adresář ./muj-web/static/ obsahuje soubory ve formátu MarkDown, které bychom chtěli poskytovat klientům jako HTML. Konfigurace je opět velmi přímočará a skládá se z přidání jediného řádku:

http://caddy.halenka.eu {
    redir https://caddy.halenka.eu/
}
https://caddy.halenka.eu {
    header / Strict-Transport-Security "max-age=1814400; includeSubDomains; preload"
    root ./muj-web/
    markdown /static
}

Vyzkoušejte demo

Takto připravený server si můžete vyzkoušet na adrese caddy.halenka.eu, jsou tam odkazy na testy i ukázky zde zmíněných funkcí. Server běží na playgroundu u vpsFree.cz.

Shrnutí

Přestože je Caddy poměrně mladým projektem, již nyní nabízí celou řadu zajímavých a netradičních funkcí, které jej odlišují od konkurence. V kombinaci s automatickou podporou mnoha moderních technologií a velmi jednoduchou konfigurací vzniká jednoduše použitelný webový server, který sám o sobě dostačuje pro mnohé případy, kdy je Apache a Nginx příliš robustní, nebo je třeba je rozšířit o další funkcionality. V dalším článku se pak můžete těšit na ukázku použití pro jednoduché statické stránky.

V případě 64bitového Linuxu má binárka velikost téměř 23 MB. Pro srovnání: balíček nginx-full v Debian Jessie sice zabírá po rozbalení jen lehce přes 1 MB, pokud jej však instalujete na minimální systém, vyvolá stažení dalších závislostí, které si řeknou o dalších 62 MB.

Snažíte se naznačit, že si nginx do paměti po startu natáhne i veškerý obsah /usr/share/doc? Místo na disku, které zabírají balíčky, je veličina, která je opravdu nezajímavá z libovolného úhlu pohledu
Co je zajímavé, je spotřebovaná paměť per nakonfigurovaný web, per spojení, atp. Sdílené knihovny zabírají v paměti místo jenom jednou (zjednodušeně řečeno).

Aneb fakt mě na závodní dráze nezajímá, že má trabant opravdu ale opravdu lehkou karosérii...

A osobně si myslím, že Go se svým statickým linkováním je security nightmare. CVE-2015-8618, které Vás donutí překompilovat veškerý Go kód používající TLS (resp. RSA klíče) je fakt bezva.

Taky zbožňuji instalaci náhodných binárek z náhodných webových serverů, kde není zjevné, s čím a jak bylo co zkompilováno. Přijde mi to jen o úroveň horší než `wget foo | sudo bash`. Bavíme se tady o kontrole kontrolních součtů a tady není ani vidět jaké verze knihoven výsledná binárka používá. Řekněme, že je v miekově DNS knihovně v nějaké verzi bezpečnostní chyba, tak a teď mi řekněte, jestli jsem v bezpečí nebo ne? Těžko říct, co? GH/miek/dns je jenom git repozitář, který zatím nemá ani jeden release, tj. se při každém sestavení použije aktuální verze z gitu? A mám vlastně správnou verzi z webu, když autor nevystavuje podepsané kontrolní součty, nebo už mám na serveru nějakou pěknou čínsko-rusko-americkou binárku, a tajné služby se přetahují, kdo rychleji stáhne obsah mého disku? No bezva, půlka bezpečnostního týmu právě podala výpověď a druhá půlka se preventivně opila do němoty...

Na takové to domácí hraní, kde to na klik nasadím v throw-away kontejneru, je to dobrý, ale pro seriózní použití směrem ven do Internetu, kde jsou zapotřebí nějaké garance, bych raději pouvažoval o projektu, který bezpečnost bere vážněji.

Ondřej Surý Zlatý podporovatel
Lupa.cz: Jak EET vidí ajťák aneb Drahá vražda UX

Jak EET vidí ajťák aneb Drahá vražda UX

Vitalia.cz: Děti jsou sportem opotřebované

Děti jsou sportem opotřebované

Podnikatel.cz: Eshopy s dopravou zdarma. Zválcují ostatní?

Eshopy s dopravou zdarma. Zválcují ostatní?

DigiZone.cz: Šlágr TV: pokuta 100 tisíc za on-line

Šlágr TV: pokuta 100 tisíc za on-line

120na80.cz: Velký přehled: 7 očkování proti exotickým nemocem

Velký přehled: 7 očkování proti exotickým nemocem

Podnikatel.cz: Když už je sexy, tak ať taky funguje

Když už je sexy, tak ať taky funguje

DigiZone.cz: Šlágr TV dostala pokutu 100 000 Kč

Šlágr TV dostala pokutu 100 000 Kč

DigiZone.cz: Živí mrtví budou na AMC koncem srpna

Živí mrtví budou na AMC koncem srpna

120na80.cz: 10 nej přípravků na holení

10 nej přípravků na holení

Vitalia.cz: Muži kouří 24 cigaret denně, ženy o dost míň

Muži kouří 24 cigaret denně, ženy o dost míň

DigiZone.cz: UPC umí televizi sedm dní nazpět

UPC umí televizi sedm dní nazpět

Vitalia.cz: Sója a rakovina

Sója a rakovina

Lupa.cz: Kam si doma dáte internet věcí? Na polici?

Kam si doma dáte internet věcí? Na polici?

DigiZone.cz: Konec geoblokace? Ani náhodou…

Konec geoblokace? Ani náhodou…

Vitalia.cz: Martin Kasa o byznysu s léky

Martin Kasa o byznysu s léky

Vitalia.cz: Ministerstvo: tyto příbory jsou nebezpečné

Ministerstvo: tyto příbory jsou nebezpečné

Vitalia.cz: 7 nemocí očí, které musíte léčit včas

7 nemocí očí, které musíte léčit včas

Lupa.cz: Válka e-shopů. Alza končí s Heurekou

Válka e-shopů. Alza končí s Heurekou

Vitalia.cz: Před, nebo po snídani? Kdy je lepší čistit si zuby

Před, nebo po snídani? Kdy je lepší čistit si zuby

Lupa.cz: Babiš: nevím o návodu, jak obejít blokování webů

Babiš: nevím o návodu, jak obejít blokování webů