私はこの質問に対する答えを読んだ。
https://stackoverflow.com/questions/4102763/apache-basic-authentication-book-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>
次のデータベースがあるとします(認証に使用されるデータベースとは異なります)。
User IP
Mark 192.168.1.2
Mike 192.168.1.3
Karl 192.168.1.4
1- Apacheの設定を使用してデータベースに保存されているすべてのIPアドレスを許可できますか?静的ソリューションは必要ありませんか(データベースが動的に変更されます)?
2 - もう1つの問題は、許可されたIPに対する認証が失われることです。ユーザーが認証なしでページをインポートすることを許可されている場合、Apacheは認証にこのデータベースを使用できますか?詳細:Apacheがユーザーを認証するときにユーザー名認証資格情報を知っていますが、許可されている場合はユーザー名が失われ、Apacheに同じテーブルから許可されたIPを取得したいですか?ユーザー名からIPアドレスを取得します。
修正する:
注:私の考えではトニー答えは役に立ちますが、他の答えも望んでいます(モジュールを書く必要はありません)。
この質問の私の目標は「シングルサインオン」です。
私は使う自由半径内部(ネットワーク内部)ユーザーは認証されているため、Apacheはそのユーザーを再認証したくありません。
ApacheはLDAPを使用して外部ユーザーを認証したいと思います。
- 私の解決策は、内部ユーザーが認証なしで使用できるようにディレクティブを使用することです
Allow
。しかし、内部ユーザーがデータベースを使用できるようにする必要がありますか(最初の質問)?そして、内部ユーザーに権限を付与するようにApacheを設定しようとしています(認証するものではありません)(2番目の質問)?
注:外部ユーザー認証は非常に使いやすいです。LDAP(Apacheは認証資格情報を介して処理するユーザーの名前を知っているからです。)
私が提案するソリューションが私がやりたいことに適していますか?そうでない場合は、どのソリューションを提案しますか?
答え1
試してみましたか?モード認証外部、Apacheの認証メカニズムをカスタマイズできます。
IP、USER、PASSなどの環境変数へのアクセスを提供します。おなじみの言語でスクリプトを作成し、データベースから認証データをインポートできます。
Wikipediaにはいくつかの例があります。
カスタム認証スクリプトを作成する場合は、セキュリティの観点からよくコーディングされていることを確認してください。
このモジュールは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