2016-10-05 10 views
1

.htaccess設定を使用して自分のサイトからのパスをブロックしたいとします。特定のIPのセットだけが、基本認証を使用して認証された後、URLからその特定のパスにアクセスできるという考えがあります。.htaccess基本認証とIP制限の組み合わせ

注:これはパスであり、ページまたはディレクトリではありません。私たちはウェブサービスを保護しようとしているので、URLへのポストコールしかありません。

私は、URL example.com/restをブロックし、IPに基づいてそのURLの背後にあるすべてのものをブロックしたいと思います。したがって、example.com/rest/fooexample.com/rest/foo/barはブロックする必要があります。

アプリケーションからの他のすべてのパスは、基本的な認証なしで機能し続ける必要があります。

IPブロック部分は前にquestionで解決されました。

基本的な構成(ブロックする部分は.htaccessには多くありますが、この質問には関係ありません)。以下で見つけることができます。

SetEnvIf Request_URI "/rest(/.*)?$" rest_uri 
# Check on what subdomain we are. 
SetEnvIf Host ^local\. None_Prod_Env 

# Static 
SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host 
# Range 
SetEnvIf AH_CLIENT_IP ^123\.123\.123\. Allow_Host 

Order deny,allow 
Deny from all 
Allow from env=!rest_uri 
Allow from env=Allow_Host 
Allow from env=None_Prod_Env 

ブロック以上のように、構成/休憩に/ *ではなく、非残りパスへのすべてのアクセスは、ユーザがIP X(Allow_Host変数)から来ることができますし、我々はこのケースではどれも生産環境がローカル許します。

私はそうのような基本的な認証で、この機能を拡張しようとしました:

SetEnvIf Request_URI "/rest(/.*)?$" rest_uri 
SetEnvIfNoCase Request_URI "/rest(/.*)?$" require_auth=true 

# ... Allow Host stuff and none prod stuff ... 

Order deny,allow 
Deny from all 
Allow from env=!rest_uri 
Allow from env=Allow_Host 
Allow from env=None_Prod_Env 

AuthName "Password Protected" 
AuthType Basic 
AuthBasicProvider file 
AuthUserFile /var/www/html/.htpasswd 
Require valid-user 

しかし、これはすべてのページ上だけではなく/休憩/ * URLの基本的な認証が生じました。私はそれをたくさん演奏しましたが、それを理解できませんでした。 SetEnvIfNoCaseからSetEnvIfに変更することも役に立ちませんでした。

注:当社のサーバーでは、Apache 2.2.22が動作しています。

答えて

1

あなたは、いくつかのApacheのディレクティブの組み合わせを使用して、この複雑な問題を解決することができますがmod_dirmod_setenvmod_auth_basic、すなわち:

SetEnvIf Request_URI ^/rest(/.*)?$ rest_uri 
# Check on what subdomain we are. 
SetEnvIf Host ^local None_Prod_Env 

# Static 
SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host 
# Range 
SetEnvIf AH_CLIENT_IP ^192\.168\. Allow_Host 

RewriteEngine On 

# block if request is /rest/* and IP is not whitelisted and not localhost 
RewriteCond %{ENV:rest_uri} =1 
RewriteCond %{ENV:None_Prod_Env} !=1 
RewriteCond %{ENV:Allow_Host} !=1 
RewriteRule^- [F] 

# ask auth for /rest/* && NOT localhost && whitelist IP 
AuthType Basic 
AuthName "Password Protected" 
AuthUserFile /var/www/html/.htpasswd 
Require valid-user 

Order deny,allow 
Deny from all 
Allow from env=!rest_uri 
Allow from env=!Allow_Host 
Allow from env=None_Prod_Env 
Satisfy any 
1

コードにsatisfy anyを追加してください。このように試してみてください。

SetEnvIf Request_URI "/rest(/.*)?$" rest_uri 
SetEnvIf Referer "^http://local\.example\.com/" None_Prod_Env 

AuthName "Password Protected" 
AuthType Basic 
AuthBasicProvider file 
AuthUserFile /var/www/html/.htpasswd 
Require valid-user 

Order deny,allow 
Deny from all 
Allow from env=!rest_uri 
Allow from env=Allow_Host 
Allow from env=None_Prod_Env 
Satisfy any 
+0

それは部分的に動作させるということにではないが、それは、認証画面が表示されるでしょうホワイトリストに登録されたIPですが、ホワイトリストに登録されているIPの場合は、認証が表示されません。 – Bram

+0

認証と有効な両方のIPが必要ですか? 'Satisfy all 'を試すことができます –

+0

ユーザはホワイトリストに登録されたIP上にあり、正常に認証されているか、local.example.com/restにいるときに認証とIP制限をバイパスできます。最初の部分は現在より重要です。 – Bram

関連する問題