Modul 7 · 7.4
Caddy, HSTS i security.txt
Modul 7: Domena, web-poslužitelj i https · Vrijeme čitanja: 12 minuta
Cilj učenja: Nakon ove lekcije moći ćete koristiti Caddy kao jednostavan web-poslužitelj s automatskim https-om, postaviti HSTS i najvažnija sigurnosna zaglavlja (u Caddyju i nginxu) a da Vaša stranica ne postane nedostupna te objaviti valjanu datoteku security.txt.
Ključni pojmovi: Caddy, Caddyfile, automatski 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 brige
U lekcijama 7.2 i 7.3 izradili ste stranicu s https-om pomoću nginxa i certbota. To su dva programa, nekoliko datoteka i jedan timer. Caddy sve to radi sam: to je web-poslužitelj s ugrađenim ACME klijentom. Ako je naziv naveden u konfiguraciji, ako upućuje na poslužitelj i ako su priključci 80 i 443 dostupni, Caddy sam preuzima certifikat, na vrijeme ga obnavlja i preusmjerava http na https.
Caddy se nalazi u repozitoriju paketa Debiana i Ubuntua (nešto starija verzija); autori nude i vlastiti apt repozitorij s najnovijom verzijom, s vlastitim ključem i Signed-By kao u lekciji 4.1. U modulu 9 Caddy radi kao kontejner za Vaše Docker usluge (lekcija 9.4). Ovdje ga koristite kao običnu uslugu.
anna@web1:~$ sudo apt install caddy
anna@web1:~$ systemctl status caddyNa priključcima 80 i 443 koristite ili nginx ili Caddy, ne oba: samo jedan program može slušati na jednom priključku.
Caddyfile
Konfiguracija se nalazi u /etc/caddy/Caddyfile. Statična stranica i aplikacija iza reverse proxyja:
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 sve. Caddy automatski sluša na IPv4 i IPv6, traži certifikate za sva tri naziva, preusmjerava http na https, a kod reverse_proxy automatski prosljeđuje zaglavlja X-Forwarded-For i X-Forwarded-Proto (ono što ste u nginxu radili ručno, lekcija 7.2).
Testiranje i ponovno učitavanje rade kao kod nginxa:
anna@web1:~$ caddy validate --config /etc/caddy/Caddyfile
Valid configuration
anna@web1:~$ sudo systemctl reload caddy
anna@web1:~$ sudo journalctl -u caddy -fU journalu vidite preuzimanje certifikata. Ako nešto pođe po zlu, tamo piše i razlog: obično isti kao kod certbota (priključak 80 zatvoren, naziv upućuje negdje drugdje, IPv6 ne radi; lekcija 7.3).
HSTS: neka preglednik zapamti da je to https
Preusmjeravanje s http na https ima jednu slabu točku: prvi zahtjev preko http-a još uvijek ide nešifrirano. Netko na istoj mreži može ga presresti i zadržati posjetitelja na http-u. HSTS (HTTP Strict Transport Security, RFC 6797) to rješava. Vaša stranica preko https-a šalje ovo zaglavlje:
Strict-Transport-Security: max-age=31536000Preglednik tada godinu dana (31.536.000 sekundi) pamti da se ovom nazivu smije pristupati samo preko https-a. Ako posjetitelj kasnije upiše http://, preglednik sam od toga napravi https, i prije nego što išta ode preko mreže. HSTS zaglavlje koje stigne preko http-a preglednik zanemaruje; vrijedi samo preko https-a.
Postoji i druga strana. Ako je preglednik zapamtio HSTS i vidi pogrešku certifikata (istekao, pogrešan naziv), posjetitelj ne dobiva gumb za nastavak unatoč upozorenju. Vaša je stranica tada tim posjetiteljima nedostupna dok certifikat ne bude ispravan. Zato:
- Uključite HSTS tek kada https radi posvuda i obnavljanje ide automatski (lekcija 7.3).
- Počnite s kratkim
max-age, na primjer jednim danom (86400), i postupno ga povećavajte do godine dana. - Budite oprezni s
includeSubDomains: to vrijedi za svaku poddomenu, pa i za staru poddomenu s uređajem ili uslugom bez valjanog certifikata. preloadtraži uvrštavanje na popis ugrađen u preglednike (hstspreload.org). Za to se, među ostalim, zahtijevamax-ageod najmanje godinu dana,includeSubDomainsi https na svim poddomenama. Uklanjanje s popisa traje mjesecima. Učinite to samo ako ste sigurni da je cijela domena trajno na https-u.
Ostala sigurnosna zaglavlja
Osim HSTS-a postoji nekoliko zaglavlja koja uz malo truda puno pomažu:
| Zaglavlje | Štiti od | Početna vrijednost |
|---|---|---|
X-Content-Type-Options | preglednik pogađa vrstu datoteke, pa se prenesena "slika" može izvršiti kao skripta | nosniff |
Content-Security-Policy: frame-ancestors (ili starije X-Frame-Options) | clickjacking: druga stranica nevidljivo učitava Vašu stranicu u okvir (frame) | frame-ancestors 'self' (ili X-Frame-Options: SAMEORIGIN) |
Referrer-Policy | adresa Vaše stranice (s pojmovima pretraživanja ili brojevima narudžbi) curi prema drugim stranicama | strict-origin-when-cross-origin |
Potpuni Content-Security-Policy (koje se skripte i stilovi smiju učitati) prilagođava se svakoj stranici posebno i izlazi iz okvira ovog tečaja; počnite samo s frame-ancestors.
U Caddyju ih postavljate direktivom header u bloku stranice:
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 sam ne postavlja HSTS ni ova zaglavlja; morate ih dakle zaista dodati. -Server uklanja zaglavlje Server. U lekciji 9.4 u istoj vrsti bloka postavit ćete vlastito zaglavlje X-Weboke-Cursus za zadatak.
U nginxu ista pravila stavljate u blok server za priključak 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 osigurava da se šalju i uz stranice s pogreškama. Pazite na poznatu zamku nginxa: ako u bloku location postoji makar jedan vlastiti add_header, pravila add_header iz bloka server više ne vrijede za tu location. Zato uvijek provjerite rezultat:
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: kako Vam netko može prijaviti propust
Zamislite da netko pronađe propust na Vašem poslužitelju, na primjer otvorenu mapu ili zastarjelu uslugu. Kako ta osoba zna koga treba upozoriti? Za to služi security.txt (RFC 9116): mala tekstna datoteka na stalnom mjestu, 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.txtPravila:
Contactje obavezan: adresamailto:,https://ilitel:na koju stižu prijave. Koristite adresu koju netko zaista čita.Expiresje obavezan i smije se pojaviti samo jednom: datum nakon kojeg se datoteka smatra zastarjelom. RFC preporučuje datum unutar godine dana. Tako ne ostaje datoteka s davno zaboravljenom adresom. Zabilježite u kalendar kada je trebate produljiti.Preferred-Languages,CanonicaliPolicy(poveznica na Vaša pravila za prijave) nisu obavezni.- Datoteka se mora isporučivati preko https-a, kao običan tekst (
text/plain, UTF-8). Staro mjesto/security.txtsmije se koristiti dodatno, ali/.well-known/ima prednost.
Postavljanje kod statične stranice:
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-8Ako u nginxu koristite sigurnosnu mrežu location ~ /\. { deny all; } iz lekcije 7.2, ispred nje dodajte iznimku: location ^~ /.well-known/ { }. Za aplikaciju iza reverse proxyja u Caddyju možete putanju /.well-known/security.txt usmjeriti na datoteku pomoću bloka handle i file_server.
Česta pogreška: stranica ili aplikacija koja na svaku nepoznatu putanju odgovara naslovnom stranicom i statusom 200. Tada security.txt "postoji", ali je to HTML. Zato provjerite i sadržaj.
Na AlmaLinuxu i Rocky Linuxu
Caddy se tamo instalira iz repozitorija autora ili iz EPEL/COPR. Kao i kod nginxa, SELinux mora dopustiti reverse proxy (setsebool -P httpd_can_network_connect 1). Caddyfile i zaglavlja su isti.
Sažetak
- Caddy sam rješava certifikate, obnavljanje i preusmjeravanje na https;
reverse_proxyautomatski prosljeđuje ispravna zaglavlja. - HSTS tjera preglednike da zapamte da je Vaša stranica samo na https-u; postupno povećavajte
max-age, budite oprezni sincludeSubDomainsi vrlo oprezni spreload. - Uz to postavite
X-Content-Type-Options: nosniff,frame-ancestors 'self'iReferrer-Policy; u Caddyju sheader, u nginxu sadd_header ... always, i provjerite scurl -I. - security.txt nalazi se na
/.well-known/security.txt, preko https-a, kao običan tekst, s obaveznimContacti jednimExpiresunutar godine dana.
Kviz
Zadatak
Zadatak Z7.4: HSTS, zaglavlja i security.txt. Za svoju stranicu postavite HSTS (najmanje 180 dana, nakon što https neko vrijeme dobro radi), X-Content-Type-Options: nosniff i frame-ancestors 'self' (ili X-Frame-Options) te objavite security.txt s Contact i Expires unutar godine dana. Unesite naziv svog hosta. Program preuzima https://<hostnaam>/ i provjerava zaglavlja, a zatim preuzima https://<hostnaam>/.well-known/security.txt i provjerava polja. Ne sprema ništa osim rezultata i datuma Expires.
Dodatno štivo
- HSTS i sigurnosna zaglavlja za Vašu web stranicu
- Caddy, Automatic HTTPS: https://caddyserver.com/docs/automatic-https
- Caddy, direktiva header: https://caddyserver.com/docs/caddyfile/directives/header
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797.html
- Popis za HSTS preload i zahtjevi: https://hstspreload.org/
- RFC 9116, security.txt: https://www.rfc-editor.org/rfc/rfc9116.html
- securitytxt.org (izrada i provjera): https://securitytxt.org/
- Postavljanje datoteke security.txt na Vašu web stranicu
- VPS: od prve prijave do sigurnog poslužitelja 5.1: Caddy: web-stranica s automatskim https-om
