Вопрос или проблема
У меня есть Apache с включенным mod_status и стандартной конфигурацией
<IfModule mod_status.c>
<Location /server-status>
SetHandler server-status
</Location>
</IfModule>
Я хочу разрешить доступ пользователям только через основное имя сервера, а не со всех настроенных виртуальных хостов.
http://mainservername/server-status #работает, и я хочу оставить это так
http://virtualhost1/server-status #работает, и я этого не хочу
http://virtualhost2/server-status #работает, и я этого не хочу
Есть ли способ включить модуль только для основного сервера или ограничить его для стандартного виртуального хоста?
Ответ или решение
Для решения вашей задачи, связанной с ограничением доступа к статусу сервера Apache через директиву server-status
, следует воспользоваться настройками Location
и VirtualHost
. Цель состоит в том, чтобы разрешить доступ к server-status
только с основного серверного имени и предотвратить доступ с других виртуальных хостов.
Теория
Когда вы включаете модуль mod_status
в Apache, он предоставляет ценную информацию о работе вашего сервера, включая статистику производительности, текущие соединения и многое другое. При использовании конфигурации <Location /server-status>
, вы устанавливаете обработчик для этой информации, что позволяет получить доступ к ней через указанный путь.
По умолчанию, все виртуальные хосты, настроенные на вашем сервере, будут наследовать данную настройку, что может подтолкнуть к нежелательной демонстрации информации о статусе сервера на всех виртуальных хостах. Однако, чтобы сохранить этот доступ исключительно для основного серверного имени, необходимо использовать дополнительные параметры и настройки безопасности, такие как Require host
или Require ip
, наряду с конфигурациями для виртуальных хостов.
Пример
Вот пример типичной конфигурации для ограничения доступа к server-status
только с основного серверного имени.
-
Отключение наследования глобальной конфигурации на уровне виртуальных хостов:
Для начала убедитесь, что
<Location /server-status>
указан только в основном конфигурационном файле вашего основного виртуального хоста. Таким образом, другие виртуальные хосты не будут наследовать эту настройку. Обычно это файл конфигурации<VirtualHost *:80>
или<VirtualHost *:443>
в зависимости от используемых портов.<VirtualHost *:80> ServerName mainservername DocumentRoot /path/to/your/document/root <IfModule mod_status.c> <Location /server-status> SetHandler server-status Require host mainservername # Вы также можете ограничить доступ по IP # Require ip 192.168.1.0/24 </Location> </IfModule> </VirtualHost>
В этом случае директива
Require host mainservername
гарантирует, что только запросы, содержащие имя хостаmainservername
, будут иметь доступ кserver-status
. -
Виртуальные хосты без доступа к
server-status
:Убедитесь, что в конфигурации других виртуальных хостов отсутствуют конфигурации для
server-status
. Таким образом, они не смогут наследовать эту настройку или использовать ее.<VirtualHost *:80> ServerName virtualhost1 DocumentRoot /path/to/virtualhost1/document/root # Без указания конфигурации Location для server-status </VirtualHost> <VirtualHost *:80> ServerName virtualhost2 DocumentRoot /path/to/virtualhost2/document/root # Без указания конфигурации Location для server-status </VirtualHost>
Применение
Теперь, после внедрения этой конфигурации, вы обеспечите доступ к информации о статусе сервера, позволяя его только с основного серверного имени. Использование директивы Require host
ограничивает доступ, основанный на имени хоста, что делает эту настройку надежной и эффективной для вашей ситуации. Если у вас есть дополнительные IP-адреса, которые должны иметь доступ, можно комбинировать Require host
и Require ip
для более гранулярной настройки доступа.
Не забудьте перезапустить сервер Apache после изменения конфигурации, чтобы изменения вступили в силу:
sudo apachectl restart
Таким образом, следуя этим рекомендациям, вы сможете значительно увеличить безопасность доступа к вашим служебным данным и защитить их от несанкционированного доступа пользователей других виртуальных хостов.