Как реализовать HTTP Strict Transport Security (HSTS) на AWS Elastic Load Balancer?

Я хочу внедрить HSTS в свое приложение.

У меня есть ELB, завершающий SSL и перенаправляющий трафик в мое приложение, которое является сервером apache, используемым в качестве обратного прокси.

Я знаю, что для реализации HSTS мне нужно добавить в свой запрос заголовок Strict-Transport-Security.

К сожалению, кажется, что я не могу реализовать его на своем сервере Apache, поскольку его нужно было бы добавить к виртуальному хосту HTTPS, а в моем Apache настроен только виртуальный хост http, поскольку SSL завершается на ELB.

Это означает, что ELB должен будет добавить заголовок Strict-Transport-Security к запросу, когда он передаст его вперед.

Как я могу это сделать? Могу ли я добавить какую-то политику безопасности, которая сделает это за меня?


person Pedreiro    schedule 30.10.2017    source источник


Ответы (4)


Я обратился в службу поддержки AWS, и я ответил, что в настоящий момент ELB не может добавлять заголовки HSTS в запросы от клиентов. Итак, я решил найти обходной путь, используя свой сервер Apache. Вот решение, которое я нашел:

В HSTS RFC говорится, что

Хост HSTS НЕ ДОЛЖЕН включать поле заголовка STS в ответы HTTP, передаваемые по незащищенному транспорту.

Затем я установил заголовок ПОСЛЕ перенаправления http => https в Apache. Поскольку это перенаправление имеет флаг [L], это означает, что перенаправление 301 не будет включать заголовок, но любой запрос https будет. Моя конфигурация apache выглядит так:

<VirtualHost *:80>
...
    #http=>https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

    #hsts
    Header set Strict-Transport-Security "max-age=31536000"
person Pedreiro    schedule 31.10.2017

Если вы работаете с Apache 2.4+, возможно, вы знакомы с выражениями. и директивы <If>, <ElseIf> и <Else>.

У меня сложная конфигурация между средой разработки, промежуточной и производственной средами, поэтому полагаться на флаг [L] с RewriteRule просто нереально для меня.

Это привело меня к следующему решению, которое я поместил в свой .htaccess:

<IfModule mod_headers.c>
    <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
        Header set Strict-Transport-Security "max-age=31536000"
    </If>
</IfModule>

Он лучше работает в моей среде, и я считаю, что он более надежен для соответствия RFC.

Вы можете отбросить "%{REQUEST_SCHEME} == 'https' часть, если никогда не обращаетесь к своим экземплярам напрямую, но это часть моего процесса отладки в моих средах разработки.

Большое спасибо Pedreiro за то, что он указал мне правильное направление фактических спецификаций HSTS RFC.

person eklingen    schedule 16.02.2018

Обратите внимание, что, поскольку это не поддерживается для Apache ‹2.4, лучше всего инкапсулировать его в <IfVersion >= 2.4>, например так:

    <IfVersion >= 2.4> 
        <IfModule mod_headers.c>
            <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
                Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
            </If>
        </IfModule>
    </IfVersion>
person Jesse James Portnoy    schedule 21.04.2020

Может быть? - Я решил аналогичный сценарий. имел в прошлом.

person jarnohenneman    schedule 31.10.2017
comment
Спасибо за статью. Сверху написано. В тандеме со строгой транспортной безопасностью HTTP (HSTS) это довольно надежная настройка для вашего ELB .. Итак, я полагаю, что он не реализует HSTS, но отключает SSLv2 и SSLv3. - person Pedreiro; 31.10.2017