Объедините ограничение IP и авторизации пользователя для подпапки в apache 2.4

Я хочу ограничить доступ к полному веб-сайту (apache 2.4) определенными IP-адресами. Кроме того, я хочу ограничить доступ к определенным подпапкам с помощью аутентификации пользователя. Авторизация пользователя не работает. Вот что я получил:

В конфигурации vhost у меня есть

<Location />
    # Localhost
    Require ip 127.0.0.1i
    # some other IP
    Require ip 1.2.3.4
<Location>

Теперь я хочу, чтобы подпапка /secure/ требовала действительного входа пользователя

<webroot>/secure/.htaccess похоже

<RequireAll>
    Require all granted
    Require user user1 user2 user3
    AuthBasicProvider file
    AuthType Basic
    AuthName "Secure Folder Login"
    AuthUserFile /securePath/userAuth
</RequireAll>

Я все еще могу получить доступ к /secure с IP 1.2.3.4 без аутентификации пользователя. Похоже, что apache сопоставляет IP с директивой Require ip 1.2.3.4 (внутри неявного RequireAny) и не заботится о возможных дополнительных ограничениях в дальнейшем.


person Armin    schedule 20.11.2014    source источник
comment
Вот некоторое решение: если на вашем сервере включен mod_access_compat, вы можете использовать старый синтаксис Apache, чтобы сделать это работает, как ожидалось. Код в ссылке имеет IfModule проверки, поэтому, когда модуль отсутствует, он вернется к более новому синтаксису и поведению, при котором он игнорирует аутентификацию. К сожалению, окончательного ответа на этот вопрос не нашел.   -  person Shikkediel    schedule 12.07.2020


Ответы (2)


Если вы хотите заблокировать любой IP-адрес, но только тот, который находится в вашем списке, и предоставить базовый логин, запрашиваемый для разрешенных IP-адресов, вы можете сделать что-то вроде (внутри вашего .htaccess):

Require all denied
<RequireAll>
    Require valid-user
    Require ip 100.04.04.04
    AuthBasicProvider file
    AuthType Basic
    AuthName "Secure Folder Login"
    AuthUserFile /htdocs/www/web_projects/.htpasswd
</RequireAll>

и для нескольких IP-адресов должно работать что-то вроде следующего:

Require all denied    
<RequireAll>
    <RequireAny>
        Require ip 78.53.160.0/19
        Require ip 80.171.1.0/24
        Require ip 80.171.2.0/23
        Require ip 80.171.4.0/22
        Require ip 80.171.8.0/21
        Require ip 80.171.16.0/20
        Require ip 80.171.32.0/19
        Require ip 80.171.64.0/18
    </RequireAny>
    <RequireAll>
        Require valid-user
        AuthBasicProvider file
        AuthType Basic
        AuthName "Secure Folder Login"
        AuthUserFile /htdocs/www/web_projects/.htpasswd
    </RequireAll>
</RequireAll>
person BastianW    schedule 14.08.2016
comment
По какой-то причине это также игнорирует аутентификацию, когда IP-адрес совпадает. - person Shikkediel; 12.07.2020

По крайней мере, Location (вне директив Location, Directory, File и .htaccess), кажется, оценивается отдельно, последним и в обратном порядке появления. Я не проверял полностью, и я не мог найти документы по нему.

Ну короче говоря

Я мог добиться того, чего хотел, поместив

<Location /secure/>
    Require all denied
    <RequireAll>
        Require user user1 user2 user3
        AuthBasicProvider file
        AuthType Basic
        AuthName "Secure Folder Login"
        AuthUserFile /securePath/userAuth
    </RequireAll>
</Location>

ниже блока <Location />Require ip 1.2.3.4</Location> в конфигурации виртуального хоста (выше не работало). Использование блока <Directory> или блока .htaccess не сработало.

person Armin    schedule 20.11.2014