Включение HSTS в Tomcat Apache
Для включения механизма принудительного переключения на защищенное соединение HTTPS (HSTS, HTTP Strict-Transport-Security) в Tomcat Apache PTC рекомендует использовать приведенную ниже информацию.
Введение
HTTP HSTS - это технология, позволяющая объявлять на веб-сайтах, что к доступ ним можно получить только через безопасное соединение (HTTPS). Этот механизм, описанный в стандарте RFC6797, использует заголовок Strict-Transport-Security в ответе, чтобы информировать агенты пользователя о политике безопасности, требуемой веб-сайтом.
HSTS может противостоять следующим угрозам.
Пользователь выбирает в закладках или вводит вручную адрес http://myDomain.com и может подвергаться атаке с подставкой (man-in-the-middle).
HSTS автоматически перенаправляет запросы HTTP по протоколу HTTPS для целевого домена.
В веб-приложении, предназначенном для использования в нем только протокола HTTPS, непреднамеренно используются ссылки в формате HTTP или производится передача содержимого по протоколу HTTP.
HSTS автоматически перенаправляет запросы HTTP по протоколу HTTPS для целевого домена.
Инициатор атаки с подставкой пытается перехватить трафик от пользователя, ставшего жертвой, используя недопустимый сертификат и надеясь, что пользователь пропустит непроверенный сертификат.
HSTS не позволит пользователю обойти сообщение о недопустимом сертификате.
HSTS также устраняет перенаправления HTTP в HTTPS, сокращая таким образом задержки доступа.
Заголовок Strict-Transport-Security имеет следующие свойства.
Распознается только при отправке через соединение HTTPS. Веб-сайты по-прежнему могут разрешать пользователям взаимодействовать с веб-сайтом с использованием HTTP, чтобы обеспечить совместимость с агентами пользователя, которые не используют HTTPS.
Должен содержать директиву max-age. Значение задает число секунд, в течение которых агент пользователя обрабатывает данный хост как известный узел, использующий HSTS (значение 0 означает прекращение такой обработки).
Может содержать директиву includeSubdomain, которая, если она есть, сообщает агенту пользователя, что политика HSTS применяется не только к хост-компьютеру HSTS, но также и ко всем поддоменам доменного имени хост-компьютера.
Флаг предзагрузки, являющийся индикатором согласия владельца сайта на предзагрузку его домена. В случае предзагрузки домена браузер получает информацию, что для данного хоста требуется использование SSL/TLS, поэтому удаляется маленькое окно, в котором сохраняется возможность проведения атаки: при перенаправлении исходного HTTP в HTTPS. Владелец сайта должен отправить этот домен в список (указанный здесь).
HSTS в Tomcat
Apache Tomcat v8.0.23 предоставляет новый интерфейс HttpHeaderSecurityFilter, добавляющий HTTP-заголовки Strict-Transport-Security, X-Frame-Options и X-Content-Type-Options в ответ. Фильтр можно добавить и сконфигурировать как любой другой фильтр, используя файл web.xml. Описание фильтра можно найти здесь, а в установку Tomcat включен пример в файле conf/web.xml. Ниже приведен пример фрагмента кода для файла web.xml , с помощью которого можно включить HSTS в Tomcat:
<!-- ================== Built In Filter Definitions ===================== -->

<!-- A filter that sets various security related HTTP Response headers. -->
<!-- This filter supports the following initialization parameters -->
<!-- (default values are in square brackets): -->
<!-- -->
<!-- hstsEnabled Should the HTTP Strict Transport Security -->
<!-- (HSTS) header be added to the response? See -->
<!-- RFC 6797 for more information on HSTS. [true] -->
<!-- -->
<!-- hstsMaxAgeSeconds The max age value that should be used in the -->
<!-- HSTS header. Negative values will be treated -->
<!-- as zero. [0] -->
<!-- -->
<!-- hstsIncludeSubDomains -->
<!-- Should the includeSubDomains parameter be -->
<!-- included in the HSTS header. -->
<!-- -->
<!-- antiClickJackingEnabled -->
<!-- Should the anti click-jacking header -->
<!-- X-Frame-Options be added to every response? -->
<!-- [true] -->
<!-- -->
<!-- antiClickJackingOption -->
<!-- What value should be used for the header. Must -->
<!-- be one of DENY, SAMEORIGIN, ALLOW-FROM -->
<!-- (case-insensitive). [DENY] -->
<!-- -->
<!-- antiClickJackingUri IF ALLOW-FROM is used, what URI should be -->
<!-- allowed? [] -->
<!-- -->
<!-- blockContentTypeSniffingEnabled -->
<!-- Should the header that blocks content type -->
<!-- sniffing be added to every response? [true] -->
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>hstsMaxAgeSeconds</param-name>
<param-value>31536000</param-value>
</init-param>
<init-param>
<param-name>hstsIncludeSubDomains</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<!-- The mapping for the HTTP header security Filter -->
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Заголовок Strict-Transport-Security возвращается, только если агент пользователя получает доступ к веб-сайту по протоколу HTTPS, поэтому Tomcat необходимо сконфигурировать на использование SSL/TLS (сведения о безопасной настройке Tomcat см. здесь). Поскольку Strict-Transport-Security возвращается, только если соединение безопасно, владелец веб-сайта должен решить следующее:
Будет ли веб-сайт обслуживаться через небезопасные соединения для поддержки обратной совместимости.
Будут ли небезопасные соединения перенаправляться в безопасные соединения (желательно).
Во втором случае можно настроить перенаправление в Tomcat, добавив ограничение безопасности в файл web.xml и добавив перенаправление в файл server.xml. Пример:
<security-constraint>
<web-resource-collection>
<web-resource-name>twx-portal</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Настройка перенаправления HTTP в HTTPS (необязательно)
Чтобы принудительно перенаправлять трафик HTTP в безопасное соединение, убедитесь, что для соединителя HTTP, определенного в server.xml, в атрибуте redirectPort задан правильный порт. Если соединитель не определен, добавьте его. Это должно выглядеть следующим образом:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Добавьте в файл WEB-INF/web.xmlограничение безопасности:
<security-constraint>
<web-resource-collection>
<web-resource-name>twx-portal</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Было ли это полезно?