Spec-Zone.ru › Apache HTTP Server

Проблемы, связанные с DNS и Apache HTTP Server

Эта страница можно резюмировать следующим утверждением: не настраивайте Apache HTTP Server таким образом, чтобы он полагался на разрешение DNS для анализа конфигурационных файлов. Если httpd требует разрешения DNS для анализа конфигурационных файлов, то ваш сервер может быть подвержен проблемам надёжности (например, он может не запуститься) или атакам типа отказа в обслуживании и кражи данных (включая виртуальные хосты, способные красть трафик от других виртуальных хостов).

Простой пример

# This is a misconfiguration example, do not use on your server
<VirtualHost www.example.dom>
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

Для корректной работы сервера ему абсолютно необходимы две части информации о каждом виртуальном хосте: имя ServerName и, по крайней мере, один IP-адрес, к которому сервер будет подключаться и отвечать. В приведенном выше примере IP-адрес отсутствует, поэтому httpd должен использовать DNS для поиска адреса www.example.dom. Если по какой-либо причине DNS недоступен во время анализа конфигурационного файла сервером, то этот виртуальный хост не будет настроен. Он не сможет отвечать на запросы этого виртуального хоста.

Предположим, что www.example.dom имеет адрес 192.0.2.1. Тогда рассмотрим следующий фрагмент конфигурации:

# This is a misconfiguration example, do not use on your server
<VirtualHost 192.0.2.1>
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

В этот раз httpd должен использовать обратный DNS для поиска ServerName для этого виртуального хоста. Если обратный поиск завершится неудачно, то виртуальный хост будет частично отключен. Если виртуальный хост основан на имени, то он будет полностью отключен, но если он основан на IP-адресе, то он будет в основном работать. Однако, если httpd когда-либо должен будет сгенерировать полный URL для сервера, включающий имя сервера (например, при вызове редиректа), то он не сможет сгенерировать допустимый URL.

Вот фрагмент, который избегает обеих этих проблем:

<VirtualHost 192.0.2.1>
  ServerName www.example.dom
  ServerAdmin webgirl@example.dom
  DocumentRoot "/www/example"
</VirtualHost>

Отказ в обслуживании

Рассмотрим следующий фрагмент конфигурации:

<VirtualHost www.example1.dom>
  ServerAdmin webgirl@example1.dom
  DocumentRoot "/www/example1"
</VirtualHost>
<VirtualHost www.example2.dom>
  ServerAdmin webguy@example2.dom
  DocumentRoot "/www/example2"
</VirtualHost>

Предположим, что вы назначили 192.0.2.1 для www.example1.dom и 192.0.2.2 для www.example2.dom. Кроме того, предположим, что example1.dom имеет контроль над собственным DNS. С этой конфигурацией вы поместили example1.dom в позицию, позволяющую им украсть весь трафик, предназначенный для example2.dom. Для этого им нужно только установить www.example1.dom в 192.0.2.2. Поскольку они контролируют свой собственный DNS, вы не можете остановить их от указания записи www.example1.dom в любом месте.

Запросы, поступающие на 192.0.2.2 (включая все те, где пользователи ввели URL-адреса вида http://www.example2.dom/whatever), будут обрабатываться виртуальным хостом example1.dom. Для лучшего понимания причин этого требуется более глубокое обсуждение того, как httpd сопоставляет входящие запросы с виртуальным хостом, который будет их обрабатывать. Грубый документ, описывающий это, доступен.

Адрес "главного сервера"

Поддержка виртуальных хостов на основе имени требует, чтобы httpd знал IP-адрес(ы) хоста, на котором httpd работает. Для получения этого адреса используется либо глобальная переменная ServerName (если она присутствует), либо вызывается функция C gethostname (которая должна возвращать то же самое, что и написание "hostname" в командной строке). Затем выполняется поиск DNS по этому адресу. В настоящее время нет способа избежать этого поиска.

Если вы опасаетесь, что этот поиск может завершиться неудачно из-за сбоя вашего DNS-сервера, вы можете вставить имя хоста в /etc/hosts (где вы, вероятно, уже имеете его, чтобы машина могла загрузиться должным образом). Затем убедитесь, что ваша машина настроена на использование /etc/hosts в случае сбоя DNS. В зависимости от используемой ОС, это может быть выполнено путем редактирования /etc/resolv.conf, или, возможно, /etc/nsswitch.conf.

Если вашему серверу не нужно выполнять DNS по другим причинам, то вы, возможно, сможете запустить httpd с переменной окружения HOSTRESORDER, установленной в "local". Всё это зависит от используемой ОС и библиотек разрешения имен. Это также влияет на CGI, если вы не используете mod_env для управления средой. Лучше всего обратиться к страницам справки или вопросам часто задаваемых вопросов для вашей ОС.

Советы по предотвращению этих проблем

  • используйте IP-адреса в VirtualHost
  • используйте IP-адреса в Listen
  • убедитесь, что все виртуальные хосты имеют явное ServerName
  • создайте сервер <VirtualHost _default_:*>, который не имеет страниц для обработки

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/dns-caveats.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API