23.7. 将身份管理智能卡身份验证与 Web 应用程序集成
作为一名开发人员,其应用通过身份管理 Web 基础架构 Apache 模块将身份管理服务器用作身份验证后端,您可以配置应用程序,使用户的身份验证具有多个角色帐户与其智能卡相关联。这使得这些用户能够在允许的角色帐户下使用应用。
23.7.1. 使用智能卡 Web 应用程序身份验证的先决条件
在运行 Apache Web 应用程序的服务器中:
- 将服务器注册为身份管理域中的客户端。
- 安装 sssd-dbus 和 mod_lookup_identity 软件包。
- 确保 Apache 具有使用
mod_nss
模块配置的可正常工作的 HTTPS 连接。
23.7.2. 为 Web 应用程序配置身份管理智能卡身份验证
- 在
/etc/httpd/conf.d/nss.conf
文件中的mod_nss
配置中启用 TLS 重新协商:NSSRenegotiation NSSRequireSafeNegotiation on
- 确保为
mod_nss
证书数据库中的客户端证书信任签发用户的 CA。数据库的默认位置为/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 服务器网关接口(WSGI)脚本。 - 最后部分为
/app
端点配置mod_nss
,以便在 TLS 握手期间需要客户端证书并使用它。另外,它还配置一个可选的请求参数用户名
来查找用户身份。