Modul 7 · 7.4
Caddy, HSTS a security.txt
Modul 7: Doména, webový server a https · Čas čítania: 12 minút
Cieľ lekcie: Po tejto lekcii dokážete používať Caddy ako jednoduchý webový server s automatickým https, nastaviť HSTS a najdôležitejšie bezpečnostné hlavičky (v Caddy aj nginx) tak, aby vaša stránka zostala dostupná, a zverejniť platný súbor security.txt.
Kľúčové pojmy: Caddy, Caddyfile, automatické https, reverse_proxy, file_server, header, HSTS (Strict-Transport-Security), max-age, includeSubDomains, preload, X-Content-Type-Options, frame-ancestors, Referrer-Policy, security.txt, Contact, Expires, /.well-known/
Caddy: https bez starostí
V lekcii 7.2 a 7.3 vznikla pomocou nginx a certbot stránka s https. Sú to dva programy, niekoľko súborov a časovač. Caddy to zvládne v jednom: je to webový server so zabudovaným klientom ACME. Ak je v konfigurácii uvedený názov, ten smeruje na server a porty 80 a 443 sú dostupné, Caddy si sám získa certifikát, včas ho obnoví a presmeruje http na https.
Caddy je v repozitári balíkov Debianu aj Ubuntu (v trochu staršej verzii); jeho autori ponúkajú aj vlastný zdroj apt s najnovšou verziou, s vlastným kľúčom a Signed-By ako v lekcii 4.1. V module 9 beží Caddy ako kontajner pre vaše služby v Dockeri (lekcia 9.4). Tu ho používate ako bežnú službu.
anna@web1:~$ sudo apt install caddy
anna@web1:~$ systemctl status caddyNa portoch 80 a 443 používajte buď nginx, alebo Caddy, nie oboje: na jednom porte môže počúvať iba jeden program.
Caddyfile
Konfigurácia sa nachádza v /etc/caddy/Caddyfile. Statická stránka a aplikácia za reverznou proxy:
example.com, www.example.com {
root * /var/www/example.com
file_server
encode zstd gzip
}
app.example.com {
reverse_proxy 127.0.0.1:3000
}To je všetko. Caddy automaticky počúva na IPv4 aj IPv6, vyžiada certifikáty pre všetky tri názvy, presmeruje http na https a pri reverse_proxy sám odovzdá hlavičky X-Forwarded-For a X-Forwarded-Proto (čo ste v nginx robili ručne, lekcia 7.2).
Testovanie a opätovné načítanie prebieha ako pri nginx:
anna@web1:~$ caddy validate --config /etc/caddy/Caddyfile
Valid configuration
anna@web1:~$ sudo systemctl reload caddy
anna@web1:~$ sudo journalctl -u caddy -fV journale uvidíte získavanie certifikátov. Ak sa niečo pokazí, nájdete tam dôvod: zvyčajne rovnaký ako pri certbote (port 80 je zatvorený, názov smeruje inam, nefunkčné IPv6; lekcia 7.3).
HSTS: prehliadač si zapamätá, že ide o https
Presmerovanie z http na https má jeden slabý moment: úplne prvá požiadavka cez http ide ešte nešifrovane. Niekto v rovnakej sieti ju môže zachytiť a udržať návštevníka na http. HSTS (HTTP Strict Transport Security, RFC 6797) to rieši. Vaša stránka posiela cez https túto hlavičku:
Strict-Transport-Security: max-age=31536000Prehliadač si potom na jeden rok (31.536.000 sekúnd) zapamätá, že tento názov sa smie otvárať iba cez https. Ak návštevník neskôr napíše http://, prehliadač z toho sám urobí https ešte predtým, ako niečo odíde do siete. Hlavičku HSTS, ktorá príde cez http, prehliadač ignoruje; platí iba cez https.
Má to aj odvrátenú stranu. Ak si prehliadač HSTS zapamätal a uvidí chybu certifikátu (vypršaný, nesprávny názov), návštevník nedostane tlačidlo, ktorým by mohol aj tak pokračovať. Vaša stránka je potom pre týchto návštevníkov nedostupná, kým nebude certifikát v poriadku. Preto:
- HSTS zapnite až vtedy, keď https funguje všade a obnovovanie prebieha automaticky (lekcia 7.3).
- Začnite s krátkym
max-age, napríklad jeden deň (86400), a postupne ho zvyšujte až na rok. - Buďte opatrní s
includeSubDomains: platí pre každú subdoménu, aj pre starú subdoménu so zariadením alebo službou bez platného certifikátu. preloadžiada o zaradenie do zoznamu zabudovaného v prehliadačoch (hstspreload.org). Na to sa okrem iného vyžadujemax-ageaspoň jeden rok,includeSubDomainsa https na všetkých subdoménach. Vyradenie zo zoznamu trvá mesiace. Urobte to iba vtedy, ak máte istotu, že celá doména bude natrvalo na https.
Ďalšie bezpečnostné hlavičky
Okrem HSTS existuje niekoľko hlavičiek, ktoré s malou námahou veľa pomôžu:
| Hlavička | Proti čomu | Hodnota na začiatok |
|---|---|---|
X-Content-Type-Options | prehliadač háda, o aký súbor ide, takže nahratý "obrázok" sa môže spustiť ako skript | nosniff |
Content-Security-Policy: frame-ancestors (alebo staršie X-Frame-Options) | clickjacking: iná stránka neviditeľne načíta vašu stránku do rámca | frame-ancestors 'self' (alebo X-Frame-Options: SAMEORIGIN) |
Referrer-Policy | adresa vašej stránky (s hľadanými výrazmi alebo číslami objednávok) uniká na iné stránky | strict-origin-when-cross-origin |
Úplná Content-Security-Policy (ktoré skripty a štýly sa smú načítať) sa robí na mieru pre každú stránku a presahuje rámec tohto kurzu; začnite iba s frame-ancestors.
V Caddy ich nastavíte direktívou header v bloku stránky:
example.com, www.example.com {
root * /var/www/example.com
file_server
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
}Caddy HSTS ani tieto hlavičky nenastavuje sám; musíte ich tam teda naozaj pridať. -Server odstráni hlavičku Server. V lekcii 9.4 pridáte do rovnakého typu bloku vlastnú hlavičku X-Weboke-Cursus pre úlohu.
V nginx dáte rovnaké riadky do bloku server pre port 443:
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;always zabezpečí, že sa pošlú aj pri chybových stránkach. Pozor na známu pascu nginx: ak je v bloku location čo i len jedna vlastná add_header, riadky add_header z bloku server už pre túto location neplatia. Preto vždy skontrolujte výsledok:
anna@laptop:~$ curl -sI https://example.com | grep -iE 'strict|nosniff|frame|referrer'
strict-transport-security: max-age=31536000
x-content-type-options: nosniff
content-security-policy: frame-ancestors 'self'
referrer-policy: strict-origin-when-cross-originsecurity.txt: takto vám niekto môže nahlásiť zraniteľnosť
Predstavte si, že niekto nájde na vašom serveri zraniteľnosť, napríklad otvorený priečinok alebo zastaranú službu. Ako sa ten človek dozvie, koho má upozorniť? Na to slúži security.txt (RFC 9116): malý textový súbor na pevnom mieste, https://<jouwdomein>/.well-known/security.txt.
Contact: mailto:security@example.com
Expires: 2027-10-31T23:00:00Z
Preferred-Languages: nl, en
Canonical: https://example.com/.well-known/security.txtPravidlá:
Contactje povinné: adresamailto:,https://alebotel:, na ktorú prichádzajú hlásenia. Použite adresu, ktorú niekto naozaj číta.Expiresje povinné a smie sa vyskytnúť iba raz: dátum, po ktorom sa súbor považuje za zastaraný. RFC odporúča dátum do jedného roka. Tak nezostane visieť súbor s dávno zabudnutou adresou. Zapíšte si do kalendára, kedy ho treba predĺžiť.Preferred-Languages,CanonicalaPolicy(odkaz na vaše pravidlá pre hlásenia) sú voliteľné.- Súbor musí prichádzať cez https ako čistý text (
text/plain, UTF-8). Staré miesto/security.txtmôžete použiť navyše, ale/.well-known/má prednosť.
Umiestnenie pri statickej stránke:
anna@web1:~$ sudo mkdir -p /var/www/example.com/.well-known
anna@web1:~$ sudoedit /var/www/example.com/.well-known/security.txt
anna@laptop:~$ curl -sI https://example.com/.well-known/security.txt | grep -i content-type
content-type: text/plain; charset=utf-8Ak v nginx používate záchrannú sieť location ~ /\. { deny all; } z lekcie 7.2, dajte pred ňu výnimku: location ^~ /.well-known/ { }. Pri aplikácii za reverznou proxy môžete v Caddy nasmerovať cestu /.well-known/security.txt na súbor pomocou bloku handle a file_server.
Častá chyba: stránka alebo aplikácia, ktorá na každú neznámu cestu odpovie úvodnou stránkou so stavom 200. Potom security.txt "existuje", ale je to HTML. Kontrolujte preto aj obsah.
Na AlmaLinux a Rocky Linux
Caddy tam získate zo zdroja jeho autorov alebo z EPEL/COPR. Rovnako ako pri nginx musí SELinux povoliť reverznú proxy (setsebool -P httpd_can_network_connect 1). Caddyfile aj hlavičky sú rovnaké.
Zhrnutie
- Caddy sám rieši certifikáty, ich obnovovanie a presmerovanie na https;
reverse_proxyautomaticky odovzdá správne hlavičky. - HSTS zabezpečí, že si prehliadače zapamätajú, že vaša stránka je iba na https;
max-agezvyšujte postupne, sincludeSubDomainsbuďte opatrní a spreloadveľmi opatrní. - Okrem toho nastavte
X-Content-Type-Options: nosniff,frame-ancestors 'self'aReferrer-Policy; v Caddy pomocouheader, v nginx pomocouadd_header ... always, a skontrolujte to príkazomcurl -I. - security.txt je na
/.well-known/security.txt, cez https, ako čistý text, s povinnýmContacta jednýmExpiresdo jedného roka.
Kvíz
Úloha
Úloha Z7.4: HSTS, hlavičky a security.txt. Nastavte pre svoju stránku HSTS (aspoň 180 dní, keď už https nejaký čas spoľahlivo funguje), X-Content-Type-Options: nosniff a frame-ancestors 'self' (alebo X-Frame-Options) a zverejnite security.txt s Contact a Expires do jedného roka. Zadajte názov hostiteľa. Program načíta https://<hostnaam>/ a skontroluje hlavičky, potom načíta https://<hostnaam>/.well-known/security.txt a skontroluje polia. Neukladá nič okrem výsledku a dátumu Expires.
Ďalšie čítanie
- Hlavičky HSTS a bezpečnostné hlavičky pre váš web
- Caddy, Automatic HTTPS: https://caddyserver.com/docs/automatic-https
- Caddy, direktíva header: https://caddyserver.com/docs/caddyfile/directives/header
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797.html
- Zoznam HSTS preload a požiadavky: https://hstspreload.org/
- RFC 9116, security.txt: https://www.rfc-editor.org/rfc/rfc9116.html
- securitytxt.org (vytvorenie a kontrola): https://securitytxt.org/
