3 заметки с тегом

HTTP Strict Transport Security

Повышение безопасности сервера при помощи заголовков

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

  1. HTTP Strict Transport Security (HSTS) — позволяет форсировать HTTPS подключение.
  2. HTTP Public Key Pinning (HPKP)  — позволяет создать своеобразную «электронную подпись» для вашего сайта.
  3. X-Download-Options со значением «noopen» позволяет запретить открытие любых файлов с вашего сайта (например, документов в формате PDF), становится возможно только скачать их.
  4. X-Content-Type-Options со значением «nosniff» инструктирует Internet Explorer версии 8 не определять автоматически content-type, а использовать уже полученный.
  5. Еще один заголовок X-XSS-Protection со значением «1; mode=block» активирует встроенную защиту от XSS (Cross-Site Scripting, «межсайтовый скриптинг»).
  6. X-Frame-Options со значением «SAMEORIGIN» запрещает открывать страницы вашего сайта во фрейме на чужом сайте.
  7. Заголовок Set-Cookie должен указываться с параметрами HttpOnly и Secure. Это предотвратит XSS-атаки и защитит cookie от кражи при помощи скрипта javascript.
  8. В заголовке Server также должна быть указана минимальная информация о сервере. Например, просто Apache. Это не даст злоумышленнику получить дополнительную информацию о программном обеспечении, установленном на вашем сервере.
  9. По аналогичным причинам рекомендуется убрать заголовок X-Powered-By, если таковой присутствует.

И, как обычно, есть ресурсы, с помощью которых можно проверить насколько корректно вы указали эти заголовки. Первый из них — securityheaders.io, работает очень быстро, корректно указанные по его мнению заголовки выделяются зеленым цветом. Некоторые он не выделяет, но, думаю, что на них он просто не обращает внимание.

Второй ресурс — Redbot. В левой части страницы он показывает заголовки, которые он смог получить. В правой вкратце описывается действие заголовка, также значками выделяется корректность их указания. Стадия их получения почему-то немного затянута, на мой взгляд — около 1 минуты, будем надеяться, что это будет исправлено. Также есть возможность включить в запрос дополнительные параметры.

Если вы думаете, что я что-то пропустил, то пишите в комментариях.

Добавление в список HSTS Preloading

Как это ни странно, но время ожидания добавления в список HSTS Preloading после подачи заявки составило всего около 2-х недель. Возможно, что в Chrome добавление произошло и раньше, но я только вчера утром обновил Firefox на своем компьютере и чуть позже, в ходе внесения изменений в файл .htaccess, можно сказать случайно, запустил проверку на сайте ssllabs. Итогом стало то, что я заметил загоревшийся зеленым цветом Chrome в пункте HSTS Preloading. Порадовался этому факту и немного огорчился, что только один браузер включил меня в этот список. Психологически приготовился ждать еще какое-то время пока остальные тоже обновят его, но этот процесс особо не затянулся. Буквально через несколько часов я наблюдал картину, где все браузеры, кроме Tor, светились зеленым. Ну Tor меня особо никогда не интересовал — ну не верю я в его «неотслеживаемость» и прочие фишки, поэтому было некритично. Сегодня утром картина немного изменилась — информация по Tor стала недоступной. На текущий момент ситуация выглядит следующим образом:

Также наконец-то создал более-менее правильную политику Content Security Policy (CSP), которая позволила моему блогу нормально функционировать. Ранее проблема в ее включении заключалась в том, что картинки из сообщений просто исчезали, при этом я не получал никаких сообщений в Firebug. Также иногда сбивалась тема и переставали работать скрипты. Но, вроде как, разобрался и сейчас все функционирует нормально. Прогнал тестами через один из сервисов и был приятно удивлен, когда он выставил мне высшую оценку по безопасности, найдя все те технологии, которые я внедрил на свой сервер. Кстати, интерфейс у этого сервиса сильно напоминает ssllabs. Про него расскажу чуть позже.

2016   chrome   Content Security Policy   CSP   edge   firebug   firefox   hsts   HTTP Strict Transport Security   ie   preload   ssllabs   tor   список

Внедрение HTTP Strict Transport Security (HSTS) на свой сайт

Сначала небольшая выдержка из википедии:

«HSTS (сокр. от англ. HTTP Strict Transport Security) — механизм, активирующий форсированное защищённое соединение через протокол HTTPS. Данная политика безопасности позволяет сразу же устанавливать безопасное соединение, вместо использования HTTP-протокола. Механизм использует особый заголовок Strict-Transport-Security для принудительного использования браузером протокола HTTPS даже в случае перехода по ссылкам с явным указанием протокола HTTP. Механизм специфицирован в RFC6797 в ноябре 2012 года.

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

Дополнительную защиту https-соединений предоставляют методы Certificate pinning (хранение списка разрешенных для домена сертификатов или CA в исходных текстах браузера) и HTTP Public Key Pinning (англ.). Они предотвращают множество возможностей подмены tls-сертификатов https-сервера.»

Для внедрения этой технологии нам понадобится несколько вещей:

  1. Наличие валидного сертификата (можно бесплатно получить на сайте Let’s Encrypt)
  2. Уверенность в том, что будет использоваться только https протокол, включая все ваши субдомены.
  3. Полное перенаправление с http-версий сайтов на https.

Если что-то из этого по каким-то причинам вам не подходит, то эта технология вам не нужна.

Так как у меня используется «старенький» Apache версии 2.2, то и настраивать, соответственно, мы будет его. Для включения HSTS нам нужно добавить в файл /etc/httpd2/conf/sites-available/default_https.conf следующие строки:

<IfModule ssl_module>
    <VirtualHost *:443>
        Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
   </VirtualHost>
</IfModule>

Первые и последние две строки — стандартные для данного файла, если они имеются, то добавлять их не нужно. Нас больше всего интересует третья строчка.

Инструкция Header set позволяет вставить заголовок в ответ сервера. В данном случае заголовок «Strict-Transport-Security». В скобках за ним расположены параметры этого заголовка:

  • max-age — время в секундах, которое будет действовать этот заголовок. Если быть точнее, то это время, в течение которого сайт будет доступен по протоколу HTTPS. Не рекомендуется устанавливать его менее 18 недель;
  • includeSubDomains — указывается, если действие заголовка распространяется также на поддомены. Не является обязательным;
  • preload — параметр, позволяющий указывать, что ваш сайт никогда не будет доступен по незащищенному протоколу. Не является обязательным. Про него будет чуть ниже.

Итак, данные мы добавили, теперь нужно перезагрузить файлы конфигурации:

# service httpd2 condreload

Наличие заголовка в ответе сервера можно проверить, например, на этом сайте. Среди прочих вы должны увидеть такую строчку:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Идем на сайт ssllabs, вводим адрес своего сайта с указанием https и тестируем, что у нас получилось. Тест занимает некоторое время, его вполне хватит на то, чтобы, например, налить себе чашечку кофе.

По итогу мы должны увидеть такие строчки:

Эту вы увидите в шапке отчета
Эту строчку вы увидите в шапке отчета
Эта будет находиться ближе к концу отчета
Эта будет находиться ближе к концу отчета

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

И, наконец, про параметр preload. Существует так называемый «preload list», в котором перечислены все домены, использующие технологию HSTS. Своего рода список «избранных» :-) При желании вы можете подать заявку на включение вашего домена в этот список, но на скорый ответ не рассчитывайте. Список обновляется с выпуском каждой версии браузера Chrome, поэтому может пройти несколько месяцев, прежде, чем вы увидите, что ваш домен добавлен в него. Для подачи заявки нужно выполнить несколько требований, указанных на главной странице сайта, поэтому рекомендую прочитать ее внимательно. Значение имеет даже регистр параметров заголовка. В случае критической ошибки после нажатия на кнопку «Check status and eligibility» фон страницы станет красным, в случае некритической — желтым, если же все верно — зеленым. На этой же странице указано, что нужно делать, чтобы удалить свой домен из этого списка.

В принципе, это все, что вам нужно знать об этой технологии защиты вашего сайта. Надеюсь, что этот текст вам помог.