7 modulis · 7.4
Caddy, HSTS ir security.txt
7 modulis: Domenas, žiniatinklio serveris ir https · Skaitymo laikas: 12 min.
Mokymosi tikslas: Po šios pamokos galėsite naudoti Caddy kaip paprastą žiniatinklio serverį su automatiniu https, nustatyti HSTS ir svarbiausias saugumo antraštes (Caddy ir nginx) taip, kad Jūsų svetainė netaptų nepasiekiama, ir paskelbti galiojantį security.txt failą.
Pagrindinės sąvokos: Caddy, Caddyfile, automatinis 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 be rūpesčių
7.2 ir 7.3 pamokose su nginx ir certbot sukūrėte svetainę su https. Tai dvi programos, keli failai ir laikmatis. Caddy viską atlieka viena programa: tai žiniatinklio serveris su įtaisytu ACME klientu. Jei konfigūracijoje nurodytas vardas, jis rodo į serverį, o 80 ir 443 prievadai pasiekiami, Caddy pats gauna sertifikatą, laiku jį atnaujina ir nukreipia http į https.
Caddy yra Debian ir Ubuntu paketų saugykloje (šiek tiek senesnė versija); kūrėjai taip pat siūlo savo apt saugyklą su naujausia versija, su atskiru raktu ir Signed-By, kaip 4.1 pamokoje. 9 modulyje Caddy veiks kaip konteineris Jūsų Docker paslaugoms (9.4 pamoka). Čia jį naudosite kaip įprastą paslaugą.
anna@web1:~$ sudo apt install caddy
anna@web1:~$ systemctl status caddy80 ir 443 prievaduose naudokite arba nginx, arba Caddy, ne abu kartu: prievadu gali klausytis tik viena programa.
Caddyfile
Konfigūracija yra /etc/caddy/Caddyfile. Statinė svetainė ir programa už atvirkštinio tarpinio serverio (reverse 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
}Tai viskas. Caddy automatiškai klausosi IPv4 ir IPv6, užsako sertifikatus trims vardams, nukreipia http į https, o su reverse_proxy automatiškai perduoda antraštes X-Forwarded-For ir X-Forwarded-Proto (tai, ką nginx atlikote rankiniu būdu, 7.2 pamoka).
Tikrinama ir perkraunama taip pat kaip nginx:
anna@web1:~$ caddy validate --config /etc/caddy/Caddyfile
Valid configuration
anna@web1:~$ sudo systemctl reload caddy
anna@web1:~$ sudo journalctl -u caddy -fŽurnale (journal) matysite, kaip gaunami sertifikatai. Jei kas nors nepavyksta, ten nurodyta priežastis: dažniausiai ta pati kaip su certbot (uždarytas 80 prievadas, vardas rodo kitur, neveikia IPv6; 7.3 pamoka).
HSTS: kad naršyklė įsimintų, jog tai https
Nukreipimas iš http į https turi vieną silpną vietą: pati pirmoji užklausa per http dar siunčiama nešifruota. Kas nors tame pačiame tinkle gali ją perimti ir palikti lankytoją naudotis http. HSTS (HTTP Strict Transport Security, RFC 6797) šią problemą išsprendžia. Jūsų svetainė per https siunčia šią antraštę:
Strict-Transport-Security: max-age=31536000Tada naršyklė metus (31.536.000 sekundžių) įsimena, kad šis vardas pasiekiamas tik per https. Jei lankytojas vėliau įveda http://, naršyklė pati paverčia tai į https dar prieš ką nors siųsdama tinklu. HSTS antraštę, gautą per http, naršyklė ignoruoja; ji galioja tik gauta per https.
Yra ir kita pusė. Jei naršyklė įsiminė HSTS ir pamato sertifikato klaidą (pasibaigęs galiojimas, neteisingas vardas), lankytojas negauna mygtuko vis tiek tęsti. Tokiems lankytojams Jūsų svetainė bus nepasiekiama, kol sertifikatas nebus tvarkingas. Todėl:
- Įjunkite HSTS tik tada, kai https veikia visur, o atnaujinimas vyksta automatiškai (7.3 pamoka).
- Pradėkite nuo trumpo
max-age, pavyzdžiui, vienos dienos (86400), ir palaipsniui didinkite iki metų. - Būkite atsargūs su
includeSubDomains: tai galioja kiekvienam subdomenui, taip pat senam subdomenui su įrenginiu ar paslauga be galiojančio sertifikato. preloadprašo įtraukti į sąrašą, įtaisytą naršyklėse (hstspreload.org). Tam, be kita ko, reikalaujamamax-agebent metams,includeSubDomainsir https visuose subdomenuose. Pašalinimas iš sąrašo trunka mėnesius. Darykite tai tik tada, kai esate tikri, kad visas domenas visam laikui naudos https.
Kitos saugumo antraštės
Be HSTS, yra kelios antraštės, kurios su mažomis pastangomis labai padeda:
| Antraštė | Nuo ko apsaugo | Pradinė reikšmė |
|---|---|---|
X-Content-Type-Options | naršyklė spėlioja, koks tai failas, todėl įkeltas „paveikslėlis“ gali būti vykdomas kaip scenarijus | nosniff |
Content-Security-Policy: frame-ancestors (arba senesnė X-Frame-Options) | clickjacking: kita svetainė nematomai įkelia Jūsų puslapį į rėmelį | frame-ancestors 'self' (arba X-Frame-Options: SAMEORIGIN) |
Referrer-Policy | Jūsų puslapio adresas (su paieškos žodžiais ar užsakymų numeriais) nuteka į kitas svetaines | strict-origin-when-cross-origin |
Pilna Content-Security-Policy (kokius scenarijus ir stilius leidžiama įkelti) kiekvienai svetainei kuriama individualiai ir nepatenka į šio kurso apimtį; pradėkite tik nuo frame-ancestors.
Caddy jas nustatote su header direktyva svetainės bloke:
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 pats nenustato HSTS ir šių antraščių, todėl jas tikrai turite įrašyti. -Server pašalina antraštę Server. 9.4 pamokoje tokio paties tipo bloke užduočiai nustatysite savo antraštę X-Weboke-Cursus.
Naudodami nginx, tas pačias eilutes įrašykite į server bloką 443 prievadui:
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 užtikrina, kad jos būtų siunčiamos ir su klaidų puslapiais. Atkreipkite dėmesį į žinomą nginx spąstą: jei location bloke yra bent viena add_header, server bloko add_header eilutės tam location nebegalioja. Todėl visada patikrinkite 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: kaip Jums gali pranešti apie spragą
Tarkime, kas nors Jūsų serveryje randa spragą, pavyzdžiui, atvirą katalogą ar pasenusią paslaugą. Iš kur tas asmuo žinos, ką įspėti? Tam skirtas security.txt (RFC 9116): nedidelis tekstinis failas nustatytoje vietoje, 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.txtTaisyklės:
Contactyra privalomas:mailto:,https://arbatel:adresas, kuriuo gaunami pranešimai. Naudokite adresą, kurį kas nors tikrai skaito.Expiresyra privalomas ir gali būti nurodytas tik vieną kartą: data, po kurios failas laikomas pasenusiu. RFC rekomenduoja datą ne vėliau kaip po metų. Taip neliks failo su seniai pamirštu adresu. Pasižymėkite kalendoriuje, kada jį reikės pratęsti.Preferred-Languages,CanonicalirPolicy(nuoroda į Jūsų pranešimų politiką) yra neprivalomi.- Failas turi būti pateikiamas per https, kaip paprastas tekstas (
text/plain, UTF-8). Senoji vieta/security.txtleidžiama kaip papildoma, bet pirmenybė teikiama/.well-known/.
Įdėjimas statinėje svetainėje:
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-8Jei nginx naudojate apsauginę taisyklę location ~ /\. { deny all; } iš 7.2 pamokos, prieš ją įrašykite išimtį: location ^~ /.well-known/ { }. Programai už atvirkštinio tarpinio serverio Caddy galite nukreipti kelią /.well-known/security.txt į failą naudodami handle bloką ir file_server.
Dažna klaida: svetainė ar programa į kiekvieną nežinomą kelią atsako pagrindiniu puslapiu ir būsena 200. Tada security.txt „egzistuoja“, bet yra HTML. Todėl patikrinkite ir turinį.
AlmaLinux ir Rocky Linux
Ten Caddy gaunamas iš kūrėjų saugyklos arba iš EPEL/COPR. Kaip ir su nginx, SELinux turi leisti atvirkštinį tarpinį serverį (setsebool -P httpd_can_network_connect 1). Caddyfile ir antraštės yra tokios pačios.
Santrauka
- Caddy pats tvarko sertifikatus, jų atnaujinimą ir nukreipimą į https;
reverse_proxyautomatiškai perduoda tinkamas antraštes. - HSTS leidžia naršyklėms įsiminti, kad Jūsų svetainė veikia tik per https; didinkite
max-agepalaipsniui, būkite atsargūs suincludeSubDomainsir labai atsargūs supreload. - Papildomai nustatykite
X-Content-Type-Options: nosniff,frame-ancestors 'self'irReferrer-Policy; Caddy suheader, nginx suadd_header ... always, ir patikrinkite sucurl -I. - security.txt yra
/.well-known/security.txt, pasiekiamas per https, kaip paprastas tekstas, su privalomuContactir vienuExpiresne vėliau kaip po metų.
Testas
Užduotis
Užduotis Z7.4: HSTS, antraštės ir security.txt. Savo svetainei nustatykite HSTS (bent 180 dienų, kai https jau kurį laiką gerai veikia), X-Content-Type-Options: nosniff ir frame-ancestors 'self' (arba X-Frame-Options) ir paskelbkite security.txt su Contact ir Expires ne vėliau kaip po metų. Įveskite savo serverio vardą. Programa gauna https://<hostnaam>/ ir patikrina antraštes, gauna https://<hostnaam>/.well-known/security.txt ir patikrina laukus. Ji nieko neišsaugo, išskyrus rezultatą ir Expires datą.
Skaitykite daugiau
- HSTS ir saugumo antraštės Jūsų svetainei
- Caddy, Automatic HTTPS: https://caddyserver.com/docs/automatic-https
- Caddy, header direktyva: https://caddyserver.com/docs/caddyfile/directives/header
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797.html
- HSTS preload sąrašas ir reikalavimai: https://hstspreload.org/
- RFC 9116, security.txt: https://www.rfc-editor.org/rfc/rfc9116.html
- securitytxt.org (sukūrimas ir patikra): https://securitytxt.org/
