在 Kerberos 數據庫中未找到伺服器 - 數據庫位於何處?
測試設置:
在已加入活動目錄的 Windows 10 機器上執行的 Weblogic 12.2.1.4
- JVM 1.8.0_281
- Java Web 應用程序使用 Java GSSAPI 通過 Samba 訪問文件共享,基本上使用來自https://github.com/hierynomus/smbj/issues/304#issuecomment-375603115的程式碼
- 這是一個開發者機器——java系統屬性“user.name”顯示了開發者的windows使用者名
執行 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 條目。
這是 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)。
假設這存在,您可以使用
setspn
Windows 命令或 OpenLDAPldapsearch
命令來檢查該電腦對像是否存在適當的服務主體。如果我沒記錯 HOST/* SPN 就足夠了,但如果不是(請查看有關該主題的 Microsoft 文件)可能需要 cifs/SPN。setspn
命令可用於創建它們(給定嘗試執行此操作的使用者的適當權限)。下一步是確保 Linux 伺服器上的 samba 配置已創建和訪問 keytab,並確保上述 cifs/* 主體存在。
我不是 AD 專家(只是在那裡附加了一些 Linux 系統)所以這可能不是完整的列表,但希望 - 它給你一個開始。
你用AD註冊伺服器了嗎?如 - 您在 AD 使用者和電腦中看到它嗎?該消息可能是指未找到/註冊您的系統。有時這是因為伺服器的 DNS 名稱與 AD 域名不同。
另一個需要注意的是時鐘。如果時鐘遠遠不同步,很多事情都會因 kerberos 而中斷。