Active-Directory

在 Kerberos 數據庫中未找到伺服器 - 數據庫位於何處?

  • April 27, 2021

測試設置:

  • 在已加入活動目錄的 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.debugtrue是:

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 條目。

這是 Windows 10 機器、文件伺服器或 Active Directory KDC 上的“Kerberos 數據庫”嗎?或者是否有這個 Kerberos 數據庫的多個副本,每個副本都需要條目?

編輯 - 附加細節 我學到了一些新東西,可以提供一些附加細節。

以下內容均來自 Developer 機器上的 Window 命令提示符。

領域由以下因素決定:

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: username@DC1.DC2.DC3
       server: cifs/server1.dc2.dc3@DC1.DC2.DC3
       ticket: sname: cifs/server1.dc2.dc3@DC1.DC2.DC3

失敗:

>>>KRBError:
 ...
        error code is 7
        error Message is is Server not found in Kerberos database
        sname is cifs/server2.dc2.dc3@DC1.DC2.DC3
        msgType is 30

所以我注意幾點:

  • 成功的(RHEL 6)伺服器在許多地方(但不是全部)省略了“dc1”
  • 成功和失敗sname僅在伺服器部分有所不同——否則它們會排列在“dc”值上。
  • 兩台伺服器位於不同的組織單位中(儘管我認為這不是問題)
  • 命令結果的大小寫有一些差異
  • nslookup結果似乎有所不同,server2具體取決於是通過伺服器名稱(包括dc1)還是 IP 地址(不包括dc1)查找

這似乎是罪魁禍首:

   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 系統)所以這可能不是完整的列表,但希望 - 它給你一個開始。

你用AD註冊伺服器了嗎?如 - 您在 AD 使用者和電腦中看到它嗎?該消息可能是指未找到/註冊您的系統。有時這是因為伺服器的 DNS 名稱與 AD 域名不同。

另一個需要注意的是時鐘。如果時鐘遠遠不同步,很多事情都會因 kerberos 而中斷。

引用自:https://serverfault.com/questions/1055119