Можно ли безопасно использовать директиву Apache Location для настройки доступа к серверу?

В моей конфигурации Apache я сначала запрещаю доступ ко всей файловой системе:

<Directory />
    Require all denied
</Directory>

Затем в конфигурации для каждого виртуального хоста разрешаю неограниченный доступ:

<VirtualHost ...>
    <Directory /var/www/example.com/>
        Require all granted
    </Directory>
</VirtualHost>

Или требуйте аутентифицированный доступ:

<VirtualHost ...>
    <Directory /var/www/example.com/>
        AuthType Basic
        AuthName "example.com"
        AuthUserFile htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

Я заметил в документации Apache, что:

Для содержимого, находящегося в файловой системе, используйте ‹Каталог> и ‹Файлы>. Исключение составляет ‹Местоположение />, которое позволяет легко применить конфигурацию ко всему серверу.

И я задался вопросом, может ли использование <Location /> быть способом требовать аутентифицированного доступа для определенного виртуального хоста:

<VirtualHost ...>
    <Location />
        AuthType Basic
        AuthName "example.com"
        AuthUserFile htpasswd
        Require valid-user
    </Location>
</VirtualHost>

Но в документации Apache указано, что:

Директивы ‹Location> не должны использоваться для управления доступом к расположениям файловой системы.

Это заставило меня задаться вопросом, является ли не следует рекомендацией для директив <Location> в целом, и может ли в определенных ситуациях директива <Location />, в частности, использоваться в качестве исключения для разрешения доступа , или, другими словами, можно ли безопасно использовать директиву Apache <Location> для настройки доступа к серверу?


person Monica For CEO    schedule 23.09.2013    source источник


Ответы (1)


Нет Также из документации Apache:

Уделяйте особое внимание взаимодействию директив Location и Directory; например, даже если ‹Directory /> запрещает доступ, директива ‹Location /> может его отменить.

Насколько я понимаю, поскольку любая директива <Location> потенциально может отменить любую директиву <Directory>[1], наименее ограничительная директива <Location> не должна быть менее ограничительной, чем наиболее ограничительная директива <Directory> для всего сервера.

Начиная с разумного <Directory /> значения по умолчанию Require all denied и следуя приведенному выше правилу, любая директива <Location> должна быть не менее ограничительной, чем Require all denied, что, конечно же, вообще сделает невозможным доступ к серверу.

Также обратите внимание, что целью директивы <Location> является настройка ресурсов, находящихся за пределами файловой системы.

Суть в том, что для любых запросов, которые могут касаться файловой системы, для любых директив <Location>, которые могут применяться к любому из этих запросов, применимые директивы <Location> не должны включать оператор Require.[2]

[1]: например, с помощью символических ссылок.
[2]: можно использовать разрешения файловой системы или такие инструменты, как apparmor, чтобы уменьшить дыру в безопасности, включив оператор Require в определенные директивы <Location>, но помните принцип Эшелонированная защита.

person Monica For CEO    schedule 23.09.2013