7. modulis · 7.4
Caddy, HSTS un security.txt
7. modulis: Domēns, tīmekļa serveris un https · Lasīšanas laiks: 12 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet izmantot Caddy kā vienkāršu tīmekļa serveri ar automātisku https, iestatīt HSTS un svarīgākās drošības galvenes (Caddy un nginx), nepadarot vietni nepieejamu, un publicēt derīgu security.txt.
Pamatjēdzieni: Caddy, Caddyfile, automātisks 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 rūpēm
Nodarbībās 7.2 un 7.3 Jūs ar nginx un certbot izveidojāt vietni ar https. Tās ir divas programmas, daži faili un taimeris. Caddy to visu dara vienā: tas ir tīmekļa serveris ar iebūvētu ACME klientu. Ja konfigurācijā ir norādīts nosaukums, tas norāda uz serveri un porti 80 un 443 ir sasniedzami, Caddy pats iegūst sertifikātu, savlaicīgi to atjauno un pāradresē http uz https.
Caddy ir pieejams Debian un Ubuntu pakotņu avotā (nedaudz vecāka versija); izstrādātāji piedāvā arī savu apt avotu ar jaunāko versiju, ar savu atslēgu un Signed-By, kā nodarbībā 4.1. Modulī 9 Caddy darbojas kā konteiners Jūsu Docker pakalpojumiem (nodarbība 9.4). Šeit Jūs to izmantojat kā parastu pakalpojumu.
anna@web1:~$ sudo apt install caddy
anna@web1:~$ systemctl status caddyIzmantojiet portos 80 un 443 vai nu nginx, vai Caddy, ne abus: portā var klausīties tikai viena programma.
Caddyfile
Konfigurācija atrodas failā /etc/caddy/Caddyfile. Statiska vietne un lietotne aiz reversā starpniekservera:
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
}Tas arī viss. Caddy pats klausās IPv4 un IPv6, pieprasa sertifikātus trim nosaukumiem, pāradresē http uz https un ar reverse_proxy pats nodod galvenes X-Forwarded-For un X-Forwarded-Proto (ko nginx Jūs darījāt ar roku, nodarbība 7.2).
Pārbaude un pārlādēšana notiek tāpat kā nginx:
anna@web1:~$ caddy validate --config /etc/caddy/Caddyfile
Valid configuration
anna@web1:~$ sudo systemctl reload caddy
anna@web1:~$ sudo journalctl -u caddy -fŽurnālā (journal) redzama sertifikātu iegūšana. Ja kaut kas neizdodas, tur ir norādīts iemesls: parasti tas pats, kas ar certbot (ports 80 slēgts, nosaukums norāda citur, IPv6 nedarbojas; nodarbība 7.3).
HSTS: lai pārlūks atceras, ka tas ir https
Pāradresācijai no http uz https ir viens vājš brīdis: pats pirmais pieprasījums caur http vēl tiek sūtīts nešifrēts. Kāds tajā pašā tīklā to var pārtvert un paturēt apmeklētāju uz http. HSTS (HTTP Strict Transport Security, RFC 6797) to atrisina. Jūsu vietne caur https nosūta šo galveni:
Strict-Transport-Security: max-age=31536000Tad pārlūks gadu (31.536.000 sekundes) atceras, ka šim nosaukumam drīkst piekļūt tikai caur https. Ja apmeklētājs vēlāk ieraksta http://, pārlūks pats to pārvērš par https, vēl pirms kaut kas tiek nosūtīts tīklā. HSTS galveni, kas saņemta caur http, pārlūks ignorē; tā ir spēkā tikai caur https.
Tam ir arī ēnas puse. Ja pārlūks ir atcerējies HSTS un redz sertifikāta kļūdu (beidzies derīgums, nepareizs nosaukums), apmeklētājs nesaņem pogu, lai tomēr turpinātu. Tad Jūsu vietne šiem apmeklētājiem ir nepieejama, līdz sertifikāts ir kārtībā. Tāpēc:
- Ieslēdziet HSTS tikai tad, kad https darbojas visur un atjaunošana notiek automātiski (nodarbība 7.3).
- Sāciet ar īsu
max-age, piemēram, vienu dienu (86400), un pakāpeniski palieliniet līdz gadam. - Esiet piesardzīgi ar
includeSubDomains: tas attiecas uz katru apakšdomēnu, arī uz vecu apakšdomēnu ar ierīci vai pakalpojumu bez derīga sertifikāta. preloadlūdz iekļaušanu sarakstā, kas ir iebūvēts pārlūkos (hstspreload.org). Tam cita starpā prasamax-agevismaz uz gadu,includeSubDomainsun https visos apakšdomēnos. Izņemšana no saraksta aizņem mēnešus. Dariet to tikai tad, ja esat pārliecināti, ka viss domēns uz visiem laikiem ir https.
Citas drošības galvenes
Bez HSTS ir dažas galvenes, kas ar nelielu piepūli daudz palīdz:
| Galvene | Pret ko | Sākotnējā vērtība |
|---|---|---|
X-Content-Type-Options | pārlūks sāk minēt, kas ir fails, tāpēc augšupielādēts "attēls" var izpildīties kā skripts | nosniff |
Content-Security-Policy: frame-ancestors (vai vecākā X-Frame-Options) | clickjacking: cita vietne neredzami ielādē Jūsu lapu rāmī | frame-ancestors 'self' (vai X-Frame-Options: SAMEORIGIN) |
Referrer-Policy | Jūsu lapas adrese (ar meklēšanas vārdiem vai pasūtījumu numuriem) noplūst uz citām vietnēm | strict-origin-when-cross-origin |
Pilnīga Content-Security-Policy (kādus skriptus un stilus drīkst ielādēt) ir katrai vietnei individuāls risinājums, un tā ir ārpus šī kursa; sāciet tikai ar frame-ancestors.
Caddy tās iestata ar header direktīvu vietnes blokā:
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 neiestata HSTS un šīs galvenes; tās Jums tiešām ir jāieraksta. -Server noņem galveni Server. Nodarbībā 9.4 Jūs tāda paša veida blokā uzdevumam iestatīsiet savu galveni X-Weboke-Cursus.
Nginx tās pašas rindas ievietojiet server blokā portam 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 nodrošina, ka tās tiek nosūtītas arī ar kļūdu lapām. Ievērojiet zināmu nginx slazdu: ja location blokā pašā ir kaut viena add_header, tad server bloka add_header rindas šai location vairs nav spēkā. Tāpēc vienmēr pārbaudiet rezultātu:
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: kā kāds var Jums ziņot par ievainojamību
Pieņemsim, ka kāds atrod ievainojamību Jūsu serverī, piemēram, atvērtu mapi vai novecojušu pakalpojumu. Kā šī persona zina, kuru brīdināt? Tam ir security.txt (RFC 9116): neliels teksta fails noteiktā vietā, 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.txtNoteikumi:
Contactir obligāts:mailto:,https://vaitel:adrese, uz kuru nonāk ziņojumi. Izmantojiet adresi, kuru kāds arī tiešām lasa.Expiresir obligāts un drīkst parādīties tikai vienu reizi: datums, pēc kura fails uzskatāms par novecojušu. RFC iesaka datumu gada laikā. Tā nepaliek fails ar sen aizmirstu adresi. Ierakstiet savā kalendārā, kad tas jāpagarina.Preferred-Languages,CanonicalunPolicy(saite uz Jūsu ziņošanas politiku) nav obligāti.- Failam jābūt pieejamam caur https, kā vienkāršam tekstam (
text/plain, UTF-8). Vecā vieta/security.txtir pieļaujama papildus, taču/.well-known/ir prioritāra.
Ievietošana statiskai vietnei:
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-8Ja nginx izmantojat drošības tīklu location ~ /\. { deny all; } no nodarbības 7.2, ievietojiet pirms tā izņēmumu: location ^~ /.well-known/ { }. Lietotnei aiz reversā starpniekservera Caddy var novirzīt ceļu /.well-known/security.txt uz failu ar handle bloku un file_server.
Bieža kļūda: vietne vai lietotne, kas uz katru nezināmu ceļu atbild ar sākumlapu un statusu 200. Tad security.txt "eksistē", taču tas ir HTML. Tāpēc pārbaudiet arī saturu.
AlmaLinux un Rocky Linux
Tur Caddy iegūst no izstrādātāju avota vai no EPEL/COPR. Tāpat kā ar nginx, SELinux ir jāatļauj reversais starpniekserveris (setsebool -P httpd_can_network_connect 1). Caddyfile un galvenes ir tādas pašas.
Kopsavilkums
- Caddy pats pārvalda sertifikātus, atjaunošanu un pāradresāciju uz https;
reverse_proxypats nodod pareizās galvenes. - HSTS liek pārlūkiem atcerēties, ka Jūsu vietne ir tikai https; palieliniet
max-agepakāpeniski, esiet piesardzīgi arincludeSubDomainsun ļoti piesardzīgi arpreload. - Papildus iestatiet
X-Content-Type-Options: nosniff,frame-ancestors 'self'unReferrer-Policy; Caddy arheader, nginx aradd_header ... always, un pārbaudiet arcurl -I. - security.txt atrodas
/.well-known/security.txt, caur https, kā vienkāršs teksts, ar obligātuContactun vienuExpiresgada laikā.
Tests (quiz)
Uzdevums
Uzdevums Z7.4: HSTS, galvenes un security.txt. Iestatiet savai vietnei HSTS (vismaz 180 dienas, kad https kādu laiku ir labi darbojies), X-Content-Type-Options: nosniff un frame-ancestors 'self' (vai X-Frame-Options) un publicējiet security.txt ar Contact un Expires gada laikā. Ievadiet savu resursdatora nosaukumu. Programma ielādē https://<hostnaam>/ un pārbauda galvenes, kā arī ielādē https://<hostnaam>/.well-known/security.txt un pārbauda laukus. Tā nesaglabā neko, izņemot rezultātu un Expires datumu.
Vairāk lasīt
- HSTS un drošības galvenes Jūsu tīmekļa vietnei
- Caddy, Automatic HTTPS: https://caddyserver.com/docs/automatic-https
- Caddy, header direktīva: https://caddyserver.com/docs/caddyfile/directives/header
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797.html
- HSTS preload saraksts un prasības: https://hstspreload.org/
- RFC 9116, security.txt: https://www.rfc-editor.org/rfc/rfc9116.html
- securitytxt.org (izveide un pārbaude): https://securitytxt.org/
