HSTS и защитни headers за Вашия уебсайт
С всяка страница Вашият уеб сървър изпраща и заглавки (headers): кратки редове с инструкции за браузъра. Те отчасти определят колко сигурно браузърът работи с Вашия сайт. Тук ще прочетете какво е HSTS, какви други заглавки за сигурност съществуват и как да ги настроите и тествате.
Първо Вашият сайт трябва да има работещ сертификат и да пренасочва посетителите към https. Как става това, ще прочетете в Активиране и подновяване на SSL сертификат и отстраняване на проблеми и Задължително пренасочване на посетителите към https.
Какво прави HSTS?
Пренасочването към https има един слаб момент: първата заявка през http все още се изпраща некриптирана. Някой в същата мрежа, например в публичен wifi, може да прихване тази заявка. HSTS (HTTP Strict Transport Security) решава този проблем. Вашият сайт изпраща през https следната заглавка:
Strict-Transport-Security: max-age=31536000
Тогава браузърът запомня, че може да отваря Вашия сайт само през https. Ако по-късно посетител въведе http://, браузърът сам го превръща в https, още преди нещо да бъде изпратено по мрежата. HSTS заглавка, получена през обикновен http, браузърът игнорира.
| Елемент | Значение |
|---|---|
max-age | Колко дълго браузърът помни инструкцията, в секунди. Тестът на internet.nl приема за достатъчен поне една година (31536000). |
includeSubDomains | Важи и за всички поддомейни, например shop.yourdomain.nl и mail.yourdomain.nl. |
preload | Заявявате включване в списъка, вграден в браузърите (hstspreload.org). Тогава дори първото посещение е защитено. За това са необходими, наред с другото, една година, includeSubDomains и https на всички поддомейни. Премахването от списъка отнема дълго време. |
max-age=0 | Изтрива запомнената инструкция при следващото посещение през https. |
includeSubDomains това важи и за всеки поддомейн, например стара страница на камера или принтер без сертификат. Затова въвеждайте го постепенно: започнете с кратък max-age, например един ден (86400), проверете дали всичко работи и увеличавайте на стъпки до една година.HSTS при WebOké
На повечето от нашите сървъри уеб сървърът изпраща HSTS по подразбиране за всеки уебсайт, отворен през https: Strict-Transport-Security: max-age=31536000. Това е една година, без includeSubDomains и без preload. За това не е нужно да правите нищо. На няколко сървъра то не е включено по подразбиране; там го включвате сами. Дали сайтът Ви вече изпраща HSTS и с какъв max-age, можете да видите в инструментите за разработчици на браузъра си или в теста на internet.nl (вижте по-долу).
Превключвателят за HSTS в DirectAdmin
В DirectAdmin отидете в Domain Setup и щракнете върху името на домейна си. Ако Secure SSL е включено, при HSTS ще видите превключвателя Enable HTTP Strict Transport Security. След това щракнете върху Save, за да запазите. Как става това стъпка по стъпка, ще прочетете в Винаги пренасочвайте посетителите към https.
Ако сайтът Ви вече изпраща HSTS, превключвателят не Ви е нужен. Включете го само ако сайтът Ви все още не изпраща HSTS. Настройте HSTS на едно място: в DirectAdmin или в .htaccess, но не и в двете. Ако браузърът получи две HSTS заглавки, той използва само първата.
Другите заглавки за сигурност
| Заглавка | Срещу какво | Начална стойност |
|---|---|---|
X-Content-Type-Options | Браузърът сам отгатва какъв е даден файл, поради което качена „снимка“ може да бъде изпълнена като скрипт. | nosniff (единствената валидна стойност) |
Content-Security-Policy: frame-ancestors или X-Frame-Options | Clickjacking: друг сайт зарежда Вашата страница невидимо във frame, така че посетителите неусетно щракват върху Вашите бутони. | frame-ancestors 'self' или по-старата заглавка X-Frame-Options: SAMEORIGIN |
Referrer-Policy | При щракване към друг сайт браузърът изпраща адреса на предишната страница, понякога с дума за търсене или номер на поръчка в него. | strict-origin-when-cross-origin или по-строгите same-origin или no-referrer. Internet.nl приема за добри само строгите стойности. |
Permissions-Policy | Определя кои функции на браузъра могат да използват Вашата страница и вградените frames, например камера, микрофон и местоположение. | camera=(), microphone=(), geolocation=() изключва тези три. Ако сайтът Ви използва някоя от тези функции, пропуснете я. |
Content-Security-Policy (пълна) | Ограничава откъде могат да се зареждат скриптове, стилове и изображения. Това прави вмъкнатите злонамерени скриптове (XSS) много по-трудни. | Индивидуална настройка за всеки сайт. Избягвайте unsafe-inline, unsafe-eval и wildcards. |
Настройка в .htaccess
Поставете тези редове в началото на файла .htaccess в папката public_html на Вашия домейн. Първо направете копие на файла.
<IfModule mod_headers.c> 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" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Само ако сайтът Ви все още не изпраща HSTS (вижте по-горе): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Добавете includeSubDomains едва когато сте сигурни, че всеки поддомейн има https. Ако използвате WordPress, можете да настроите заглавките и с плъгин. Изберете известен плъгин, който все още се актуализира, и настройте всяка заглавка на едно място: в плъгина или в .htaccess.
Content-Security-Policy-Report-Only. Тя не блокира нищо, но показва в конзолата на браузъра какво би било блокирано. При съмнение оставете това на Вашия уеб разработчик или започнете само с frame-ancestors.На VPS с nginx или Caddy
На VPS не използвате DirectAdmin, а често и .htaccess. В този случай поставяте заглавките в настройките на уеб сървъра си. Никой от двата не изпраща HSTS или тези заглавки автоматично.
nginx: в блока server за порт 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 заглавките се изпращат и при страници за грешки. Внимание: ако в блок location има собствен add_header, правилата от блока server вече не важат за тази location. В такъв случай ги повторете там или ги поставете в отделен файл, който вмъквате навсякъде с include. Тествайте настройките с nginx -t и ги заредете с systemctl reload nginx.
Caddy: в блока на Вашия сайт в Caddyfile:
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"
}
Заредете промяната с systemctl reload caddy. За изграждането на сайт с nginx или Caddy вижте nginx със сертификат от Let's Encrypt и Caddy: уебсайт с автоматичен https в ръководството за VPS.
Тестване
- Internet.nl: въведете домейна си в теста за уебсайтове на internet.nl.
- Вашият браузър: отворете сайта си, натиснете F12 (или изберете Инспектиране), отидете в раздела Мрежа, презаредете страницата и щракнете върху първата заявка. Под Заглавки на отговора (Response Headers) ще видите всичко, което сървърът Ви изпраща.
- Командният ред:
curl -sI https://yourdomain.nl/показва заглавките.
След всяка промяна проверявайте дали сайтът, формулярите и страницата за плащане все още работят. Освен това поддържайте своята CMS, плъгините и темите актуални. Вижте Защита на wp-login.php на WordPress.
Допълнителна информация
- MDN: Strict-Transport-Security (на английски)
- MDN: Content-Security-Policy (на английски)
- MDN: Permissions-Policy (на английски)
- HSTS preload списък (на английски)
Искате да научите повече? Запишете се за безплатния курс „Сигурност онлайн за предприемачи“, урок 4.2 Вашият уебсайт: https, HSTS и заглавки за сигурност, или за безплатния курс по WordPress, урок 7.4 Укрепване на сайта: права, заглавки и плъгини за сигурност.
