![]() |
Просканить/проверить заголовки можно на сайте https://securityheaders.com
Если рейтинг ниже «А», то следует настроить заголовки отмеченные красным, кроме Permissions-Policy. Пример конфигураøии в .htaccess source: Код:
Пример конфигураøии Nginx source: Код:
## CSPРассмотрим более подробно каждый заголовок. HTTP Strict Transport Security https://developer.mozilla.org/ru/doc...sport-Security Цитата: HTTP Strict-Transport-Security - заголовок ответа (часто используется аббревиатура HSTS (en-US)), позволяющий web-сайтам уведомить браузер о том, что доступ к ним должен быть осуществлён только посредством HTTPS вместо HTTP. Заголовок HSTS (HTTP Strict Transport Security) гарантирует, что весь обмен данными из браузера осуществляется по протоколу HTTPS (HTTP Secure). Это предотвращает попытки обойти HTTPS и перенаправляет все HTTP запросы на HTTPS. Перед тем, как добавлять этот заголовок, убедитесь в том, что все страницы сайта доступны по HTTPS, иначе они не будут отображаться. Заголовок HSTS совместим с последними версиями большинства браузеров (IE, Firefox, Opera, Safari и Chrome). Всего есть три параметра конфигурации. Кстати, если вы используете cloudflare, там есть опция автоматической переадресации на https. max-age Интервал (в секундах) для указания браузеру, что запросы следует отправлять только через HTTPS. includeSubDomains Конфигурация распространяется на поддомены. preload Используйте, если хотите добавить домен в предопределенный список HSTS В качестве примера давайте настроим HSTS на год и добавим домен и поддомены в предопределенный список HSTS. Apache Чтобы использовать HSTS в Apache, добавьте в файл httpd.conf следующую запись: source: Код:
HeaderNginx Чтобы настроить HSTS в Nginx, добавьте следующую запись в nginx.conf в директиве Server (SSL): source: Код:
add_headerCloud Flare Если вы используете Cloud Flare, то включить HSTS можно всего за пару кликов мыши.
https://developer.mozilla.org/ru/doc...XSS-Protection Цитата: Заголовок ответа HTTP X-XSS-Protection это особенность Internet Explorer, Chrome и Safari, которая останавливает загрузку страниц при обнаружении (XSS (en-US)) атаки. Хотя эти меры защиты не требуются в большинстве случаев для современных браузеров, когда сайты внедряют сильную политику безопасности контента Content-Security-Policy (en-US), которая отключает использование встроенного JavaScript ('unsafe-inline'), они могут обеспечить защиту для пользователей, использующих устаревшие версии браузеров, не поддерживающих CSP. Заголовок X-XSS-Protection может предотвратить некоторые XSS-атаки («межсайтовый скриптинг»), он совместим с IE 8+, Chrome, Opera, Safari и Android. Google, Facebook, Github используют этот заголовок, и большинство консультантов по предупреждению проникновений порекомендуют Вам его использовать. Всего существует четыре варианта конфигурации: 0 XSS-фильтр выключен 1 XSS-фильтр включен, и, в случае обнаружения атаки, страница подвергается цензуре 1;mode=block XSS-фильтр включен, и, в случае обнаружения атаки, предотвращает обработку страницы 1;report=http://example.com/report_URI XSS-фильтр включен, и, в случае обнаружения атаки, отправляется отчет о нарушении Давайте используем 1;mode=block для следующих веб-серверов. Apache Добавьте следующую запись в httpd.conf вашего сервера Apache: source: Код:
HeaderNginx Добавьте следующее в nginx.conf в разделе HTTP: source: Код:
add_header X-XSS-ProtectionНу и, понятно что можно использовать просто функцию header в PHP: PHP highlight Код:
X-Frame-Options https://developer.mozilla.org/en-US/...-Frame-Options Цитата: The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a , , or . Sites can use this to avoid click-jacking attacks, by ensuring that their content is not embedded into other sites. The added security is provided only if the user accessing the document is using a browser that supports X-Frame-Options. Заголовок X-Frame-Options позволяет снизить уязвимость вашего сайта для кликджекинг-атак. Этот заголовок служит инструкцией для браузера не загружать вашу страницу в frame/iframe. Есть три варианта конфигурации. SAMEORIGIN Позволяет загрузку контента в frame/iframe только если фрейм и страница, его загружающая, расположены на одном домене. DENY Запрещает загрузку контента в frame/iframe. ALLOW-FROM Допускает загрузку контента в фреймах только для определенного URI. Поместив ваш веб-сайт в iFrame, вредоносный ресурс получает возможность произвести кликджекинг атаку — запустив некий JavaScript, который обманом вынудит пользователя кликнуть по iFrame, а после начнет взаимодействовать с ресурсом от его, пользователя, имени (то есть человек кликнет по вредоносной ссылке или кнопке, даже не подозревая об этом!). Этот заголовок всегда надо настраивать на отказ, исключение — если вы намеренно используете фреймы. Тогда заголовок нужно настраивать на тот же источник. Если вы по умолчанию используете фреймы с другим сайтом, занесите сторонний домен в белый список. Следует также отметить, что этот заголовок замещается директивой CSP frame-ancestors. Подробнее про атаку типа clickjacking можно почитать здесь https://learn.javascript.ru/clickjacking Там же найдете некоторые примеры. Давайте рассмотрим, как добавить конфигурацию “SAMEORIGIN” для запрета встраивания на сторонних доменах. Apache Добавьте следующую строку в httpd.conf и для проверки перезагрузите веб-сервер: source: Код:
HeaderNginx Добавьте следующее в nginx.conf в директиве Server: source: Код:
add_header X-Frame-Options “SAMEORIGIN”;Цитата: ВАЖНО! Установка SAMEORIGIN запретит вебмастеру доступ к сайту, поэтому необходимо добавлять Яндекс вебмастер в исключения, как и сам домен, на случай, если используется iframe. Самой известной проблемой является некорректная работа Вебвизора от Яндекс. Данные собираются валидно, но при попытке просмотреть запись посещения возникает ошибка: «Невозможно воспроизвести посещение на данной странице. Возможные причины: Не установлен код счётчика или установлен запрет на отображение страницы во фрейме» Варианты добавления в конфиги исключений сводят всю идею X-Frame-Options на ноль, так как могут быть легко подделаны. Поэтому варианты типа приведенного ниже могут использоваться, но не рекомендуются. Для решения проблемы придется сделать выбор: либо сервис (в данном случае вебвизор), либо безопасность, других вариантов пока что не существует, к сожалению. Пример кода для исключения Яндекса для nginx: source: Код:
setДля PHP: PHP highlight Код:
Cross-Origin Resource Sharing (CORS) https://developer.mozilla.org/ru/docs/Web/HTTP/CORS Цитата: Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент. Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом. CORS — это не заголовок, а механизм, используемый браузером для предоставления доступа к ресурсам приложения. Настройки по умолчанию обычно правильные, но если надо — можно и поменять. code: Access-Control-Allow-Origin: https://example.com означает, что https://example.com имеет доступ к содержимому ответа. Если значением данного заголовка является *, ресурсы будут доступны любому сайту. В этом случае полномочия (credentials) не требуются; code: Access-Control-Allow-Credentials: true означает, что запрос на получение ресурсов должен содержать полномочия (куки). При отсутствии полномочий в запросе, даже при наличии источника в заголовке Access-Control-Allow-Origin, запрос будет отклонен. Например, сайт А содержит некий JavaScript, который хочет сделать запрос к сайту В. Сайт В должен ответить на этот запрос — если заголовок разрешает сайту А сделать запрос. Если нужно настроить множество источников, подробности на MDN. Пример обработки сложного запроса: code: Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400 Set-Cookie https://developer.mozilla.org/en-US/...ers/Set-Cookie Цитата: The Set-Cookie HTTP response header is used to send a cookie from the server to the user agent, so that the user agent can send it back to the server later. To send multiple cookies, multiple Set-Cookie headers should be sent in the same response. Убедитесь, что ваши cookies устанавливаются только через протокол HTTPS (с шифрованием), и что к ним нет доступа через JavaScript (ваш сайт должен поддерживать https). Всегда необходимо выставлять эти флаги:
source: Код:
Set-Cookie:X-Content-Type-Options https://developer.mozilla.org/en-US/...t-Type-Options Цитата: The X-Content-Type-Options response HTTP header is a marker used by the server to indicate that the MIME types advertised in the Content-Type headers should be followed and not be changed. The header allows you to avoid MIME type sniffing by saying that the MIME types are deliberately configured. Можно предотвратить атаки с использованием подмены MIME типов, добавив этот заголовок ответа HTTP. Заголовок содержит инструкции по определению типа файла и не допускает сниффинг контента. При конфигурации потребуется добавить только один параметр: “nosniff”. Давайте посмотрим, как добавить этот заголовок. Apache Добавьте следующую строку в файл httpd.conf: source: Код:
HeaderNginx Добавьте следующую строку в файл nginx.conf в директиве Server: source: Код:
add_header X-Если вы используете WordPress, то вы можете воспользоваться плагином Security Headers для использования этого заголовка. Referrer-Policy https://developer.mozilla.org/en-US/...eferrer-Policy Цитата: The Referrer-Policy HTTP header controls how much referrer information (sent with the Referer header) should be included with requests. Aside from the HTTP header, you can set this policy in HTML. Заголовок Referrer-Policy определяет содержание информации о реферере, указываемой в заголовке Referer. Заголовок Referer содержит адрес запроса (например, адрес предыдущей страницы) или адрес загруженного изображения, или другого ресурса. Он используется для аналитики, логирования, оптимизации кеша и т.д. Однако он также может использоваться для слежrb или кражи информации, различных "побочных эффектов". Значение/Описание no-referrer Заголовок Referer не включается в запрос no-referrer-when- Значение по умолчанию. Реферер указывается при выполнении запроса downgrade между HTTPS и HTTPS, но не указывается при выполнении запроса между HTTPS и HTTP origin Указывается только источник запроса (например, реферером документа https://example.com/page.html будет https://example.com) origin-when-cros При выполнении запроса в пределах одного источника указывается полный s-origin URL, иначе указывается только источник (как в предыдущем примере) same-origin При выполнении запроса в пределах одного источника указывается источник, в противном случае, реферер не указывается strict-origin Похоже на no-referrer-when-downgrade, но указывается только источник strict-origin-when-cross-origin Сочетание strict-origin и origin-when-cross-origin unsafe-url Всегда указывается полный URL Cache-Control и Expires https://developer.mozilla.org/en-US/.../Cache-Control https://developer.mozilla.org/ru/doc...eaders/Expires Нужно помнить что для разных типов контента нужны разные политики кэширования. Никакая деликатная информация (вроде страницы пользователя или страницы оплаты товара) не должна кэшироваться. Одна из причин — чтобы другой пользователь компьютера не нажал кнопку "назад" и не увидел личных данных другого пользователя. Впрочем, кэшировать можно и нужно те ресурсы/страницы, которые обновляются редко. Например, статические ресурсы (картинки, файлы CSS и JS). Кэширование можно настроить на постраничной основе, или используя regex в настройках сервера. source: Код:
# Don’t cache by defaultЗаголовок Expires устанавливает время, на которое текущий запрос сохраняется в кэше. Он игнорируется, если включен заголовок Cache-Control max-age, так что включаем его только на случай, если его проверяет простенький сканер — без учета контроля кэширования. Мы предполагаем, что в целях безопасности браузер не кэширует ничего, так что дата в заголовке всегда будет в прошлом. Permissions-Policy Данный заголовок является заменой заголовка Feature-Policy и предназначен для управления доступом к некоторым продвинутым возможностям. code: Permissions-Policy: camera=(), fullscreen=*, geolocation=(self "https://example.com" "https://another.example.com") В данном случае мы полностью запрещаем доступ к камере (видеовходу) устройства, разрешаем доступ к методу requestFullScreen() (для включения полноэкранного режима воспроизведения видео) для всех. Доступ к информации о местонахождении устройства разрешаем только для источников example.com и another.example.com. Спецификация рассматриваемого заголовка находится в статусе рабочего черновика, поэтому его поддержка оставляет желать лучшего. С возможными значениями можно ознакомиться тут: https://habr.com/ru/company/timeweb/blog/568288/ Content Security Policy https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP Цитата: Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft, to site defacement, to malware distribution. CSP применяется, чтобы предотвращать межсайтовый скриптинг — путем определения, какие ресурсы могут быть загружены. Из всего списка этот заголовок отнимет больше остальных времени на настройку и правильную поддержку, а еще больше других подвержен рискам. Если вдруг вы заблокируете используемый вами же источник, то нарушите функциональность собственного сайта. Если вы когда-либо вручную прописывали фильтры для плагина AdBlock, это нечто отдаленно похожее, но на уровне сервера. Предварительно можно настроить CSP так (на боевом сайте она, скорее всего, потребует множества модификаций). Добавьте в каждый раздел вашего сайта домены:
code: Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; Инструмент оценки CSP: https://csp-evaluator.withgoogle.com/ Директива CSP/Описание base-uri Определяет базовый URI для относительных default-src Определяет политику загрузки ресурсов всех типов при отсутствии специальной директивы (политику по умолчанию) script-src Определяет скрипты, которые могут выполняться на странице object-src Определяет, откуда могут загружаться ресурсы — плагины style-src Определяет стили, которые могут применяться на странице img-src Определяет, откуда могут загружаться изображения media-src Определяет, откуда могут загружаться аудио и видеофайлы child-src Определяет, откуда могут загружаться фреймы frame-ancestors Определяет, где (в каких источниках) ресурс может загружаться во фреймы font-src Определяет, откуда могут загружаться шрифты connect-src Определяет разрешенные URI manifest-src Определяет, откуда могут загружаться файлы манифеста form-action Определяет, какие URI могут использоваться для отправки форм (в атрибуте action) sandbox Определяет политику песочницы (sandbox policy) HTML, которую агент пользователя применяет к защищенному ресурсу script-nonce Определяет, что для выполнения скрипта требуется наличие уникального значения plugin-types Определяет набор плагинов, которые могут вызываться защищенным ресурсом посредством ограничения типов встраиваемых ресурсов reflected-xss Используется для активации/деактивации эвристических методов браузера для фильтрации или блокировки отраженных XSS-атак block-all-mixed-content Запрещает загрузку смешанного контента upgrade-insecure-requests Определяет, что небезопасные ресурсы (загружаемые по HTTP) должны загружаться по HTTPS report-to Определяет группу (указанную в заголовке Report-To), в которую отправляются отчеты о нарушениях политики Возможные значения директив для нестрогого режима CSP:
code: Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src example.com В данном случае изображения могут быть загружены из любого источника, другие медиафайлы — только с media1.com и media2.com (исключая их поддомены), скрипты — только с example.com. Рассмотрим разрешение загрузки любого контента с текущего домена для разных веб-серверов. Apache Добавьте следующую строку в файл httpd.conf и перезагрузите веб-сервер: code: Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; Nginx Добавьте следующее в секцию Server в файле nginx.conf: code: add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; Цитата: ВАЖНО! Параметры script-src ‘self’ или default-src ‘self’ отключат загрузку сторонних объектов с других сайтов. Данный параметр следует использовать очень осторожно и только если вы точно знаете, что делаете. Полезные советы
Apache /etc/apache или /etc/httpd Проверка конфигурации на ошибки синтаксиса до перезагрузки сервера Чтобы проверить ваши файлы конфигурации Apache на наличие любых синтаксических ошибок, выполните следующую команду, которая проверит правильность файлов конфигурации, прежде чем перезапускать службу. source: Код:
$Если в конфигурации нет ошибок, то перезагружаем. Если вы внесли какие-либо изменения в конфигурацию сервера Apache, вы можете указать службе перезагрузить свою конфигурацию, выполнив: source: Код:
------------Nginx /etc/nginx Проверка конфигурации на ошибки синтаксиса до перезагрузки сервера source: Код:
$Если в конфигурации нет ошибок, то перезагружаем. source: Код:
$Важно помнить, что конфигурации отличаются для HTTP и HTTPS и нужно найти верный хост в конфиге. Если используется связка apache+nginx - изменения вносим в nginx, т.к. он первый отвечает и проксирует запросы. Пример конфигурации заголовков для Nginx source: Код:
add_header Strict-Transport-SecurityПроверяем сайт на securityheaders.com До После Как видно, у нас высшая оценка «А» и не хватает только заголовка Permissions-Policy. Но так как он не обязательный и экспериментальный, то это влияет на оценку. Данный параметр позволяет отключать некоторые возможности браузеров и API, например, iframe, video, audio и т.д. Так как этим параметром можно отключить и что-то нужное, в данном случае мы его не использовали. |
| Время: 14:12 |