23.7. Identity Management のスマートカード認証と Web アプリケーションの統合
Identity Management の Web インフラストラクチャー Apache モジュールを介して、アプリケーションが Identity Management サーバーを認証バックエンドとして使用する開発者は、複数のロールアカウントをスマートカードにリンクしたユーザーの認証を有効にするようにアプリケーションを設定できます。これにより、これらのユーザーは、許可されたロールアカウントでアプリケーションを使用できます。
23.7.1. スマートカードを使用した Web アプリケーション認証の前提条件
Apache Web アプリケーションが実行しているサーバーで、以下を行います。
- Identity Management ドメインで、サーバーをクライアントとして登録します。
- sssd-dbus パッケージおよび mod_lookup_identity パッケージをインストールします。
mod_nss
モジュールを使用して、Apache に作業用の HTTPS 接続が設定されていることを確認してください。
23.7.2. Web アプリケーションの Identity Management スマートカード認証の設定
/etc/httpd/conf.d/nss.conf
ファイルのmod_nss
設定で TLS 再ネゴシエーションを有効にします。NSSRenegotiation NSSRequireSafeNegotiation on
- ユーザー証明書を発行する CA が
mod_nss
証明書データベースのクライアント証明書に対して信頼されていることを確認します。データベースのデフォルトの場所は/etc/httpd/alias
です。 - Web アプリケーションを追加します。この手順では、ログインページと保護された領域で設定される、ほぼ最小限の例を示します。
/login
エンドポイントでは、ユーザーはユーザー名のみを指定し、アプリケーションの保護された部分にユーザーを送信することができます。/app
のエンドポイントでは、REMOTE_USER
環境変数を確認します。ログインに成功すると、変数にはログイン中のユーザーの ID が含まれます。それ以外の場合は、変数は設定されません。
- ディレクトリーを作成し、そのグループを
apache
に、モードを少なくとも750
に設定します。この手順では、/var/www/app/
という名前のディレクトリーを使用します。 - ファイルを作成して、そのグループを
apache
に設定し、モードを少なくとも750
に設定します。この手順では、/var/www/app/login.py
という名前のファイルを使用します。以下の内容をファイルに保存します。#! /usr/bin/env python def application(environ, start_response): status = '200 OK' response_body = """ <!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> <form action='/app' method='get'> Username: <input type='text' name='username'> <input type='submit' value='Login with certificate'> </form> </body> </html> """ response_headers = [ ('Content-Type', 'text/html'), ('Content-Length', str(len(response_body))) ] start_response(status, response_headers) return [response_body]
- ファイルを作成して、そのグループを
apache
に設定し、モードを少なくとも750
に設定します。この手順では、/var/www/app/protected.py
という名前のファイルを使用します。以下の内容をファイルに保存します。#! /usr/bin/env python def application(environ, start_response): try: user = environ['REMOTE_USER'] except KeyError: status = '400 Bad Request' response_body = 'Login failed.\n' else: status = '200 OK' response_body = 'Login succeeded. Username: {}\n'.format(user) response_headers = [ ('Content-Type', 'text/plain'), ('Content-Length', str(len(response_body))) ] start_response(status, response_headers) return [response_body]
- アプリケーションの設定ファイルを作成します。この手順では、以下の内容を含む
/etc/httpd/conf.d/app.conf
という名前のファイルを使用しています。<IfModule !lookup_identity_module> LoadModule lookup_identity_module modules/mod_lookup_identity.so </IfModule> WSGIScriptAlias /login /var/www/app/login.py WSGIScriptAlias /app /var/www/app/protected.py <Location "/app"> NSSVerifyClient require NSSUserName SSL_CLIENT_CERT LookupUserByCertificate On LookupUserByCertificateParamName "username" </Location>
このファイルで以下を行います。- 最初にロードされていない場合は、
mod_lookup_identity
を読み込みます。 - 次の部分では、
/login
と/app
はそれぞれの Web Server Gateway Interface(WSGI) スクリプトを参照します。 - 最後の部分は、TLS ハンドシェイク中にクライアント証明書を必要とし、それを使用するように
/app
エンドポイントにmod_nss
を設定します。さらに、ユーザーのアイデンティティーを検索するようにオプションの要求パラメーターusername
を設定します。