HSTS: Как настроить с помощью Terraform

HTTP Strict Transport Security (HSTS) – это механизм политики безопасности веб-браузера‚ который помогает защитить веб-сайты от атак типа «man-in-the-middle» (MITM). Он заставляет браузеры взаимодействовать с веб-сайтом только через защищенное HTTPS-соединение. В этой статье мы рассмотрим‚ как настроить HSTS с помощью Terraform‚ инфраструктурного инструмента как код.

Что такое HSTS и зачем он нужен?

Когда пользователь впервые посещает веб-сайт через HTTPS‚ сервер может отправить заголовок HSTS. Этот заголовок сообщает браузеру‚ что в будущем он должен подключаться к этому веб-сайту только через HTTPS‚ даже если пользователь введет «http://» в адресной строке. Это предотвращает понижение соединения до небезопасного HTTP‚ которое может быть использовано злоумышленниками для перехвата данных.

Преимущества использования HSTS:

  • Защита от MITM-атак: Предотвращает перехват и изменение трафика между пользователем и сервером.
  • Улучшение безопасности: Гарантирует‚ что все соединения с веб-сайтом будут зашифрованы.
  • Повышение доверия пользователей: Демонстрирует приверженность безопасности и защите данных пользователей.

Настройка HSTS с помощью Terraform

Настройка HSTS обычно выполняется путем добавления заголовка Strict-Transport-Security в HTTP-ответы сервера. Terraform позволяет автоматизировать этот процесс‚ особенно при использовании облачных провайдеров‚ таких как AWS‚ Azure или Google Cloud. Мы рассмотрим пример настройки HSTS для веб-сервера‚ работающего за балансировщиком нагрузки;

Пример для AWS Application Load Balancer (ALB)

В AWS‚ HSTS можно настроить через правила прослушивателя (listener rules) ALB. Terraform позволяет определить эти правила в коде.


resource "aws_lb_listener_rule" "hsts_rule" {
 listener_arn = aws_lb_listener.https_listener.arn
 priority = 100

 condition {
 path_pattern = "/*"
 }

 action {
 type = "forward"
 target_group_arn = aws_lb_target_group.web_server.arn
 }
 add_header {
 name = "Strict-Transport-Security"
 value = "max-age=31536000; includeSubDomains; preload"
 }}

Разберем код:

  • resource "aws_lb_listener_rule" "hsts_rule": Определяет ресурс правила прослушивателя.
  • listener_arn = aws_lb_listener.https_listener.arn: Указывает ARN прослушивателя HTTPS.
  • priority = 100: Определяет приоритет правила.
  • condition { path_pattern = "/*" }: Применяет правило ко всем путям.
  • action { type = "forward"; target_group_arn = aws_lb_target_group.web_server.arn }: Перенаправляет трафик в целевую группу веб-сервера.
  • add_header { name = "Strict-Transport-Security"; value = "max-age=31536000; includeSubDomains; preload" }: Добавляет заголовок HSTS с указанными параметрами.

Параметры заголовка HSTS:

  • max-age=31536000: Указывает‚ как долго браузер должен запоминать‚ что к этому сайту следует подключаться только через HTTPS (в секундах). В данном случае – 1 год.
  • includeSubDomains: Указывает‚ что HSTS распространяется на все поддомены веб-сайта.
  • preload: Указывает‚ что веб-сайт может быть включен в список предварительной загрузки HSTS‚ который встроен в большинство современных браузеров. Это обеспечивает защиту даже при первом посещении сайта. Внимание: Для использования `preload` необходимо соответствовать определенным требованиям и подать заявку на включение в список.

Пример для Nginx с помощью Terraform

Если вы используете Nginx в качестве веб-сервера‚ вы можете настроить HSTS‚ добавив директиву в конфигурационный файл Nginx. Terraform может управлять этим файлом.


resource "null_resource" "nginx_config" {
 provisioner "local-exec" {

 command = "sed -i 's/server {/server {
 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";/' /etc/nginx/conf.d/default.conf"
 }
 depends_on = [
 # Зависимости‚ например‚ перезапуск Nginx
 null_resource.nginx_restart
 ]
}
resource "null_resource" "nginx_restart" {
 provisioner "local-exec" {
 command = "sudo systemctl restart nginx"
 }
}

Разберем код:

  • resource "null_resource" "nginx_config": Определяет ресурс для выполнения произвольных команд.
  • provisioner "local-exec": Указывает‚ что команда будет выполнена локально на машине‚ где запускается Terraform.
  • command = "sed -i ... /etc/nginx/conf.d/default.conf": Использует команду sed для добавления директивы HSTS в конфигурационный файл Nginx.
  • depends_on = [null_resource.nginx_restart]: Гарантирует‚ что Nginx будет перезапущен после изменения конфигурационного файла.

Важные замечания

  • Предварительная загрузка HSTS: Перед включением директивы preload убедитесь‚ что ваш веб-сайт полностью поддерживает HTTPS и не имеет проблем с сертификатами.
  • Тестирование: После настройки HSTS тщательно протестируйте свой веб-сайт‚ чтобы убедиться‚ что все работает правильно.
  • Отмена HSTS: Если вам необходимо отключить HSTS‚ вам придется подождать‚ пока не истечет срок действия max-age‚ или использовать механизм отмены HSTS.

Настройка HSTS с помощью Terraform позволяет автоматизировать процесс обеспечения безопасности вашего веб-сайта. Используя примеры‚ представленные в этой статье‚ вы можете легко интегрировать HSTS в свою инфраструктуру и защитить своих пользователей от MITM-атак. Помните о важности тестирования и правильной конфигурации параметров HSTS для достижения максимальной эффективности.