我可以成功运行kinit
以获得以下klist
输出:
Ticket cache: FILE:/tmp/krb5cc_1001
Default principal: [email protected]
Valid starting Expires Service principal
01.03.2022 17:24:01 02.03.2022 17:23:58 krbtgt/[email protected]
并且以下 cURL 命令也有效:
curl --negotiate -u: http://test.kerim.io:8081/skin?test=foo
具有以下输出:
* Connected to test.kerim.io (192.168.1.100) port 8081 (#0)
* Server auth using Negotiate with user '';
> GET /skin?test=foo HTTP/1.1
> Host: test.kerim.io:8081
> Authorization: Negotiate YIICWQYGKwYBBQUCoIIC[redacted]
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 01 Mar 2022 16:29:15 GMT
< Server: Apache
< WWW-Authenticate: Negotiate oYG3MIG0oAMKAQChCwYJKoZIgvcSA[redacted]
< Cache-Control: no-cache, no-store
< Access-Control-Allow-Origin: localhost
< Access-Control-Allow-Methods: GET, POST, OPTIONS
< Access-Control-Max-Age: 1000
< Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Authorization, Accept
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
我尝试在 firefox 中设置各种浏览器设置(通过 about:config,遵循本指南)和 chrome 的命令行参数(--auth-server-whitelist="*.kerim.io"
),但似乎浏览器只是拒绝协商上述 URL。
客户端操作系统是 Ubuntu。网络服务器确实以WWW-Authenticate: Negotiate
.
使用以下环境变量调用 Firefox:
export NSPR_LOG_MODULES="negotiateauth:5,NTLM:5" KRB5_TRACE="/dev/stderr"
显示此错误:
[Parent 21580: Main Thread]: D/negotiateauth service = test.kerim.io
[Parent 21580: Main Thread]: D/negotiateauth using negotiate-gss
[Parent 21580: Main Thread]: D/negotiateauth entering nsAuthGSSAPI::nsAuthGSSAPI()
[Parent 21580: Main Thread]: D/negotiateauth Attempting to load gss functions
[Parent 21580: Main Thread]: D/negotiateauth entering nsAuthGSSAPI::Init()
[Parent 21580: BgIOThreadPool #1]: D/negotiateauth nsHttpNegotiateAuth::GenerateCredentials() [challenge=Negotiate]
[Parent 21580: BgIOThreadPool #1]: D/negotiateauth entering nsAuthGSSAPI::GetNextToken()
[Parent 21580: BgIOThreadPool #1]: D/negotiateauth gss_init_sec_context() failed: Unspecified GSS failure. Minor code may provide more information
SPNEGO cannot find mechanisms to negotiate
[Parent 21580: BgIOThreadPool #1]: D/negotiateauth leaving nsAuthGSSAPI::GetNextToken [rv=80004005]
这可能是 KDC 名称解析的问题吗?我目前只有我的主机名/etc/hosts
,没有在 DNS 中注册。
您使用的是 Ubuntu,它通过其 Snap 沙盒系统提供 Firefox。众所周知,Kerberos 目前在 Firefox的Snap 包中不起作用,最简单的解决方法是用
apt
仍然可用的包替换它。但更具体地说,当程序认为您没有任何 Kerberos 凭据(并且没有 Kerberos,会留下一个空的 GSSAPI 机制列表)时,将显示 GSSAPI 错误消息“SPNEGO 找不到协商机制”。
发生这种情况是因为您的默认 Kerberos 票证缓存位置位于 /tmp 中,并且 snapd 为每个应用程序提供了一个独立的 /tmp 实例,从而阻止它查看相同的文件。您可以通过
file:///tmp
在 Firefox 中访问或在snap run --shell firefox
.(我没有调查过 Chromium,但我预计这将是几乎相同的问题。)
然而,Snapd 确实允许访问 /home;至少 Firefox snap 特别具有正确的权利(“插件”)连接到自动具有主目录访问权限。因此,您可以通过将票证缓存移动到您的主目录来解决这个问题——或者通过环境:
或系统范围内,通过编辑
/etc/krb5.conf
说:请注意,Snapd 使用 AppArmor 来精确限制应用程序可以访问的路径,并且其生成的 AppArmor 配置文件在授予家庭访问权限时明确排除“顶级隐藏目录”,因此 ~/krb5cc 将被允许但 ~/.cache/krb5cc 不会。
(您可能不喜欢将特定的“/home/USER”布局硬编码在您的 krb5.conf 中,因为它不能引用 $HOME 也不能查找类似 %{home}/krb5cc 的内容...但这没关系,因为AppArmor 已经有同样的问题;它的配置文件也硬编码 /home。)
另一种选择是使用“运行时目录”
FILE:/run/user/%{uid}/krb5cc
,但不幸的是,AppArmor 也不允许这样做。(此外,运行
dmesg
实际上揭示了一些与 /etc/gss/mech.d 相关的 AppArmor 拒绝,但这对 Kerberos 来说并不是真正的问题;该路径只会被 gss-ntlmssp 使用。)解决此问题后,您可能会遇到另一个问题:Firefox snap 捆绑了它自己的 Kerberos 库,而不是使用系统库(很像 Docker,这被认为是一项功能,允许 snaps 提供比系统更新的库) , 但不包括
k5tls.so
krb5 通过 HTTPS 访问 KDC 所需的插件(即使用 MS-KKDCP 协议)。因此,如果您的领域有 DNS URI 记录表明 KKDCP 是唯一的选项(而不是明文 TCP 或 UDP),那么如果没有 k5tls 插件,krb5 将无法与 KDC 对话。(当找到 URI 记录时,它也不会回退到将 SRV 记录用于明文 TCP/UDP,即使这些记录确实存在。)
如果这成为一个问题,可以通过
/etc/krb5.conf
强制回退到 SRV 来禁用 URI 记录查找(或者可以设置静态 KDC 主机名),但这仅在领域的 KDC 确实可以通过明文访问时才有帮助。似乎没有什么好的方法可以在 Snap 容器中实际包含其他文件(更不用说这可能导致的版本不匹配),所以如果领域只使用 TLS/KKDCP(就像 Azure AD Kerberos 那样),那么它会apt install firefox krb5-k5tls
比与 Snap 搏斗更容易。