Назад | Перейти на главную страницу

Избегайте раскрытия mod_status Apache с помощью Varnish

Коробка Ubuntu 9.04 с Apache на 8080 и Varnish на 80.

Недавно настроил Munin и задавался вопросом, почему графы Apache пусты. Видел из журналов, к которым обращается Мунин /server-status?auto и получение 403 Forbidden назад. Итак, я отредактировал /etc/apache2/monds-enabled/status.conf чтобы разрешить доступ из 127.0.0.1. Но это действительно сделало /server-status общедоступный, поскольку запросы, поступающие через Varnish, похоже, исходят от 127.0.0.1 слишком.

Итак, вопрос в том, как мне настроить mod_status быть доступным только для munin-node а не лаком?

Я решаю эту проблему, гарантируя, что Apache получит IP-адрес фактического посетителя, даже когда запросы проходят через кеш-память varnish. Для этого я использую Apache mod_rpaf (см. http://giantdorks.org/alain/easily-get-the-correct-client-ip-with-mod_rpaf/).

Кроме того, на случай, если запрос клиента также прошел через какой-то прокси, который установил заголовок X-Forwarded-For, я сбрасываю его в своем экземпляре кеша лака (в vcl_recv):

  remove req.http.X-Forwarded-For;
  set    req.http.X-Forwarded-For = client.ip;

Затем также скажите varnish никогда не кешировать ответ для / server-status и / server-info. Для меня работает следующее (также в vcl_recv):

  if (req.url ~ "server-(info|status)") {
    return (pass);
  }

Это похоже на решение, скажите, что вы думаете.

Varnish добавляет несколько заголовков HTTP, например X-Varnish на каждый запрос, который он отправляет в бэкэнд. Их можно использовать в конфигурации Apache для распознавания запросов, поступающих от Varnish.

В /etc/apache2/mods-enabled/status.conf:

<IfModule mod_status.c>

SetEnvIf X-Varnish ".+" from_varnish
ExtendedStatus On

<Location /server-status>
    SetHandler server-status
    Order allow,deny
    Deny from env=from_varnish
    Allow from localhost ip6-localhost 127.0.0.1

</Location>

</IfModule>

Затем скажите munin отслеживать порт 8080 вместо 80. Запросы от munin-node придет прямо и поэтому не будет X-Varnish набор заголовков.

Добавлен к /etc/munin/plugin-conf.d/munin-node:

[apache_*]
env.url   http://127.0.0.1:%d/server-status?auto
env.ports 8080

У меня была такая же ситуация с Ubuntu 12.04, Apache2 на порту 8008 и Varnish на порту 80. С Varnish VCL я использовал мою страницу состояния сервера, которая была кэширована в течение часа, поэтому она все еще была доступна, но предоставляла отчет о состоянии только тогда, когда кеш освежился. Внедрение решения Алена сделало текущий статус сервера доступным через Varnish по мере его передачи в бэкэнд. Чтобы защитить свой статус сервера, я сделал следующее:

Я настроил munin-node для прослушивания 8008 в /etc/munin/plugin-conf.d/munin-node:

[apache_*]
env.url   http://127.0.0.1:%d/server-status?auto
env.ports 8008

Затем я добавил следующую строку в свой VCL в верхней части раздела vcl_recv:

if (req.url ~ "^/server-status") {
error 403;
}

Это блокирует доступ к URL-адресу server-status на порту 80 с запрещенным сообщением 403, но munin-node все еще может подключиться к server-status на localhost: 8008

Этот пост был полезен: http://nwlinux.com/how-to-configure-varnish-on-ubuntu-server/