使用 Apache mod_mellon 的 IdP 的 Splunk SAML SSO 失败

使用 Apache mod_mellon 的 IdP 的 Splunk SAML SSO 失败

我正在尝试使用 mod_mellon 将 SSO 从 IdP 配置到 Apache,并使用 mod proxy 将 SSO 配置到 splunk。

环境:Ubuntu 14.04;Apache 2.4.7;mod-auth-mellon 0.7.0。

Apache 在默认 ssl 站点上配置了 mellon 生成的密钥/证书。mod proxy 用于在端口 8000 上本地代理 splunk。

auth_mellon.conf

MellonCacheSize 100
MellonLockFile "/var/lock/mod_auth_mellon.lock"
MellonPostDirectory "/var/cache/apache2/mod_auth_mellon/"

ProxyRequests Off
ProxyPass /secret/ !
ProxyPassInterpolateEnv On
<Location />
        MellonEnable "info"
        Require valid-user
        AuthType "Mellon"
        MellonVariable "cookie"
        MellonSamlResponseDump On
        MellonSPPrivateKeyFile /etc/apache2/mellon/urn_splunk.key
        MellonSPCertFile /etc/apache2/mellon/urn_splunk.cert
        MellonSPMetadataFile /etc/apache2/mellon/urn_splunk.xml
        MellonIdpMetadataFile /etc/apache2/mellon/idp-meta.xml
        MellonEndpointPath /secret/endpoint
        MellonUser "NAME_ID"
        MellonDefaultLoginPath /en-US/
        RequestHeader set SplunkWebUser %{MELLON_NAME_ID}e
        MellonSamlResponseDump On

        ProxyPass http://127.0.0.1:8000/
        ProxyPassReverse http://127.0.0.1:8000/
        ProxyPassInterpolateEnv On
</Location>

idp-meta.xml包含来自 IDP 的元数据(包括 IDP x509 证书和 HTTP Post/HTTP 重定向参数)。这些urn_service.*文件是从mellon_create_metadata.sh在 SP 和 xml 配置文件上创建 x509 证书和密钥的脚本生成的。

当我尝试从 IdP 访问 splunk 时,我看到 apache 日志文件中的错误,并收到 500 / 内部服务器错误响应:

[authz_core:debug] mod_authz_core.c(802): AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
[authz_core:debug] mod_authz_core.c(802): AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
[core:error] AH00027: No authentication done but request not allowed without authentication for /secret/endpoint/login. Authentication not configured?

似乎 SAML 身份验证失败。我正在遵循以下指南:http://blogs.splunk.com/2013/10/09/splunk-sso-using-saml-through-okta/

Splunk 配置为使用 LDAP 进行身份验证,并且身份验证正确。apache 是否也需要配置 ldap 身份验证来识别有效用户?(不确定 apache/mellon 中用户是如何进行身份验证的,假设这一切都由 IdP 的有效负载处理,而 mellon 只知道身份

答案1

看起来有很多地方都错了。首先,当我修改 SAML 设置时,我没有意识到需要将元数据从我的 IdP 重新复制回 Apache 配置。无论如何,在确保 IdP 和 SP xml 文件在 Apache 中配置正确后,我就可以继续了(我想我已经更改了实体 ID)

我仍然在错误日志中收到有关需要有效用户的错误。事实证明,它MellonEnable "auth"负责确保存在有效用户,但出于某种原因,Require valid-user参数AuthType "Mellon"触发了错误和 500 服务器响应。

删除这 2 个指令后,我仍然收到错误,这一次Could not find metadata for the IdP "(null)"- 经过快速搜索,发现lassoUbuntu 14.04 LTS (2.4.0) 上可用的最新版本不适用于 IdP 默认使用的 SHA256 签名。Lasso 2.5 支持 SHA256。使用兼容算法更新 IdP 配置后,识别就可以正确进行了。

但是,由于上下文的原因,我随后面临重定向循环。我发现另一篇文章建议将 splunk 的 Web 根目录移动到上下文/splunk而不是根目录 ( /),通过更新此帖子,我现在能够通过 IdP 的 mellon 向 Splunk 进行身份验证。以下是相关的工作配置:

MellonLockFile "/var/lock/mod_auth_mellon.lock"
MellonPostDirectory "/var/cache/apache2/mod_auth_mellon/"

ProxyRequests Off
ProxyPassInterpolateEnv On
# Move the proxy directives out of <location> and specify the context / mapping
ProxyPass /splunk http://127.0.0.1:8000/splunk
ProxyPassReverse /splunk http://127.0.0.1:8000/splunk

<Location />
        MellonEnable "info"
        MellonVariable "cookie"
        MellonSamlResponseDump On
        MellonSPPrivateKeyFile /etc/apache2/mellon/urn_splunkweb.key
        MellonSPCertFile /etc/apache2/mellon/urn_splunkweb.cert
        MellonSPMetadataFile /etc/apache2/mellon/urn_splunkweb.xml
        MellonIdpMetadataFile /etc/apache2/mellon/idp-metadata.xml
        MellonEndpointPath /secret/endpoint
        MellonUser "NAME_ID"
        MellonDefaultLoginPath /splunk/en-US/
        RequestHeader set SplunkWebUser %{MELLON_NAME_ID}e
        ProxyPassInterpolateEnv On
</Location>
<Location /splunk/>
        # Forces /splunk requests to be authenticated via the IdP.
        MellonEnable "auth"
</Location>

$SPLUNK_HOME/etc/system/local/web.conf:

[settings]
trustedIP=127.0.0.1
remoteUser SplunkWebUser
SSOMode=permissive
root_endpoint = /splunk

和 $SPLUNK_HOME/etc/system/local/server.conf

[general]
trustedIP=127.0.0.1

这显然是为了设置 apache/mellon 服务器与 splunk 运行在同一台主机上。如果没有,则web.conf(splunk) 和auth_mellon.conf(apache) 需要使用远程 IP 进行更新。web.conf支持以逗号分隔的受信任主机列表,而不server.conf支持,应保留为本地主机。

答案2

使用以下内容设置调试网页:

<?php
header('Content-Type: text/plain');

foreach($_SERVER as $key=>$value) {
  if(substr($key, 0, 7) == 'MELLON_') {
    echo($key . '=' . $value . "\r\n");
  }
}
?>

你能检查一下用户的 ID 是否在

  MellonUser "NAME_ID"

NAME_ID属性?在我看来这很可疑。通常都是这样的uid或类似的。在测试阶段,您可以更改为您知道 IdP 发布的任何属性(邮件、cn...等等),只是为了避免 500 问题。

答案3

最有可能的是,IDP 没有正确配置 LDAP,并且 Mellon/Apache 不需要额外的配置。

如果您可以发布 SAML 响应的转储,这将有助于进一步深入研究该问题。

如果您想进一步讨论,请告诉我。

谢谢,Sandy E-[电子邮件保护]

相关内容