关键部分

关键部分

测试设置:

  • 在 Windows 10 计算机上运行并加入活动目录的 Weblogic 12.2.1.4
  • 运行 Red Hat Enterprise Linux 7 的 Linux 文件服务器,配置 sssd 以连接到 Active Directory
  • 运行 Red Hat Enterprise Linux 6 的 Linux 文件服务器,不是使用 sssd,不是使用 winbind(不清楚它是如何精确地为 Active Directory 配置的)

根据我与系统管理员对话所获得的第三手资料,MIT Kerberos 以某种方式参与了将 Linux 服务器连接到 Active Directory - 但我没有更多相关信息。

(注意:serverfault 存在 markdown 表格渲染问题 - 表格在预览中显示正常,但在实际发布的问题中显示不正确,因此现在用代码块包围,以免它们一起运行)

检测结果

| Source (all on same Windows 10 machine)  | Target FileServer     | Result  |
|------------------------------------------|-----------------------|---------|
| Weblogic application                     | RHEL 6                | Success |
| Weblogic application                     | RHEL 7                | **Fail:** Server not found in Kerberos database |
| Windows Explorer                         | RHEL 6                | Success |
| Windows Explorer                         | RHEL 7                | Success |

所有测试均使用相同的用户凭证完成。

Weblogic 的跟踪结果(将 java 系统属性设置sun.security.krb5.debug为之后true)如下:

KrbAsReqBuild: PREAUTH FAILED/REQ, re-send AS-REQ
Using builtin default etypes for default_tkt_enctypes
default etypes for default_tkt_enctypes: 18 17 16 23
Using builtin default etypes for default_tkt_enctypes
default etypes for default_tkt_enctypes: 18 17 16 23
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>> KrbAsReq creating message
getKDCFromDNS using UDP
>>> KrbKdcReq send: kdc=***************. UDP:88, timeout=30000, number of retries =3, #bytes=233
>>> KDCCommunication: kdc=***************. UDP: 88, timeout=30000,Attempt =1, #bytes=233
>>> KrbKdcReq send: #bytes read=100
>>> KrbKdcReq send: kdc=*****************. TCP:88, timeout=30000, number of retires =3, #bytes=233
>>> KDCCommunication: kdc=****************. TCP:88, timeout=30000,Attempt =1, #bytes=233
>>>DEBUG: TCPClient reading 2695 bytes
>>>KrbKdcReq send: #bytes read=2695
>>>KdcAccessibility: remove **********************.:88
>>>Etype: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>>KrbAsRep cons in KrbAsReq.getReply ******
Found ticket for ******@******** to go to krbtgt/******@****** expiring on ******
Entered Krb5Context.initSecContext with state=STATE_NEW
Found ticket for ******@******** to go to krbtgt/******@****** expiring on ******
Service ticket not found in the subject
>>> Credentials serviceCredsSingle: same realm
Using builtin default etypes for default_tgs_enctypes
default etypes for default_tgs_enctypes: 18 17 16 23
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
>>> CksumType: sun.security.krb5.internal.crypto.HmacSha1Aes256CksumType
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
getKDCFromDNS using UDP
>>> KrbKdcReq send: kdc=************. TCP:88, timeout=30000, number of retries =3, #bytes=2633
>>> KDCCommunication: kdc=************. TCP:88, timeout=30000,Attempt =1, #bytes=2633
>>>DEBUG: TCPClient reading 104 bytes
>>> KrbKdcReq send: #bytes read=104
>>> KdcAccessibility: remove *************.:88
>>> KDCRep: init() encoding tag is 126 req type is 13
>>>KRBError:
        STime is **********
        suSec is **********
        error code is 7
        error Message is Server not found in Kerberos database
        sname is cifs/***********@***********
        msgType is 30

搜索“Kerberos 数据库中未找到服务器”会产生多种可能性(DNS 似乎是最常见的建议,其他答案建议 SPN 注册、TLS 证书、不使用 FQDN、无效的主机到领域映射、主机不是域的一部分、IPV4 与 IPV6)

网络管理员说 DNS 是正确的,Windows 资源管理器可以正常连接到 RHEL 7 服务器,这似乎证实了这一点。但我也不准备只责怪 Java 代码,因为它成功连接到 RHEL 6 服务器。

我很难找到关于需要在哪里配置哪些 Kerberos 条目的清晰解释。

这个“Kerberos 数据库”是在 Windows 10 机器、文件服务器还是 Active Directory KDC 上?或者这个 Kerberos 数据库有多个副本,每个副本都需要条目?

编辑-附加详细信息 我学到了一些新知识,可以提供一些额外的细节。

以下内容全部来自开发人员计算机上的 Windows 命令提示符。

领域取决于:

C:\>echo %userdnsdomain%
DC1.DC2.DC3

连接成功(RHEL 6 服务器)

C:\>powershell Get-ADComputer server1

DistinguishedName : CN=SERVER1,OU=ou1,OU=ou2,OU=ou3,DC=dc1,DC=dc2,DC=dc3
DNSHostName       : server1.dc2.dc3
Enabled           : True
Name              : SERVER1
ObjectClass       : Computer
ObjectGUID        : aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
SamAccountName    : server1$
SID               : ************************************
UserPrincipalName :

C:\>setspn -L server1
Registered ServicePrincipalNames for CN=SERVER1,OU=ou1,OU=ou2,OU=ou3,DC=dc1,DC=dc2, DC=dc3:
        HOST/server1.dc2.dc3
        HOST/SERVER1

C:\>nslookup server1
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server1.dc2.dc3
Address:  123.456.7.890

C:\>nslookup 123.456.7.890
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server1.dc2.dc3
Address:  123.456.7.890 

对于失败的连接(RHEL 7 服务器)

C:\>powershell Get-ADComputer server2

DistinguishedName : CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3
DNSHostName       : server2.dc1.dc2.dc3
Enabled           : True
Name              : SERVER2
ObjectClass       : Computer
ObjectGUID        : bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
SamAccountName    : SERVER2$
SID               : ************************************
UserPrincipalName :

C:\>setspn -L server2
Registered ServicePrincipalNames for CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3:
        RestrictedKrbHost/SERVER2
        HOST/SERVER2
        RestrictedKrbHost/SERVER2.dc1.dc2.dc3
        HOST/SERVER2.dc1.dc2.dc3

C:\>nslookup server2
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server2.dc1.dc2.dc3
Address:  12.345.6.78

C:\>nslookup 12.345.6.78
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server2.dc2.dc3
Address:  12.345.6.78

比较 Weblogic 跟踪成功与失败的结果:

成功:

>>> DEBUG: ----Credentials----
        client: [email protected]
        server: cifs/[email protected]
        ticket: sname: cifs/[email protected]

失败:

>>>KRBError:
  ...
         error code is 7
         error Message is is Server not found in Kerberos database
         sname is cifs/[email protected]
         msgType is 30

因此我注意到以下几点:

  • 成功的(RHEL 6)服务器在很多地方省略了“dc1”(但不是全部)
  • 成功和失败sname仅在服务器部分有所不同 - 它们在“dc”值上排列。
  • 这两台服务器位于不同的组织单位(尽管我不认为这是问题所在)
  • 命令结果中大小写有少许差异
  • 根据是通过服务器名称(包括)还是 IP 地址(排除)查找,nslookup结果似乎有所不同server2dc1dc1

答案1

终于让它工作了。

关键部分

  • 反向 DNS 必须与正向 DNS 匹配
  • 在某些情况下必须明确添加 SPN(服务主体名称)——仅加入 Active Directory 域并不总是会注册所有必要的HOSTSPN。
  • 在某些情况下,可能还需要在文件中明确将服务器与某个领域关联起来krb5.conf。这似乎适用于涉及多个 Kerberos 领域的情况。笔记:您必须重新启动 WebLogic 或重新启动服务器才能krb5.conf使更改生效。

概括

  • 我相信“Kerberos 数据库”与“密钥分发中心”共存,对于 Windows 来说,它是 Active Directory。

  • 正向和反向 DNS 条目(例如nslookup在 Windows 中所示)必须匹配。

    • 我相信反向 DNS 查找将用于获取服务器名称,然后该服务器名称将用于查询 KDC 以验证服务器。
  • Linux 服务器(可能是 MIT Kerberos?)和 Active Directory 之间必须存在双向信任关系。在 Linux 端,这是通过 keytab 建立的。

  • 服务主体名称 (SPN) 的服务器部分在某些情况下可能不是匹配报告的 DNS 名称nslookup

    • 这仍然有效如果SPN 已添加正确的凭据。(编辑 - 经过进一步审查,这在我们的环境中没有显示 - 我搞不清楚哪个设置是原始的)
    • 应该有HOST一个与 报告的名称一致的 SPN(对于 samba 来说,这将是一个 spn)nslookup。在大多数情况下,当计算机加入域时,应该会自动添加正确的 HOST SPN,但在某些情况下,可能需要使用以下方式明确添加 SPN,例如setspn -A
    • 如果 SPN 的服务器部分无法通过 DNS 解析,则该 SPN 将不可用。
  • DNSHostNamepowershell Get-ADComputer报告不是似乎对使事情正常运转很重要。(请注意,这可能与 报告的结果不同nslookup

  • 服务主体可以出现在 Windows 端或 Linux 端 - 并且它们不一定是镜像。

    • 例如,在 Linux 上,我们会在 samba 日志中看到,但在 Windows 上却从未显示过该 SPN。cifs/[email protected]setspn -L server1setspn -L server2

修复该问题的过程:

  1. 我们从 Active Directory 中删除了 Linux 服务器

  2. 我们修改了 DNS 条目,以便使用nslookup名称或 IP 返回相同的结果

  3. 我们在 Linux 中重新创建了 keytab

    • 这使得 Linux 可以信任 Active Directory,但反之则不行
  4. 我们将 Linux 服务器重新加入到 Active Directory

    • 在这个阶段,我们仍然可以不是在 Java 中连接,但我们可以在 Windows 资源管理器中连接
    • 在这个阶段setspn -L server2包含 SPN HOST/server2.dc1.dc2.dc3,但是不是拥有 SPNHOST/server2.dc2.dc3
  5. setspn我们使用Windows 命令提示符添加了 SPN 。

    • 这需要域管理员或委派的权限(我认为对于机器主体来说)
    • setspn -A HOST/server2.dc2.dc3 server2$
    • 上述命令使用机器账户凭证创建一个新的服务主体

不确定性

仍然不完全清楚为什么 Windows 资源管理器始终可以工作,但我确实注意到 Java 有其自己的 Kerberos 实现部分 - 因此这可能在要求明确注册附加 SPN 方面发挥作用。

有趣的是,我们实际上发现其中涉及两个不同的 Kerberos 领域。

  1. DC1.DC2.DC3根据 Windows 命令确定echo %userdnsdomain%
  2. ccc.dc2.dc3由 Linux 决定krb5.conf

但是,一旦我们添加了最终的 SPN,我们就可以使用 Kerberos Realm(区分大小写)进行连接。

最终配置

最终有效的配置如下。一些 spn 可能是不必要的(例如,我认为 spn 不是RestrictedKrbHost必需的,因为server1没有它们),而且我非常确定,DNSHostName因为阻止Get-ADComputer与此问题无关(因为它没有改变非工作和工作配置。)

C:\> echo %userdnsdomain%
DC1.DC2.DC3

C:\> powershell Get-ADComputer server2
DistinguishedName : CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3
DNSHostName       : server2.dc1.dc2.dc3
Enabled           : True
Name              : SERVER2
ObjectClass       : computer
ObjectGUID        : bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
SamAccountName    : SERVER2$
SID               : ************************************
UserPrincipalName :

C:\>setspn -L server2
Registered ServicePrincipalNames for CN=SERVER2,OU=ou4,DC=dc1,DC=dc2,DC=dc3:
        HOST/server2.dc2.dc3
        RestrictedKrbHost/SERVER2
        HOST/SERVER2
        RestrictedKrbHost/SERVER2.dc1.dc2.dc3
        HOST/SERVER2.dc1.dc2.dc3

C:\>nslookup server2
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server2.dc2.dc3
Address:  12.345.6.78

C:\>nslookup 12.345.6.78
Server:  aa1.dc2.dc3
Address:  123.456.789.01

Name:    server2.dc2.dc3
Address:  12.345.6.78

在我们的例子中,当我们稍后将应用程序部署到在 RHEL7 上运行的 WebLogic 时:

  • ccc.dc2.dc3当我们在运行 MIT Kerberos 的“linux”领域中指定用户时,我们再次收到“Kerberos 数据库中未找到服务器”的信息

  • 当我们在“Active Directory”领域中指定用户时,我们得到“无服务凭证” DC1.DC2.DC3

    • /etc/krb5.conf解决方案是在 Linux WebLogic 服务器上进行修改,以将文件服务器与 Active Directory 领域明确关联,例如:
    [domain_realm]
    server2.dc2.dc3 = DC1.DC2.DC3
    

答案2

这似乎就是罪魁祸首:

    error Message is Server not found in Kerberos database
    sname is cifs/***********@***********

要问的第一个问题是故障服务器是否在 AD 中具有适当的计算机帐户(并且它已配置 sssd 并不一定意味着这取决于 sssd 的配置方式)。

假设存在,您可以使用setspnWindows 命令或 OpenLDAPldapsearch命令检查该计算机对象是否存在适当的服务主体。如果我没记错的话,HOST/* SPN 应该就足够了,但如果没有(请查看有关该主题的 Microsoft 文档),则可能需要 cifs/ SPN。setspn可以使用命令来创建它们(为尝试执行此操作的用户提供适当的权限)。

下一步是确保 Linux 服务器上的 samba 配置已创建并可访问 keytab,并确保上述 cifs/* 主体存在。

我不是 AD 专家(只是在那里附加了一些 Linux 系统)所以这可能不是完整的列表,但希望 - 它能为您提供一个开始。

答案3

您是否已在 AD 中注册了服务器?如 - 您在 AD 用户和计算机中看到它?该消息可能是指您的系统未被找到/注册。有时这是因为服务器的 DNS 名称与 AD 域名不同。

另一件需要注意的事情是时钟。如果时钟不同步太多,kerberos 就会出现很多问题。

相关内容