Modul 4 · 4.2
Vaša web stranica: https, HSTS i sigurnosna zaglavlja
Modul 4: E-pošta, web stranica i domena · Vrijeme čitanja: 11 minuta
Cilj učenja: Nakon ove lekcije moći ćete provjeriti osnovnu sigurnost svoje web stranice: valjani certifikat, preusmjeravanje na https, HSTS s dobrim max-age, najvažnija sigurnosna zaglavlja i ažuriranje Vašeg CMS-a.
Ključni pojmovi: TLS certifikat, https, preusmjeravanje na https, HSTS, max-age, includeSubDomains, preload, HTTP zaglavlje, Content-Security-Policy, X-Content-Type-Options, frame-ancestors, X-Frame-Options, Referrer-Policy
Što se događa kad netko otvori Vašu stranicu
Kad klijent u adresnu traku upiše example.com, preglednik zatraži stranicu od Vašeg web poslužitelja. Ta komunikacija odvija se putem HTTP-a. Kod https ta je veza šifrirana: TLS. Za to je Vašoj web stranici potreban TLS certifikat (često se još naziva SSL certifikat). Certifikat dokazuje da poslužitelj doista pripada domeni example.com, a šifriranje osigurava da nitko usput ne može čitati ili mijenjati podatke. To je važno na javnom Wi-Fi-ju, gdje ne znate tko upravlja mrežom (lekcija 5.3).
Uz svaki odgovor poslužitelj, osim same stranice, šalje i niz zaglavlja: kratke retke s informacijama i uputama za preglednik. Njih ne vidite na zaslonu, ali uvelike određuju koliko sigurno preglednik postupa s Vašom stranicom. Dio tih zaglavlja čine sigurnosna zaglavlja. U ovoj lekciji proći ćemo kroz četiri razine: certifikat, preusmjeravanje, HSTS i zaglavlja. Zatim ćemo ukratko pogledati ažuriranje same web stranice.
Razina 1: valjani certifikat
Certifikat je ispravan ako zadovoljava tri uvjeta:
- nije istekao;
- izdao ga je pouzdani izdavatelj (certifikacijsko tijelo koje preglednici prepoznaju, poput Let's Encrypt ili komercijalnog pružatelja);
- vrijedi za točno onaj naziv koji posjetitelj otvara:
example.comiwww.example.comako koristite oba.
Gotovo svaki pružatelj hostinga danas automatski osigurava besplatan certifikat koji se sam obnavlja. Ako nešto krene po zlu, obično je razlog taj što naziv domene pokazuje na drugi poslužitelj, ili što CAA zapis blokira izdavatelja (lekcija 4.3).
Važno je znati: lokot u adresnoj traci ništa ne govori o pouzdanosti stranice. On samo znači da je veza šifrirana i da certifikat odgovara nazivu u adresnoj traci. Phishing stranice na mijnbank-veilig.example jednako tako imaju lokot. Zato u lekciji 3.2 učite kako čitati domenu.
Razina 2: uvijek preusmjeriti na https
Sam certifikat nije dovoljan. Tko otvori http://example.com, primjerice putem starog poveznice ili jednostavnim upisivanjem naziva, mora automatski biti preusmjeren na https verziju. To se naziva preusmjeravanje (redirect, obično sa statusnim kodom 301).
Ispravan redoslijed izgleda ovako:
http://example.com -> https://example.com
https://example.com -> https://www.example.com (samo ako www koristite kao glavnu adresu)
http://www.example.com -> https://www.example.comObratite pažnju na prvi redak: s http prvo preusmjerite na https na istom nazivu, tek zatim eventualno na www. Tako preglednik može primiti HSTS uputu i na goloj domeni. Internet.nl upravo to provjerava.
Česta je pogreška dvostruko preusmjeravanje: u hosting panelu i u dodatku (pluginu) ili u .htaccess datoteci. To može izazvati beskonačnu petlju ("previše preusmjeravanja"). Koristite samo jedno mjesto.
Razina 3: HSTS
Preusmjeravanje ima slabu točku: sam prvi zahtjev još uvijek ide nešifrirano putem http-a. Napadač na istoj mreži može presresti upravo taj zahtjev i zadržati posjetitelja na lažnoj, nešifriranoj verziji. Za to postoji HSTS (HTTP Strict Transport Security, RFC 6797).
Uz HSTS Vaša stranica putem https-a šalje zaglavlje:
Strict-Transport-Security: max-age=31536000; includeSubDomainsPreglednik tada pamti: "ovu stranicu otvaraj isključivo putem https-a, sljedećih 31.536.000 sekundi (godinu dana)". Ako posjetitelj kasnije upiše http://example.com, preglednik sam to pretvara u https, prije nego što bilo što ode preko mreže. Slabi prvi zahtjev time otpada.
| Dio | Značenje |
|---|---|
max-age= | Koliko dugo preglednik pamti uputu, u sekundama. Internet.nl smatra dovoljnim najmanje godinu dana (max-age=31536000); kratko razdoblje ne štiti osobe koje Vašu stranicu posjećuju samo povremeno. |
includeSubDomains | Vrijedi i za sve poddomene, poput shop.example.com i mail.example.com. |
preload | Tražite uvrštenje u popis ugrađen u preglednike (hstspreload.org). Tada je zaštićen čak i prvi posjet. Uvjeti uključuju: max-age od najmanje godinu dana, includeSubDomains i sve poddomene na https-u. Uklanjanje s popisa traje dugo. |
max-age=0 | Briše zapamćenu uputu. |
Tri stvari koje morate znati prije nego što uključite HSTS:
- Https prvo mora raditi posvuda. Preglednik koji je zapamtio HSTS, a naiđe na grešku certifikata, posjetitelju ne nudi gumb za nastavak unatoč tome (RFC 6797, odlomak 12.1). Ako Vaš certifikat istekne ili ne odgovara za
www, stranica postaje nedostupna tim posjetiteljima dok se problem ne riješi. includeSubDomainsutječe na sve ispod Vaše domene. Stara poddomena bez certifikata, primjerice stranica pisača ili kamere nacamera.example.com, nakon toga više se ne može otvoriti.- Gradite postupno. Počnite s kratkim
max-age(primjerice jedan dan), provjerite radi li sve ispravno, pa postupno povećavajte do godinu dana. Kod svakog koraka pričekajte da prođe cijelo razdoblje.
HSTS zaglavlje koje stigne putem običnog http-a preglednik zanemaruje. Vidjet ćete ga, dakle, samo u https odgovoru.
Razina 4: sigurnosna zaglavlja
Osim HSTS-a postoji nekoliko zaglavlja koja pregledniku govore što smije, a što ne smije činiti s Vašim stranicama. Ne morate ih sve imati savršeno postavljene, no prva tri jednostavna su i bez rizika.
| Zaglavlje | Protiv čega | Dobra vrijednost |
|---|---|---|
X-Content-Type-Options | Preglednik sam nagađa što je neka datoteka, zbog čega se učitana "slika" može izvršiti kao skripta. | nosniff (jedina valjana vrijednost) |
Content-Security-Policy: frame-ancestors ... ili X-Frame-Options | Clickjacking: druga stranica nevidljivo učitava Vašu stranicu u okviru (frame) i navodi posjetitelje da neprimjetno kliknu na Vaše gumbe. | frame-ancestors 'self' ili 'none'; starije zaglavlje X-Frame-Options: SAMEORIGIN ili DENY |
Referrer-Policy | Kod klika na drugu stranicu preglednik šalje adresu prethodne stranice. U njoj se mogu nalaziti osjetljivi podaci, poput pojma za pretraživanje ili broja narudžbe. | no-referrer ili same-origin (strogo), strict-origin-when-cross-origin (uobičajeno, internet.nl ovdje daje upozorenje) |
Content-Security-Policy (potpuna) | Ograničava s kojih se mjesta smiju učitavati skripte, stilovi i slike. Znatno otežava ubacivanje zlonamjernih skripti (XSS). | Prilagođava se svakoj stranici posebno. Izbjegavajte unsafe-inline, unsafe-eval i zamjenske znakove (wildcards). |
Potpuna Content-Security-Policy najsnažnija je, ali i najsloženija: prestrogo pravilo može pokvariti Vašu statistiku, gumb za plaćanje ili prozor za chat. Varijantom Content-Security-Policy-Report-Only možete najprije izmjeriti što bi bilo blokirano, bez da bilo što pokvarite. To prepustite svom izrađivaču web stranice, ili počnite samo s frame-ancestors.
Samostalni pregled zaglavlja
Otvorite svoju stranicu u pregledniku, pritisnite F12 (ili odaberite "Inspektiraj"), idite na karticu Mreža (Network), ponovno učitajte stranicu i kliknite na prvi zahtjev. Pod "Odgovor zaglavlja" (Response Headers) vidite sve što poslužitelj šalje. To je moguće i putem naredbenog retka:
curl -sI https://example.com/Sama web stranica: CMS, dodaci i teme
Najbolja zaglavlja ne pomažu ako je softver iza Vaše stranice ranjiv. Većina hakiranih stranica malih poduzeća nije probijena preko web poslužitelja, nego putem zastarjelog dodatka (plugina), teme koja se godinama ne ažurira, ili slabe administratorske lozinke.
- Uključite automatska ažuriranja za Vaš CMS (primjerice WordPress, Joomla ili drugi sustav) i za dodatke gdje je to moguće.
- Uklonite dodatke i teme koje ne koristite; onemogućeno nije dovoljno, datoteke i dalje postoje na poslužitelju.
- Za administratorsku prijavu koristite jaku, jedinstvenu lozinku i dvofaktorsku autentifikaciju (modul 2), te ograničite broj pokušaja prijave.
- Držite verziju PHP-a (ili drugog jezika) Vašeg paketa na verziji koja još prima ažuriranja (lekcija 5.1).
U praksi: ovako to izgleda
U DirectAdmin, panelu koji koristi WebOké, kod svoje domene najprije uključite Secure SSL, a zatim Force SSL with https redirect. Na istom se mjestu nalazi prekidač za HSTS; njega uključite tek kada certifikat radi za sve nazive. Kod drugih pružatelja postupak je sličan, ili to podesite u postavkama svog CMS-a.
Ako Vaša stranica radi na Apache ili LiteSpeed poslužitelju, zaglavlja možete postaviti i u .htaccess datoteci:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000"
Header always set X-Content-Type-Options "nosniff"
Header always set Content-Security-Policy "frame-ancestors 'self'"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>includeSubDomains dodajte tek kada ste sigurni da svaka poddomena ima https. Nakon svake promjene provjerite pomoću testa web stranice na internet.nl ili pomoću razvojnih alata svog preglednika.
Sažetak
- Lokot znači: šifrirano i ispravan naziv. Ne znači: pouzdano.
- Http uvijek preusmjerite na https, prvo na istom nazivu, i to na jednom mjestu.
- HSTS omogućuje pregledniku da zapamti da Vaša stranica ide isključivo putem https-a; internet.nl smatra dobrim
max-ageod najmanje godinu dana (31536000). Uključite ga tek kada https posvuda radi, i gradite postupno. X-Content-Type-Options: nosniff,frame-ancestors(iliX-Frame-Options) iReferrer-Policyjednostavni su; potpuna Content-Security-Policy prilagođava se svakom slučaju posebno.- Ažuriranja Vašeg CMS-a, dodataka i tema barem su jednako važna kao i zaglavlja.
Kviz
Zadatak
Zadatak A4.2: Provjera https, HSTS i zaglavlja Vaše web stranice. Unesite naziv domene svoje web stranice (ako je nemate, koristite internet.nl). Program otvara http:// i https:// verziju Vaše domene i provjerava certifikat, preusmjeravanje na https, HSTS i sigurnosna zaglavlja. Za svaku stavku dobivate oznaku zeleno, narančasto ili crveno, s objašnjenjem.
Zadatak D4.2: Ažuriranje i čišćenje Vaše web stranice. Prijavite se u administraciju svoje web stranice, provjerite verziju CMS-a, dodataka i tema, uklonite ono što ne koristite i uključite automatska ažuriranja gdje je to moguće. Označite stavke na popisu za provjeru i odgovorite na pitanje za razmišljanje.
Zadatak D4.2: Ažuriranje i čišćenje Vaše web stranice
Pristupite ovako: (1) Prijavite se u administraciju Vaše web stranice (ili zamolite izrađivača web stranice da to učini zajedno s Vama). (2) Zabilježite verziju Vašeg CMS-a i provjerite postoje li dostupna ažuriranja. (3) Izradite sigurnosnu kopiju (lekcija 6.1), instalirajte ažuriranja CMS-a, dodataka i tema. (4) Uklonite dodatke i teme koje ne koristite. (5) Uključite automatska ažuriranja gdje je to moguće. (6) Provjerite koji administratorski računi postoje i uklonite račune osoba koje više ne rade kod Vas. (7) Uključite dvofaktorsku autentifikaciju za svaki administratorski račun.
Vaše kvačice i bilješke ostaju samo u ovom pregledniku; ne šaljemo ih nikamo. Ako ste prijavljeni, u Moji tečajevi čuvamo samo podatak da ste zadatak završili.
Dodatna literatura
Koraci opisani u WebOké člancima vrijede za okruženje WebOké; kod drugih pružatelja postupak je sličan.
- Aktiviranje, obnavljanje i rješavanje problema sa SSL certifikatom
- Obavezno preusmjeravanje posjetitelja na https
- DirectAdmin priručnik 6.4: Posjetitelje uvijek usmjerite na https
- DirectAdmin priručnik 6.7: Nema lokota ili 'nije sigurno': rješavanje mješovitog sadržaja
- DirectAdmin priručnik 15.10: Web Application Firewall
- Zaštita datoteke wp-login.php u WordPressu
- Internet.nl, test web stranice (neovisan): https://internet.nl
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797
- Popis za HSTS preload: https://hstspreload.org
- MDN, objašnjenje zaglavlja (na engleskom): https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security
