ApacheとLDAPを使用してユーザーをリダイレクトする

ApacheとLDAPを使用してユーザーをリダイレクトする

職場では、Apache2 経由で管理されている URL にユーザーがアクセスしたときに、ユーザーが特定の LDAP グループのメンバーであるかどうかに応じてユーザーをリダイレクトしたいという問題が発生しています。

3つのケースがあります:

  • ユーザーが有効な資格情報を提供し、LDAP グループのメンバーである場合 => アプリケーション ABC にリダイレクトされます (動作)
  • ユーザーは有効な認証情報を提供しますが、LDAP グループのメンバーではありません => メンテナンス ページにリダイレクトされます (機能せず、これが問題です)
  • ユーザーが無効な認証情報を入力するか、キャンセルをクリックする => メンテナンスにリダイレクトされます (動作)

問題は、ユーザーが有効であり、LDAP グループ「THE-GROUP」のメンバーではない場合、どのようにしてユーザーをリダイレクトできるかということです。

現時点では、[キャンセル] または「THE-GROUP」のメンバーをクリックしない限り、資格情報を入力するためのオーバーレイが無期限に表示されます。

当社のアプリケーション ABC は、Ubuntu 上で実行され、社内でホストされています。リバース プロキシは、Ubuntu 16.04 上で実行される Apache 2.4.18-2ubuntu3.10 です。クライアントは世界中のさまざまなブラウザーと OS を使用するため、IP によるフィルタリングはオプションではありません。リバース プロキシは DMZ にあり、アプリケーション サーバーは外部にあります。NAT ルールが作成され、両方のシステムが 8080 (ABC が実行されているポート) 経由で通信できるようになりました。

(テスト)Config は次のようになります。

<VirtualHost *:443>
    ServerName testabc.company.com

    SSLProxyEngine On
    SSLEngine On
    SSLCertificateKeyFile  /etc/ssl/private/our_company.key
    SSLCertificateFile /etc/ssl/certs/company_com/fullchain.cer


    ErrorLog ${APACHE_LOG_DIR}/LDAP_test_error.log
    CustomLog ${APACHE_LOG_DIR}/LDAP_test_access.log combined

    # error document shown to unauthorized users
    DocumentRoot /var/www/Maintenance_Page
    ErrorDocument 401 /TTT/index.html

        <Location />
            ProxyPass http://internal-vm-name:8080/
            ProxyPassReverse http://internal-vm-name:8080/
        </Location>

    # the following block applies to all proxied content
    <Proxy "*">
        AuthType Basic
        AuthBasicProvider ldap
        AuthUserFile /dev/null
        AuthName "Auth with our LDAP Server"

        # configuration of the mod_authnz_ldap module
        AuthLDAPURL "ldap://SOMETHING"
        AuthLDAPBindDN "FOO,BAR "
        AuthLDAPBindPassword "FOOBAR"

        # Only users belonging to group THE-GROUP can access ABC,
        # all others will see the error document specified above.
        Require ldap-group CN=THE-GROUP,OU=Company,DC=ad,DC=Company,DC=com
    </Proxy>
</VirtualHost>

# virtual host required to access images and style-sheets from the error document
<VirtualHost *:80>
    ServerName maintenance.company.com
    DocumentRoot /var/www/Maintenance_Page

    ErrorLog ${APACHE_LOG_DIR}/maintenance -error.log
    CustomLog ${APACHE_LOG_DIR}/maintenance.log combined
</VirtualHost>

# redirection from HTTP to HTTPS
<VirtualHost *:80>
    ServerName abc.company.com
    Redirect Permanent /  https://abc.company.com/
    Redirect /  https://abc.company.com/
</VirtualHost>

答え1

この問題に対する適切な解決策はありません。HTTP 基本認証を使用しているため、ブラウザはページを開こうとしており、WWW-Authenticate: Basic realm="Whatever" ヘッダーが送信され、401 ステータスが返されます。

その時点でブラウザに認証ダイアログが表示され、ユーザー名とパスワードが入力されると、それらは Authorization ヘッダー内で Web サーバーに送信されます。

サーバーがリクエストを拒否した場合、WWW-Authenticate ヘッダーを含む 401 ステータスが再度送信されます。ブラウザはダイアログを無限に繰り返し表示します。サーバーはパスワードが完全に拒否されたと判断することはできません。

mod_dbd でバックアップされたデータベースを使用している場合は、mod_rewrite を使用してグループに対して SQL クエリを実行し、それに応じてリダイレクトすることができます。LDAP 認証ハンドラではこれが可能ではないと思います。

関連情報