文档菜单
文档首页
/
MongoDB 手册
/ / / /

故障排除自托管 Kerberos 身份验证

本页内容

  • mongokerberos 验证工具
  • Kerberos 配置调试策略
  • Linux 上的 Kerberos 跟踪日志
  • 常见错误信息

关于mongokerberos 程序提供了一种方便的方法来验证您的平台 Kerberos 配置是否适用于 MongoDB,并测试从 MongoDB 客户端进行 Kerberos 认证是否按预期工作。

mongokerberos 工具可以帮助诊断常见的配置问题,并在调试 Kerberos 配置时推荐作为起始点。有关更多信息,请参阅 mongokerberos 文档。

mongokerberos 仅在 MongoDB 企业版中可用。

如果您在启动或使用 mongodmongos 与 Kerberos 进行认证时遇到困难,请考虑以下情况

  • 请确保您正在运行 MongoDB 企业版,而不是 MongoDB 社区版。Kerberos 认证是 MongoDB 企业版功能,不适用于 MongoDB 社区版二进制文件。

    为了验证您是否正在使用MongoDB企业版,请将--version命令行选项传递给mongodmongos

    mongod --version

    查看此命令的输出,查找字符串modules: subscriptionmodules: enterprise以确认您正在使用MongoDB企业版二进制文件。

  • 确保mongodmongos实例的规范系统主机名是一个可解析的完全合格域名。

    在Linux上,您可以在系统提示符下使用hostname -f命令来验证系统主机名解析。

  • 在Linux上,确保服务主体名称(SPN)的主组件mongodb。如果SPN的主组件mongodb,您必须使用--setParameter saslServiceName来指定主组件。

  • 在Linux上,确保服务主体名称(SPN)的实例组件密钥表文件中与mongodmongos实例的规范系统主机名匹配。如果mongodmongos实例的系统主机名不在密钥表文件中,则身份验证将失败并显示GSSAPI错误获取凭证错误消息。

    如果由 hostname -f 返回的您的 mongodmongos 实例的主机名不是完全限定的,请在启动您的 mongodmongos 时使用 --setParameter saslHostName 来设置实例的完全限定域名。

  • 确保每个运行 mongodmongos 实例的主机都拥有 APTR DNS 记录,以提供正向和反向 DNS 查询。A 记录应映射到 mongodmongos 的 FQDN。

  • 确保托管您的 MongoDB 实例和 Kerberos 基础设施的服务器上的时钟与最大时间偏差在默认情况下为 5 分钟内。超过最大时间偏差的时间差异会阻止成功认证。

  • 确保 Linux KRB5 keytabs 包含以 @<KERBEROS REALM> 结尾的主权名称。要验证SPNs,请在 Active Directory 上运行 setspn -Q <spn>。如果正确配置,则该命令返回一个与 SPN 相关的帐户的 Distinct Name。如果在 Linux 上运行 klist -k <keytab>,则 <spn>@<KERBEROS REALM> 出现在 keytab 中。

  • 如果您将 Active Directory 作为 KDC 使用,请确保 MongoDB 服务帐户是用户帐户,而不是计算机帐户。

  • 如果您使用 Active Directory 进行 AES 加密,请使用 msDS-SupportedEncryptionTypes 属性或“网络安全:配置允许的 Kerberos 加密类型”策略设置在 MongoDB 服务帐户上启用 AES。

  • Kerberos 使用其密钥生成算法加盐,以确保具有相同密码的两个用户会产生不同的密钥。Linux 和 Active Directory (AD) 上的 ktutil 不使用相同的进程来生成盐。这种差异可能导致跨 Linux 和 Windows 环境工作时认证失败。为了减轻这个问题,您可以

    • 在 AD 服务器上生成 keytab 文件,并将生成的文件移动到 Linux 服务器。

      ktpass /out <outfile.keytab> /princ <spn>@<KERBEROS REALM> /mapuser <current userPrincipalName> /crypto ALL /ptype KRB5_NT_PRINCIPAL +rndpass

      注意

      这会将 userPrincipalName 更改为 /princ 中的值。

    • 在 Linux 上使用 ktutil 并强制其使用正确的盐。要强制 ktutil 使用正确的盐

      1. 生成一个使用 userPrincipalName 作为主权名称的关键表条目。

        ktutil: add_entry -password -p <userPrincipalName>@<KERBEROS REALM> -e aes256-cts-hmac-sha1-96 -k <KVNO>
        Password for <userPrincipalName>@<KERBEROS REALM>:
        ktutil: list -k
        slot KVNO Principal
      2. 十六进制转储密钥。

      3. 创建一个新的 keytab 条目,使用 <spn>@<KERBEROS REALM> 作为主权名称,并使用十六进制转储的密钥。

        1 <KVNO> <userPrincipalName>@<KERBEROS REALM>(0x<HEXDUMP>)
        ktutil: add_entry -key -p <spn>@<KERBEROS REALM> -e aes256-cts-hmac-sha1-96 -k <KVNO>
        Key for <spn>@<KERBEROS REALM> (hex): <HEXDUMP>
        ktutil: write_kt mongodb_ad.keytab
    • 使用不使用盐的 RC4-HMAC,尽管这不是推荐的做法。

MIT Kerberos提供了KRB5_TRACE环境变量以输出跟踪日志。如果您在Linux上遇到MIT Kerberos的持续问题,您可以在启动mongodmongosmongosh实例时设置KRB5_TRACE以生成详细日志。

例如,以下命令启动了一个独立的mongod实例,其密钥表文件位于默认的/etc/krb5.keytab路径,并将KRB5_TRACE设置为写入/logs/mongodb-kerberos.log

env KRB5_KTNAME=/etc/krb5.keytab \
KRB5_TRACE=/logs/mongodb-kerberos.log \
mongod --dbpath /data/db --logpath /data/db/mongodb.log \
--auth --setParameter authenticationMechanisms=GSSAPI \
--bind_ip localhost,<hostname(s)|ip address(es)> --fork

在某些情况下,如果Kerberos服务存在问题,MongoDB将返回GSSAPI接口的错误消息。一些常见错误消息包括

在协商安全上下文时客户端发生GSSAPI错误。

此错误发生在客户端,反映了凭证不足或恶意尝试认证。

如果您收到此错误,请确保您使用正确的凭证以及正确的完全限定域名来连接到主机。

获取凭证时发生GSSAPI错误。
此错误发生在mongodmongos启动期间,反映了系统主机名的配置不正确或密钥表文件丢失或配置不正确。

提示

另请参阅

返回

在 Windows 上配置