Apache-2.4

HTTP Basic Auth 除非從辦公室使用 Apache 2.4 連接?

  • June 9, 2015

我們希望建立一個僅用於展示目的的網站,我們可以:

  1. 通過 HTTP Basic Auth 輸入使用者名和密碼,從 Internet 的任何地方訪問。
  2. 為了便於使用,我們希望不必從辦公室通過 HTTP Basic Auth,我們的辦公室將從 202.161.24.210 連接。
  3. 展示站點的某些部分需要向自身發出 REST 請求,因此我們也希望將 127.0.0.1 和 ::1 列入白名單。

我們似乎已經實現了 2 和 3,但 1 並沒有像我們想像的那樣工作,我們的使用者不斷收到 HTTP Basic Auth 使用者名和密碼的提示,即使他們已經過身份驗證並且要訪問不同的頁面網站。我們從日誌中註意到,他們在訪問某些資產時收到以下錯誤消息:

[Tue Jun 09 10:50:03.442834 2015] [access_compat:error] [pid 5740:tid 140705259312896] [client 78.52.242.163:62774] AH01797: client denied by server configuration: /var/www/docroots/stage/lib/yui/build/moodle-core-checknet/assets/checknet.txt, referer: http://stage.example.org/mod/scorm/player.php

這是我們的 Apache 虛擬主機:

<VirtualHost *:80>
ServerName stage.example.org

DocumentRoot /var/www/docroots/stage
   <Directory /var/www/docroots/stage>
       Options Indexes FollowSymLinks MultiViews
       AllowOverride None

       # Only visible on Office network or anyone with a valid password.
       AuthType Basic
       AuthName "Authorisation Required"
       AuthUserFile "/var/www/htpasswd"
       Require valid-user
       Order allow,deny
       Allow from 202.161.24.210 127 ::1
       Satisfy any
   </Directory>
</VirtualHost>

我們在 CentOS 7 上執行 Apache 2.4.6。我們的配置是否正確?看起來我們的配置確實適用於頂級文件/var/www/docroots/stage以及直接位於其下的子目錄下的其他圖像、css 和 javascript 文件,但它是否會在一定數量的子目錄後忘記 HTTP Auth?SELinux 處於許可模式。

如果沒有完整的錯誤消息(我希望是模組和 IP 地址),這有點猜測,但您正在混合來自 Apache 2.4 中兩個不同模組的 Require指令,來自 mod-authz-core 的指令和“舊版”指令Allow並且 Order來自 mod-access-compat,它可能不會很好地堆疊。

您可以嘗試更換線路

Order allow,deny
Allow from 202.161.24.210 127 ::1

與以下

Require ip  202.161.24.210 127 ::1/128

已經存在**Satisfy any**的應該滿足您的要求。

您的第三個要求:

展示站點的某些部分需要向自身發出 REST 請求…

如您所料,可能不會從環回地址訪問伺服器,但可能配置了與伺服器的公共 IP 地址類似的 FQDN,http://api.example.com/rest?並且源自伺服器的公共 IP 地址。

您可以添加伺服器的公共 IP 地址,但這更容易從 Apache 2.4 解決;如果以下任一條件為真,則本地提供者允許訪問伺服器:

  • 客戶端地址匹配 127.0.0.0/8
  • 客戶地址是::1
  • 連接的客戶端和伺服器地址都相同

因此,不要列出環回 ip-addresses,而是使用:

Require valid-user
#  Office Gateway:
Require ip 202.161.24.210 
#  API access from this host:   
Require local            
#  Only one or more of the above needs to match:
Satisfy any                  

引用自:https://serverfault.com/questions/697527