Знаете ли вы, что в большинстве случаев уязвимость системы безопасности можно устранить добавив необходимые заголовки ответа?

Безопасность не менее важна, чем содержание или поисковая оптимизация сайта. Тысячи сайтов взламываются из-за ошибок в конфигурации или недостаточной защиты. Если вы владелец сайта или специалист по защите информации, и интересуетесь защитой сайта от кликджекинга, внедрения кода, уязвимостей MIME типов, XSS-атак и т.д., то данная инструкция будет вам полезна.

В этой статье я расскажу о разных заголовках HTTP для использования с различными веб-серверами, сетевой периферией или сетями доставки контента, чтобы повысить уровень защищенности сайта.

Замечания:


  • До внесения изменений советую сделать резервную копию файла конфигурации;
  • Некоторые заголовки могут не поддерживаться на всех браузерах, поэтому до выполнения стоит проверить совместимость;
  • Mod_headers должен быть включен в Apache для использования этих заголовков. Следующая строка должна быть раскомментирована в httpd.conf file: LoadModule headers_module modules/mod_headers.so

Если вы пользуетесь SUCURI Cloud WAF, то о настройке сервера вручную можете не беспокоиться, большинство параметров уже автоматически включено.

Список заголовков HTTP


X-XSS-Protection


HTTP Strict Transport Security


X-Frame-Options


X-Content-Type-Options


HTTP Public Key Pinning

Content Security Policy


X-XSS-Protection


Заголовок 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 HTTP-сервер


Добавьте следующую запись в httpd.conf вашего сервера Apache:

Header set X-XSS-Protection “1; mode=block”

Для проверки перезапустите Apache.

Nginx


Добавьте следующее в nginx.conf в разделе HTTP:

add_header X-XSS-Protection "1; mode=block";

Необходимо перезапустить Nginx, чтобы изменения отразились в заголовке ответа вашего сайта.

MaxCDN


Если вы используете MaxCDN, то добавить заголовок — проще простого. Зайдите в Edge Rules, нажмите “New Rule” и выберите “Add X-XSS-Protection Header” из выпадающего списка.



Microsoft IIS


  • Откройте Диспетчер IIS;
  • Выберите сайт, для которого необходимо включить заголовок;
  • Зайдите в “Заголовки ответа HTTP”
  • Нажмите “Добавить” в разделе действий.
  • Введите название, значение и нажмите OK.



  • Перезапустите IIS, чтобы увидеть результаты.

HTTP Strict Transport Security


Заголовок HSTS (HTTP Strict Transport Security) гарантирует, что весь обмен данными из браузера осуществляется по протоколу HTTPS (HTTP Secure). Это предотвращает попытки обойти HTTPS и перенаправляет все HTTP запросы на HTTPS.

Перед тем, как добавлять этот заголовок, убедитесь в том, что все страницы сайта доступны по HTTPS, иначе они не будут отображаться.

Заголовок HSTS совместим с последними версиями большинства браузеров (IE, Firefox, Opera, Safari и Chrome). Всего есть три варианта конфигурации.
Значение параметра Содержание
max-age Интервал (в секундах) для указания браузеру, что запросы следует отправлять только через HTTPS.
includeSubDomains Конфигурация распространяется на поддомены.
preload Используйте, если хотите добавить домен в предопределенный список HSTS.

В качестве примера давайте настроим HSTS на год и добавим домен и поддомены в предопределенный список HSTS.

Apache HTTP-сервер


Чтобы использовать HSTS в Apache, добавьте в файл httpd.conf следующую запись:

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Чтобы увидеть результат, перезапустите Apache.

Nginx


Чтобы настроить HSTS в Nginx, добавьте следующую запись в nginx.conf в директиве Server (SSL):

add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

Как всегда, для проверки придется перезагрузить Nginx.

Cloud Flare


Если вы используете Cloud Flare, то включить HSTS можно всего за пару кликов мыши.

  • Войдите в Cloud Flare и выберите необходимый сайт.
  • Перейдите во вкладку “Crypto” и нажмите “Enable HSTS.”



Выберите необходимые вам настройки, и изменения вступят в действие сразу же.

Microsoft IIS


Запустите Диспетчер IIS и добавьте заголовок, перейдя в “Заголовки ответа HTTP” для соответствующего сайта.



Перезапустите сайт.

X-Frame-Options


Заголовок X-Frame-Options позволяет снизить уязвимость вашего сайта для кликджекинг-атак. Этот заголовок служит инструкцией для браузера не загружать вашу страницу в frame/iframe. Не все браузеры поддерживают этот вариант, так что проверьте заголовок на совместимость перед тем, как его добавлять.

Есть три варианта конфигурации.
Значение параметра Содержание
SAMEORIGIN Позволяет загрузку контента в frame/iframe только если фрейм и страница, его загружающая, расположены на одном домене.
DENY Запрещает загрузку контента в frame/iframe.
ALLOW-FROM Допускает загрузку контента в фреймах только для определенного URI.

Давайте рассмотрим, как добавить конфигурацию “DENY” для запрета встраивания.

Apache


Добавьте следующую строку в httpd.conf и для проверки перезагрузите веб-сервер:

Header always append X-Frame-Options DENY

Nginx


Добавьте следующее в nginx.conf в директиве Server:

add_header X-Frame-Options “DENY”;

Для проверки результатов необходима перезагрузка.

F5 LTM


Создайте iRule следующего содержания для соответствующего виртуального сервера:

when HTTP_RESPONSE {
HTTP::header insert "X-FRAME-OPTIONS" "DENY"
}

Перезагружать ничего не нужно, изменения происходят автоматически.

WordPress


Этот заголовок также можно использовать в WordPress. Добавьте следующее в файл wp-config.php:

header(‘X-Frame-Options: DENY’);

Если вы не хотите вносить изменения в файл, то можете воспользоваться плагином по этой инструкции.

Microsoft IIS


Чтобы добавить заголовок, откройте “Заголовки ответа HTTP” для соответствующего сайта.



Чтобы изменения отобразились, нужно перезапустить сайт.

X-Content-Type-Options


Можно предотвратить атаки с использованием подмены MIME типов, добавив этот заголовок ответа HTTP. Заголовок содержит инструкции по определению типа файла и не допускает сниффинг контента. При конфигурации потребуется добавить только один параметр: “nosniff”.

Давайте посмотрим, как добавить этот заголовок.

Apache


Добавьте следующую строку в файл httpd.conf:

Header set X-Content-Type-Options nosniff

Не забудьте перезагрузить веб-сервер Apache, чтобы конфигурация вступила в действие.

Nginx


Добавьте следующую строку в файл nginx.conf в директиве Server:

add_header X-Content-Type-Options nosniff;

Как обычно, потребуется перезагрузить Nginx для проверки результатов.

WordPress


Если вы используете WordPress, то вы можете воспользоваться плагином Security Headers для использования этого заголовка.

Microsoft IIS


Откройте IIS и зайдите в раздел «Заголовки ответа HTTP»
Нажмите «Добавить», введите название и значение.



Нажмите OK и перезапустите IIS, чтобы проверить результат.

HTTP Public Key Pinning


Сократите риск MITM-атаки (“человек посередине”) с помощью привязки сертификата. Для этого необходимо добавить заголовок HPKP (HTTP Public Key Pinning).

Можно привязать корневой сертификат открытого ключа или промежуточный сертификат. На момент подготовки статьи, поддержка HPKP осуществляется в Firefox и Chrome c алгоритмом хэширования SHA-256.

Есть четыре варианта конфигурации.
Значение параметра Содержание
report-uri=”url” Отправить отчет на определенный URL, если привязка не состоялась. Это необязательный параметр.
pin-sha256=”sha256key” Определить привязку.
max-age= Инструкция для браузера запомнить время в секундах, в течение которого сайт будет доступен только с использованием одного из привязанных сертификатов.
IncludeSubDomains Применить в отношении поддоменов.

В качестве примера давайте рассмотрим заголовок HPKP для facebook.com:

public-key-pins-report-only:max-age=500; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E="; pin-sha256="q4PO2G2cbkZhZ82+JgmRUyGMoAeozA+BSXVXQWB8XWQ="; report-uri=http://reports.fb.com/hpkp/

Если вы собираетесь использовать это на своем сайте, то рекомендую обратиться к руководству, написанному Scott Helme.

Content Security Policy


Чтобы предотвратить XSS-атаки, кликджекинг, внедрение кода, можно добавить заголовок ответа Content Security Policy (CSP). CSP содержит инструкции о загрузке контента из разрешенных источников.

Не все браузеры поддерживают CSP, так что перед использованием придется проверить это. Есть три варианта использования заголовков CSP:
  1. Content-Security-Policy – Level 2/1.0;
  2. X-Content-Security-Policy – не рекомендуется;
  3. X-Webkit-CSP – не рекомендуется.

Если вы еще пользуетесь устаревшим вариантом, то стоит задуматься о переходе на обновленный.

Для заголовка CSP можно задать множество параметров, их можно изучить на OWASP. Предлагаю рассмотреть два самых распространенных.
Значение параметра Содержание
default-src Загружать с определенного источника все.
script-src Загружать с определенного источника только скрипты.

Рассмотрим разрешение загрузки любого контента с текущего домена для разных веб-серверов.

Apache


Добавьте следующую строку в файл httpd.conf и перезагрузите веб-сервер:

Header set Content-Security-Policy "default-src 'self';"

Nginx


Добавьте следующее в секцию Server в файле nginx.conf:

add_header Content-Security-Policy "default-src 'self';";

Microsoft IIS


Зайдите в «Заголовки ответа HTTP» для соответствующего сайта в Диспетчере IIS и добавьте следующие настройки:



Я надеюсь, что инструкция по использованию заголовков позволит вам повысить безопасность и защищенность вашего веб-приложения. Если вы ищете защищенный IIS веб-сервер, то обратите внимание на WebKnight WAF, где можно реализовать вышеуказанные конфигурации и не только.

Последний абзац, ради которого Chandan Kumar пишет эти статьи, а я их перевожу:
будем рады видеть Вас в числе посетителей HOSTING.cafe (поиск виртуальных серверов, виртуального хостинга и не только) или POISK.hosting (сборник отзывов о хостерах).
Поделиться с друзьями
-->

Комментарии (28)


  1. mayorovp
    22.11.2016 14:47
    +5

    Для тех, кто не хочет настраивать IIS через UI — заголовки можно прописать в файле web.config:


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <httpProtocol>
                <customHeaders>
                    <add name="X-XSS-Protection" value="1; mode=block" />
                    <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" />
                    <add name="X-Frame-Options" value="DENY" />
                    <add name="X-Content-Type-Options" value="nosniff" />
                    <add name="Content-Security-Policy" value="default-src 'self';" />
                </customHeaders>
            </httpProtocol>
        </system.webServer>
    </configuration>


    1. mayorovp
      23.11.2016 11:29

      UPD: при первом чтении не обратил внимания… Автор поста советует перезапускать IIS после изменения каждого заголовка. Не нужно этого делать! При настройках по умолчанию IIS автоматически перезапустит сайт после изменения его настроек. Причем независимо от того, через GUI оно делалось или просто новый web.config ему подложили.


  1. Sleuthhound
    22.11.2016 16:13

    >>Знаете ли вы, что в большинстве случаев уязвимость системы безопасности можно устранить добавив необходимые заголовки ответа?

    Неправильное добавление заголовков может закрыть сайт для посетителей, поисковиков, разного рода систем аналитики посетителей и прочего, так что тут тоже нужно действовать с умом, а не руководствоваться всеобщей параноей.


    1. mayorovp
      22.11.2016 16:36
      +1

      Тем не менее, добавление заголовков с умом действительно может повысить безопасность.


  1. Erelecano
    22.11.2016 16:46

    И какой-нибудь глупый ребенок прочитав вашу горе-статейку таки добавит HSTS с « includeSubDomains; preload», а потом не будет понимать почему же его кидает на https на доменах третьего уровня его домена, где https нет и почему он не может туда попасть.
    Вы приводите надерганные вами из сети заголовки не понимая что они делают. Нельзя так. Вы сами не знаете и другим не объясняете, просто накопипастили, потому что надо повесить статьишку в копротивный бложик.
    Ваша статейка может навредить, а помочь не может.


    1. selivanov_pavel
      22.11.2016 18:39
      +3

      По-моему, в статье достаточно внятно написано, что делает IncludeSubDomains:


      includeSubDomains Конфигурация распространяется на поддомены.

      Если кто-то копипастит конфиги из статьи, не читая объяснений — проблема не в статье.


      1. Erelecano
        22.11.2016 18:41
        -1

        Нет, проблема в статье. Проблема в том, что «автор» этой статьи не понимает о чем пишет. Это — обычный выброс реврайтеров по заказу какой-то мутной конторки. Статья однозначно вредна и находится на хабре только потому, что она расположена в платном бложике мутной конторки.


    1. Urichalex
      23.11.2016 00:40
      +2

      Глупые детишки и без таких статей могут навредить всему, до чего дотрагиваются. Статья написана для людей, которые знают, что делают


      1. pansa
        23.11.2016 01:16

        Людям, которые знают, что делают, например, настраивают правила CSP, HSTS или включают пининг к сертификату — эта статья ничего не даст. Эти вопросы требуют вдумчивого и внимательного изучения. Статья крайне поверхностна, что делает её опасной — я согласен с этим мнением.
        Например, при описании HSTS, как уже было сказано, можно очень легко заблокировать свой сайт не только себе, но и клиентам, которые успеют зайти на страницу и их браузер запомнит флаг HSTS. Так же в статье ошибочно трактуется флаг preload — это НЕ включает домен в preload лист, это только метка для подтверждения вашей заявки на включение в этот список. Для внесения в сам список необходимо отправить заявку.


  1. zona7o
    22.11.2016 17:34

    У меня вопрос — как можно при помощи «Content Security Policy» разрешить использование inline-стилей. Везде пишут про unsafe-inline / nonce-* — все это работает для JS, однако для CSS ничего подобного не оставили.


    1. pansa
      23.11.2016 01:10

      должно работать, это еще в первой версии CSP реализовано. Посмотрите тут https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src


      1. zona7o
        23.11.2016 01:30

        Благодарю, попробую еще раз.
        Здесь задавал уже вопрос, но ответа не было. В консоли ошибка:

        Refused to apply inline style because it violates the following Content Security Policy directive: «style-src 'self' 'unsafe-inline' 'nonce-BLABLABLAH'


    1. mayorovp
      23.11.2016 11:25

      Глупый вопрос — но nonce-то верный указан?


      1. zona7o
        23.11.2016 11:39
        -1

        Оригинальный nonce="Xiojd98a8jd3s9kFiDi29UijwdX",
        BLAHBLAHBLAH — для общей картины.


  1. ky0
    22.11.2016 17:37
    +2

    Прекратите уже «перезагружать» nginx, что за варварство в 2016 году? Reload отлично работает.


    1. cjbars
      22.11.2016 19:26

      Reload это вроде и есть перезагрузить, а вот restart это то о чем вы подумали ;-)


      1. ky0
        22.11.2016 19:27

        В контексте перевода это звучит скорее как «рестартовать сервис», а не «перечитать настройки».


    1. bluetooth
      23.11.2016 00:40

      Да и IIS не обязательно перезагружать, а достаточно перегрузить сайт или апп-пул.


      1. mayorovp
        23.11.2016 11:26

        В данном случае, его вообще не надо перезагружать. Потому что при изменении конфигурации он перезапускает сайт автоматически.


        1. bluetooth
          23.11.2016 14:51

          Ааа точно! Тем более тогда ничего не надо перезагружать.


  1. selivanov_pavel
    22.11.2016 18:42
    +1

    Полезная статья. Но ИМХО стоило способы изменения заголовков в разных серверах и движках собрать в один блок в конце, а не растягивать статью 10 одинаковыми картинами "модальное окно с введённым значением, OK и Cancel".


  1. YourChief
    22.11.2016 22:02
    +3

    https://securityheaders.io/


  1. negodnik
    22.11.2016 23:36

    Автор забыл сделать первым пунктом: Никогда не настраивайте сервер по статьям вроде «как настроить сервер за пять минут», не понимая в точности что делают эти настройки


    1. negodnik
      22.11.2016 23:44

      * забыла


      1. orthanner
        23.11.2016 12:04

        Забыл. Автор оригинального текста — мужчина. Индус. Безо всякого расизма: видел кучу умных статей ни о чём, написанных индийскими товарищами. Такое чувство, что им там реально за длину платят, да ещё и недоплачивают.


  1. ivan386
    23.11.2016 01:13
    -2

    Раскройте пожалуйста секрет как вы сделали навигацию по статье?


    1. mayorovp
      23.11.2016 11:31

      http://htmlbook.ru/html/a
      Стыдно такое не знать


      1. ivan386
        23.11.2016 17:03

        Видимо у меня нет соответствующего ранга для использования этой возможности. У меня из статьи просто вырезаются якоря. Думал может только цифру в name можно указывать но и так тоже вырезается.

        P.S. Я открыл этот ларчик. Оказывается в markdown надо было писать. Тогда заголовкам нормальные ID автоматом выдаются.