web-dev-qa-db-ja.com

許可されたユーザーのApache認証?

私はこの質問への答えを読みました:

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は認証資格情報から処理しているユーザーの名前を知っているため)。

私の提案した解決策は、私がやりたいことを実行する資格がありますか?そうでない場合、解決策として何を提案しますか?

7
Nidal

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
5
Tony