Почему не работает проверка подлинности Apache Basic?


14

Я только что обновил Apache с его сборки 2003 года до совершенно новой версии 2.4.1. Все кажется довольно хорошим, за исключением одной явной вещи:

В моем файле httpd.conf у меня есть следующее:

<Directory />
    AllowOverride none
    Options FollowSymLinks
    AuthType      Basic
    AuthName      "Enter Password"
    AuthUserFile  /var/www/.htpasswd
    Require     valid-user
</Directory>

Это должно позволить только пользователям в указанном файле авторизации получать доступ к серверу - так же, как это было в более старой версии Apache. (Правильно?)

Тем не менее, это не работает. Запросы предоставляются без аутентификации. Когда я переключаю запись в LogLevel Debug для доступа, он говорит:

[Sat Mar 24 21:32:00.585139 2012] [authz_core:debug] [pid 10733:tid 32771] mod_authz_core.c(783): [client 192.168.1.181:57677] AH01626: authorization result of Require all granted: granted
[Sat Mar 24 21:32:00.585446 2012] [authz_core:debug] [pid 10733:tid 32771] mod_authz_core.c(783): [client 192.168.1.181:57677] AH01626: authorization result of <RequireAny>: granted

Я действительно не знаю, что это значит - и у меня (насколько мне известно) нет ни одного «Требовать все предоставленные» или «» заявления ни в одном из моих файлов.

Любые идеи, почему это не работает, или где отлаживать?

ОБНОВИТЬ:

У меня есть виртуальный хост на порту SSL, который позволяет проксировать. Когда я ставлю те же записи внутри

<proxy *> 

пункт в конфиге virtualhost, все работает . Кажется, это не работает в

 <Directory> 

пункт. Затем я попытался поместить под другие пункты Справочника (специфичные для других каталогов), и это тоже не сработало.

ТАКЖЕ

Из приведенных ниже вопросов Шейна - я попытался скопировать корневой блок "/" в каталог "/ tmp". Каталог / tmp работает ПРАВИЛЬНО !! Итак - эта проблема специфична только для корневого каталога ???


1
Какие еще <Directory>блоки вы применяете к запросам, которые не работают?
Шейн Мэдден

Я просто поставил один для корневого каталога "/", который должен применяться ко всему серверу. Я попытался добавить один в домашний каталог пользователя (по mod_userdir) и получил те же результаты с этим.
Брэд

@ShaneMadden - по вашему вопросу - я попытался скопировать корневой блок "/" в каталог "/ tmp". Каталог / tmp работает ПРАВИЛЬНО !! Итак - эта проблема специфична только для корневого каталога ???
Брэд

Я подозреваю, что <Directory>в вашей конфигурации Apache есть более специфический блок, который имеет приоритет над тем, который вы установили /.
Шейн Мэдден

Я просто сгорбил все - ничего. Эти конфигурационные файлы были очень минимальными модификациями недавно установленных по умолчанию Apache.
Брэд

Ответы:


12

У меня была похожая проблема с дайджест-аутентификацией при новой установке 2.4. Внимательно изучив документацию на сайте Apache, похоже, что директивы аутентификации должны быть в <Location>теге, а не в <Directory>теге. Смотрите документацию по директиве AuthBasicProvider .


2
Это не правильно. mod_auth_basic и mod_auth_digest могут использоваться в <Directory> и <Location>, а также в <File> <If> и <Proxy>. В документации по Apache 2.4 -> httpd.apache.org/docs/current/mod/… В разделе «Контекст» указан «Каталог», в котором указаны все указанные выше действительные контейнеры. -> httpd.apache.org/docs/current/mod/directive-dict.html#Context
JadedCore

Это не должно быть правильно, но это сработало для меня. Может быть, это связано с тем, что в разделе «Каталог» были другие настройки (например, RewriteRule)
paul.ago

6

Я столкнулся с той же проблемой, и ничто из этого поста не помогло мне, поэтому я добавлю свои 2 цента. В моем случае (apache 2.4) проблема заключалась в последовательных директивах Require .

По умолчанию, если у вас есть несколько директив Require , они рассматриваются как<RequireAny>

По моему <Directory>у меня было

Require ip 192.168.100.0/24 10.9.8.0/24
Require valid-user

Таким образом, запрос авторизации не появился, если IP был верным. Мне пришлось переключить Require логики с <RequireAny>на <RequireAll>и кажется, что теперь все работает правильно.

   <Directory /var/www>

      DirectoryIndex index.html
      Options -Indexes

      AuthType Basic
      AuthName "hidden data"
      AuthBasicProvider    file
      AuthUserFile /opt/httpaswd
      <RequireAll>
        Require ip 192.168.100.0/24 10.9.8.0/24
        Require valid-user
      </RequireAll>
    </Directory>

5

Jscott ответ неверный. Apache 2.4, безусловно , делает позволяют директивы аутентификации в <Directory>контейнерах. Более того, это единственный безопасный способ реализации аутентификации, поскольку к <Location>контейнерам можно обращаться по-разному, что позволяет обойти вашу аутентификацию, если вы не будете осторожны. Для справки, вот пример контейнера, который я использую в производственной системе:

<Directory "/srv/http/my_domain.org/html/secret-stuff"> Options Indexes Multiviews FollowSymLinks AuthType Digest AuthName "staff" AuthUserFile /etc/httpd/private/secret-stuff.htaccess Require valid-user </Directory>


1

Вы, кажется, пропускаете поставщика для AuthBasic. Попробуйте добавить строку вроде:

AuthBasicProvider    file

Если у вас есть эта работа, вы можете посмотреть на Satisfyдирективу. Это можно использовать для локального доступа без пароля, при этом требуется пароль для доступа в Интернет.

РЕДАКТИРОВАТЬ: я использую включаемый файл для BasicAuth, чтобы разрешить удаленный доступ на основе пароля к контенту, который обычно недоступен из Интернета. Вы можете не хотеть Satisfyдирективы. Это мой /etc/apache2/basicauth.confфайл:

# Basic authorization configuration include file 
# Enable basic auth access for remote users
AuthName             "Authentication Required"
AuthType             Basic
AuthBasicProvider    file
AuthUserFile         /etc/apache2/httpd.passwd
Require              valid-user
Satisfy              any

У меня также есть /etc/apache2/allow_local.confвключаемый файл для аутентификации на основе IP.

# Common local access block - Allow all local addresses
Order deny,allow
Deny  from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
Allow from 192.168.1.0/24

Чтобы включить их, я использую эти включает.

Include /etc/apache2/allow_local.conf
Include /etc/apache2/basicauth.conf

Вы можете попробовать добавить к спецификации авторизации. Это работает с моей тестовой конфигурацией.

Order deny,allow
Allow from all

Пробовал - до сих пор не работает: -O
Брэд

Если я просто включаю ваши файлы как есть, я получаю сообщение об ошибке: «AuthName здесь не разрешено» - поскольку вы не можете нигде указать эти директивы (например, вне предложения «Location», «Directory» или «Proxy». Или я что-то упустил? Если я включу это в раздел «Каталог» - опять же - меня впустят без каких-либо учетных данных.
Брэд

Если я добавлю «deny from all» в предложение «directory», мне будет отказано в доступе (как и следовало ожидать). Если затем включить ваш сценарий FIRST в предложение каталога, мне безоговорочно разрешат доступ. Если я уберу слово «удовлетворить» в вашем сценарии, мне безоговорочно будет отказано.
Брэд

0

У меня была та же проблема, и это, вероятно, ошибка Apache; в моем случае проблема обнаружилась после обновления и исчезла после последующего обновления, но мне пришлось добавить это внизу:

Deny from all

Страшно, что Apache может открыть дыры в безопасности вот так :(


Deny from allявляется настройкой Apache 2.2. httpd.apache.org/docs/2.4/upgrading.html#run-time
danger89

да, изменение директив, связанных с безопасностью, обратно несовместимым способом - baaaaaad
greg

0

Пытаться:
<Directory "/"> ... </Directory>

Вместо того:
<Directory /> ... </Directory>

Значение: заключить корневой символ в двойные кавычки. В противном случае вы можете закрыть тег с этой косой чертой.


0

Также проверьте, нет ли случайно другого

    Require all granted

в другом месте в том же каталоге конфигурации. это может перевесить ваш

    Require     valid-user
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.