Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

23.7. 将身份管理智能卡身份验证与 Web 应用程序集成

作为一名开发人员,其应用通过身份管理 Web 基础架构 Apache 模块将身份管理服务器用作身份验证后端,您可以配置应用程序,使用户的身份验证具有多个角色帐户与其智能卡相关联。这使得这些用户能够在允许的角色帐户下使用应用。

23.7.1. 使用智能卡 Web 应用程序身份验证的先决条件

在运行 Apache Web 应用程序的服务器中:
  • 将服务器注册为身份管理域中的客户端。
  • 安装 sssd-dbusmod_lookup_identity 软件包。
  • 确保 Apache 具有使用 mod_nss 模块配置的可正常工作的 HTTPS 连接。

23.7.2. 为 Web 应用程序配置身份管理智能卡身份验证

  1. /etc/httpd/conf.d/nss.conf 文件中的 mod_nss 配置中启用 TLS 重新协商:
    NSSRenegotiation
    NSSRequireSafeNegotiation on
  2. 确保为 mod_nss 证书数据库中的客户端证书信任签发用户的 CA。数据库的默认位置为 /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 服务器网关接口(WSGI)脚本。
    • 最后部分为 /app 端点配置 mod_nss,以便在 TLS 握手期间需要客户端证书并使用它。另外,它还配置一个可选的请求参数 用户名 来查找用户身份。