第 8 章 mod_auth_mellon Apache Module
mod_auth_mellon 是 Apache 的身份验证模块。如果您的语言/环境支持使用 Apache HTTPD 作为代理,您可以使用 mod_auth_mellon 使用 SAML 保护 Web 应用。有关此模块的更多详细信息,请参阅 mod_auth_mellon GitHub 仓库。
Red Hat build of Keycloak 不提供对 mod_auth_mellon 的任何官方支持。以下说明是最佳的,可能不是最新的。本章假定服务器是 RHEL 系统。尽管其他 Linux 系统需要相似的步骤。为了获得更多详细信息,我们建议您使用官方的 mod_auth_mellon 文档。
要配置 mod_auth_mellon
,您需要以下文件:
- Identity Provider (IdP)实体描述符 XML 文件,该文件描述了与红帽构建的 Keycloak 或其他 SAML IdP 的连接
- SP 实体描述符 XML 文件,该文件描述了您要保护的应用程序的 SAML 连接和配置。
- 私钥 PEM 文件,这是 PEM 格式的文本文件,用于定义应用用于签署文档的私钥。
- 证书 PEM 文件,它是为应用程序定义证书的文本文件。
- mod_auth_mellon 特定的 Apache HTTPD 模块配置.
如果您已经在 Red Hat build of Keycloak Application server 的域中定义了并注册了客户端应用程序,则红帽构建的 Keycloak 可以生成除 Apache HTTPD 模块配置外所需的所有文件。
执行以下步骤来生成 Apache HTTPD 模块配置。
流程
- 进入 SAML 客户端的 Installation 页面。
选择 Mod Auth Mellon 文件选项。
图 8.1. mod_auth_mellon config download
- 点 Download 下载包含 XML 描述符和 PEM 文件的 ZIP 文件。
8.1. 使用红帽构建的 Keycloak 配置 mod_auth_mellon
涉及两个主机:
- 运行红帽构建的 Keycloak 的主机,它将被称为 $idp_host,因为红帽构建的 Keycloak 是一个 SAML 身份提供程序(IdP)。
- 运行 Web 应用的主机,该主机将称为 $sp_host。在使用 IdP 的 SAML 应用程序中称为服务提供商(SP)。
以下所有步骤都需要以 root 特权在 $sp_host 上执行。
8.1.1. 安装软件包
要安装所需的软件包,您需要:
- Apache Web Server (httpd)
- Mellon SAML SP 附加组件模块
- 创建 X509 证书的工具
要安装所需的软件包,请运行以下命令:
yum install httpd mod_auth_mellon mod_ssl openssl
yum install httpd mod_auth_mellon mod_ssl openssl
8.1.2. 为 Apache SAML 创建配置目录
建议您将与 Apache 相关的配置文件保存在一个位置上。
在 Apache 配置根目录 /etc/httpd
下创建名为 saml2 的新目录:
mkdir /etc/httpd/saml2
mkdir /etc/httpd/saml2
8.1.3. 配置 Mellon 服务提供商
Apache 附加组件模块的配置文件位于 /etc/httpd/conf.d
目录中,文件名为 .conf
。您需要创建 /etc/httpd/conf.d/mellon.conf
文件,并将 Mellon 的配置指令放在该文件中。
Mellon 的配置指令可大致分为两类信息:
- 使用 SAML 身份验证保护的 URL
- 引用受保护的 URL 时将使用哪些 SAML 参数。
Apache 配置指令通常遵循 URL 空间中的分级树结构,这些结构称为位置。您需要为 Mellon 指定一个或多个 URL 位置来保护。您具有如何添加应用到每个位置的配置参数的灵活性。您可以将所有必要的参数添加到 location 块中,也可以将 Mellon 参数添加到特定保护位置继承的 URL 位置层次结构中(或两者的某些组合)。由于 SP 常以同样的方式运行,无论哪个位置都触发 SAML 操作,因此此处使用的示例配置将常见 Mellon 配置指令放置在层次结构中的 root 中,然后使用 Mellon 保护的特定位置。此策略可避免为每个受保护的位置复制相同的参数。
这个示例只有一个受保护的位置:https://$sp_host/private。
要配置 Mellon 服务供应商,请执行以下步骤。
流程
-
使用以下内容创建文件
/etc/httpd/conf.d/mellon.conf
:
<Location / > MellonEnable info MellonEndpointPath /mellon/ MellonSPMetadataFile /etc/httpd/saml2/mellon_metadata.xml MellonSPPrivateKeyFile /etc/httpd/saml2/mellon.key MellonSPCertFile /etc/httpd/saml2/mellon.crt MellonIdPMetadataFile /etc/httpd/saml2/idp_metadata.xml </Location> <Location /private > AuthType Mellon MellonEnable auth Require valid-user </Location>
<Location / >
MellonEnable info
MellonEndpointPath /mellon/
MellonSPMetadataFile /etc/httpd/saml2/mellon_metadata.xml
MellonSPPrivateKeyFile /etc/httpd/saml2/mellon.key
MellonSPCertFile /etc/httpd/saml2/mellon.crt
MellonIdPMetadataFile /etc/httpd/saml2/idp_metadata.xml
</Location>
<Location /private >
AuthType Mellon
MellonEnable auth
Require valid-user
</Location>
后续步骤中会创建上述代码中引用的一些文件。
8.1.4. 为 mod_auth_mellon 使用的 Cookie 设置 SameSite 值
浏览器正在计划将 Cookie 的 SameSite
属性的默认值设为 Lax
。此设置意味着,只有请求来自同一域时才会将 Cookie 发送到应用程序。这个行为可能会影响 SAML POST 绑定,这可能会无法正常工作。要保留 mod_auth_mellon 模块的完整功能,我们建议将 mod_auth_mellon 创建的 cookie 的 SameSite
值设置为 None
。不这样做可能会导致使用红帽构建的 Keycloak 登录。
要将 SameSite
值设置为 None
,请在 mellon.conf
文件中添加以下 配置到 <Location /
> tag。
MellonSecureCookie On MellonCookieSameSite none
MellonSecureCookie On
MellonCookieSameSite none
对此配置的支持包括在 0.16.0 版本的 mod_auth_mellon 模块中。
8.1.5. 创建服务提供商元数据
在 SAML IdP 和 SP 中,用于交换 SAML 元数据,它们是 XML 格式。元数据的 schema 是标准的,因此相关的 SAML 实体可以互相使用其元数据。您需要:
- SP 使用的 IdP 的元数据
- 描述 IdP 提供的 SP 的元数据
SAML 元数据的一个组件是 X509 证书。这些证书用于两个目的:
- 为 SAML 信息签名,以便接收端可以证明来自预期方的消息。
- 在传输过程中加密消息(很少使用,因为 SAML 消息通常在 TLS 保护的传输中发生)
如果您已拥有证书颁发机构(CA),也可以使用自己的证书,也可以生成自签名证书。在本示例中简单性,使用了自签名证书。
因为 Mellon 的 SP 元数据必须反映已安装 mod_auth_mellon 版本的功能,所以必须是有效的 SP 元数据 XML,且必须包含 X509 证书(创建错误时,除非您熟悉 X509 证书生成)最先生成 SP 元数据的方式是使用 mod_auth_mellon 软件包中包含的工具(mellon_create_metadata.sh
)。之后,生成的元数据始终可以被编辑,因为它是一个文本文件。该工具还创建您的 X509 密钥和证书。
SAML IdP 和 SPs 使用称为 EntityID 的唯一名称来识别自己。要使用 Mellon 元数据创建工具,您需要:
- EntityID,通常是 SP 的 URL,通常是可以检索 SP 元数据的 SP 的 URL
- 将消耗 SP 的 SAML 消息的 URL,Mellon 调用 MellonEndPointPath。
要创建 SP 元数据,请执行以下步骤。
流程
创建几个帮助程序 shell 变量:
fqdn=`hostname` mellon_endpoint_url="https://${fqdn}/mellon" mellon_entity_id="${mellon_endpoint_url}/metadata" file_prefix="$(echo "$mellon_entity_id" | sed 's/[^A-Za-z.]/_/g' | sed 's/__*/_/g')"
fqdn=`hostname` mellon_endpoint_url="https://${fqdn}/mellon" mellon_entity_id="${mellon_endpoint_url}/metadata" file_prefix="$(echo "$mellon_entity_id" | sed 's/[^A-Za-z.]/_/g' | sed 's/__*/_/g')"
Copy to Clipboard Copied! 运行以下命令调用 Mellon 元数据创建工具:
/usr/libexec/mod_auth_mellon/mellon_create_metadata.sh $mellon_entity_id $mellon_endpoint_url
/usr/libexec/mod_auth_mellon/mellon_create_metadata.sh $mellon_entity_id $mellon_endpoint_url
Copy to Clipboard Copied! 将生成的文件移动到其目的地(在上面创建的
/etc/httpd/conf.d/mellon.conf
文件中引用):mv ${file_prefix}.cert /etc/httpd/saml2/mellon.crt mv ${file_prefix}.key /etc/httpd/saml2/mellon.key mv ${file_prefix}.xml /etc/httpd/saml2/mellon_metadata.xml
mv ${file_prefix}.cert /etc/httpd/saml2/mellon.crt mv ${file_prefix}.key /etc/httpd/saml2/mellon.key mv ${file_prefix}.xml /etc/httpd/saml2/mellon_metadata.xml
Copy to Clipboard Copied!
8.1.6. 将 Mellon Service Provider 添加到红帽构建的 Keycloak 身份提供程序中
假设:红帽构建的 Keycloak IdP 已在 $idp_host 上安装。
Red Hat build of Keycloak 支持多个租期,其中所有用户、客户端等都分组到一个域里。每个域都独立于其他域。您可以在红帽构建的 Keycloak 中使用现有域,但本示例演示了如何创建名为 test_realm 的新域,并使用该域。
所有这些操作都使用红帽构建的 Keycloak 管理控制台来执行。您必须具有 $idp_host 的 admin 用户名和密码才能执行以下步骤。
流程
打开 Admin Console 并通过输入 admin 用户名和密码登录。
登录管理控制台后,将有一个现有的域。当首次设置根域 master 时,会默认创建 Red Hat build of Keycloak。任何之前创建的域都会在下拉列表中的 Admin Console 的左上角列出。
- 从 realm 下拉列表中,选择 Add realm。
-
在 Name 字段中键入
test_realm
,然后单击 Create。
8.1.6.1. 添加 Mellon Service Provider 作为域的客户端
在 Red Hat build of Keycloak SAML SP 中,称为客户端。要添加 SP,我们必须在域的 Clients 部分中。
- 点左侧的 Clients 菜单项,然后点 Import client 按钮。
在 Resource file 字段中,提供上面创建的 Mellon SP 元数据文件(
/etc/httpd/saml2/mellon_metadata.xml
)。根据浏览器的运行位置,您可能需要将 SP 元数据从 $sp_host 复制到运行浏览器的计算机,以便浏览器可以找到该文件。
- 点击 Save。
8.1.6.2. 编辑 Mellon SP 客户端
使用这个流程设置重要的客户端配置参数。
流程
- 确保 Force POST Binding 为 On。
- 将 paosResponse 添加到 Valid Redirect URIs 列表中:
- 复制 Valid Redirect URI 中的 postResponse URL,并将它粘贴到 "+" 下的空添加文本字段中。
-
将
postResponse
更改为 paosResponse'。(SAML ECP 需要 paosResponse URL。) - 点底部的 Save。
许多 SAML SP 根据组中的用户成员资格决定授权。红帽 Keycloak IdP 的构建可以管理用户组信息,但不会提供用户组,除非 IdP 配置为将其作为 SAML 属性提供。
执行以下步骤将 IdP 配置为将用户组作为 SAML 属性提供。
流程
- 点客户端的 Client scopes 选项卡。
- 点 dedicated 范围放置在第一行中。
- 在 Mappers 页面中,单击 Add mapper 按钮并选择 By configuration。
- 从 Mapper Type 列表中,选择 Group 列表。
-
将 Name 设置为
组列表
。 -
将 SAML 属性名称设置为
组
。 - 点击 Save。
剩余的步骤在 $sp_host 上执行。
8.1.6.3. 检索身份提供程序元数据
现在,您已在 IdP 上创建域,您需要检索与之关联的 IdP 元数据,以便 Mellon SP 识别它。在之前创建的 /etc/httpd/conf.d/mellon.conf
文件中,MellonIdPMetadataFile
指定为 /etc/httpd/saml2/idp_metadata.xml
,直到该文件在 $sp_host 上不存在。
使用这个流程从 IdP 检索该文件。
流程
使用这个命令,使用 $idp_host 的正确值替换:
curl -k -o /etc/httpd/saml2/idp_metadata.xml \ https://$idp_host/realms/test_realm/protocol/saml/descriptor
curl -k -o /etc/httpd/saml2/idp_metadata.xml \ https://$idp_host/realms/test_realm/protocol/saml/descriptor
Copy to Clipboard Copied! Mellon 现已全面配置。
要运行 Apache 配置文件的语法检查,请使用以下命令:
apachectl configtest
apachectl configtest
Copy to Clipboard Copied! 注意configtest 等同于 apachectl 的 -t 参数。如果配置测试显示任何错误,请在继续操作前进行更正。
重启 Apache 服务器:
systemctl restart httpd.service
systemctl restart httpd.service
Copy to Clipboard Copied!
现在,您已在 test_realm 和 mod_auth_mellon 中将红帽构建的 Keycloak 设置为 SAML IdP,通过针对 $idp_host
IdP 进行身份验证来保护 URL $sp_host/protected (及其下的所有内容)。