23.6. Web アプリケーションと Identity Management のスマートカード認証の統合

開発者は、Identity Management Web インフラストラクチャーの Apache モジュール経由で、認証バックエンドとして Identity Management サーバーを使用するアプリケーションでは、スマートカードに複数のロールアカウントがリンクされているユーザーを認証できるようにアプリケーションを設定することができます。

23.6.1. スマートカードでの Web アプリケーション認証における前提条件

Apache Web アプリケーションが実行中のサーバー:
  • Identity Management ドメインのクライアントとしてサーバーを登録します。
  • sssd-dbus および mod_lookup_identity パッケージをインストールします。
  • Apache に、 mod_nss モジュールを使用して、機能する HTTPS 接続が設定されていることを確認します。

23.6.2. Web アプリケーション向けの Identity Management スマートカード認証の設定

  1. /etc/httpd/conf.d/nss.conf ファイルの mod_nss 設定で TLS ネゴシエーションを有効化します。
    NSSRenegotiation
    NSSRequireSafeNegotiation on
  2. ユーザー証明書を発行する CA がmod_nss 証明書データベースのクライアント証明書向けに信頼されていることを確認します。データベースのデフォルトの場所は /etc/httpd/alias です。
  3. Web アプリケーションを追加します。この手順では、ログインページおよび保護エリアだけが含まれる最小限のアプリケーションを例として使用します。
    • /login エンドポイントでは、ユーザーはユーザー名のみが指定でき、アプリケーションの保護エリアに送信されます。
    • /app エンドポイントは REMOTE_USER 環境変数をチェックします。ログインが成功すると、変数にはログインユーザーの ID が含まれます。ログインに成功しなかった場合には、変数は設定されません。
  4. ディレクトリーを作成して、グループを apache に、モードを最低でも 750 に設定します。この手順では、/var/www/app/ という名前のディレクトリーを使用します。
  5. ファイルを作成して、グループを 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]
  6. ファイルを作成して、グループを 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]
  7. アプリケーション用の設定ファイルを作成します。この手順では、/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 がユーザーの ID を検索するように設定します。