私はこの質問への答えを読みました:
https://stackoverflow.com/questions/4102763/Apache-basic-authentication-except-for-those-allowed
一部のユーザーを認証しない方法を理解するのに役立ちました(IPによる):
<Directory /var/www/files/>
Require valid-user
Allow from 192.168.1.2
Satisfy Any
AuthUserFile /etc/Apache2/basic.pwd
AuthName "Please enter username and password"
AuthType Basic
</Directory>
私がこのDBを持っていると想像してください(認証に使用されるDBとは異なります):
User IP
Mark 192.168.1.2
Mike 192.168.1.3
Karl 192.168.1.4
1- Apacheの構成を使用して、DBに保存されているすべてのIPアドレスを許可できますか?静的なソリューションは必要ありません(DBは動的に変化しています)?
2-別の問題は、許可されたIPの承認が失われることです。ユーザーが認証なしでページを取得することを許可されている場合、ApacheはこのDBを承認に使用できますか?詳細:Apacheがユーザーを認証するとき、ユーザー名は認証資格情報ですが、Allowingを使用すると、ユーザー名が失われます。Apacheに、IPアドレスを抽出するのと同じテーブルから許可するIPのユーザー名を抽出させたいですか?
更新:
注: Tony の回答が役立つかもしれませんが、他の回答も必要です(モジュールを作成する必要はありません)。
この質問の私の目標は「シングルサインオン」です。
freeradius を使用して内部(ネットワーク内)ユーザーを認証しているので、Apacheにユーザーを再認証させたくありません。
LDAPを使用してApacheに外部ユーザーを認証させたい。
Allow
ディレクティブを使用して内部ユーザーに認証なしを許可することですが、DBの使用を許可する必要があります(最初の問題)?内部ユーザー(認証しなかった)を承認するようにApacheを構成しようとしていますか(2番目の問題)?注:外部ユーザーの承認は、 [〜#〜] ldap [〜#〜] を使用すると非常に簡単です(Apacheは認証資格情報から処理しているユーザーの名前を知っているため)。
私の提案した解決策は、私がやりたいことを実行する資格がありますか?そうでない場合、解決策として何を提案しますか?
mod-auth external を試しましたか?Apacheのカスタム認証メカニズムを実行できます。
IP、USER、PASSなどの環境変数にアクセスできます。使い慣れた言語でスクリプトを記述し、データベースから認証データをフェッチすることができます。
ウィキにはいくつかの例があります。
カスタム認証スクリプトを作成する場合は、適切にコーディングされていることを確認してください(セキュリティ面で)。
このモジュールは、CentOS(mod_authnz_external)およびUbuntu(libapache2-mod-authnz-external)で利用できます。
基本的なApache構成の例を次に示します。
LoadModule authnz_external_module modules.d/mod_authnz_external.so
DefineExternalAuth my_auth environment /tmp/auth.sh
<Location />
AuthType Basic
AuthName "My super special access"
AuthBasicProvider external
Require valid-user
AuthExternal my_auth
</Location>
これは、IP、ユーザー、およびパスワードをログに記録し、提供されたユーザーが「Tony」である場合にのみ認証を受け入れる非常に単純なスクリプトです。
この特定の例では、スクリプトは実行可能ビットが設定された状態で/tmp/auth.shの下に保存されます。好きなことを行うことができます(IP、ユーザー名などでフィルタリングします)。
#!/bin/bash
echo $(date) ${IP} >> /tmp/log.txt
echo $(date) ${USER} >> /tmp/log.txt
echo $(date) ${PASS} >> /tmp/log.txt
#Very basic filtering.
if [[ "${USER}" != "Tony" ]]
then
exit 1;
fi