
職場では、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 認証ハンドラではこれが可能ではないと思います。