適用於:Linux 上的 SQL Server
本文可協助您針對 Linux 上的 SQL Server 和容器的 Active Directory 網域服務 驗證問題進行疑難排解。 其中包含成功 Active Directory 組態的先決條件檢查和提示,以及常見錯誤和疑難排解步驟的清單。
檢視目前的組態
在開始排除故障前,先驗證目前使用者、 mssql.conf服務主體名稱(SPN)及領域設定。
取得或續領 Kerberos TGT(發票券)時,請使用:
kinitkinit privilegeduser@CONTOSO.COM執行以下指令,並確保執行該指令的使用者有權限存取:
mssql.keytab/opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab欲了解更多指令資訊
validate-ad-config,請執行/opt/mssql/bin/mssql-conf validate-ad-config --help。
DNS 和反向 DNS 查詢
網域名稱及 NetBIOS 名稱的 DNS 查閱應該傳回相同的 IP 位址,這通常與網域控制站 (DC) 的 IP 位址相符。 從 SQL Server 主機電腦執行這些命令。
nslookup contoso nslookup contoso.com如果 IP 位址不符,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域,以修正 DNS 查閱和與 DC 的通訊。
對先前結果中的每個 IP 位址進行反向 DNS(rDNS)查詢。 如適用,請包含 IPv4 和 IPv6 位址。
nslookup <IPs returned from the above commands>全部都應該傳回
<hostname>.contoso.com。 否則,請檢查 Active Directory 中的 PTR(指標)紀錄。您可能必須與網域系統管理員合作,才能讓 rDNS 運作。 如果你無法為所有回傳的 IP 位址新增 PTR 條目,也可以將 SQL Server 限制在網域控制器的子集。 這項變更會影響主機上任何使用
krb5.conf的其他服務。如需反向 DNS 的詳細資訊,請參閱什麼是反向 DNS?
檢查 keytab 檔案及權限
檢查你是否建立了 keytab(鍵表)檔案,並且設定
mssql-conf了正確的檔案並取得適當的權限。 金鑰表必須可供mssql使用者帳戶存取。 如需詳細資訊,請參閱使用 adutil 透過 Linux 上的 SQL Server 設定 Active Directory 驗證。請確定您可以列出 keytab 的內容,並新增正確的 SPN、埠、加密類型和用戶帳戶。 如果你在建立 SPN 和 keytab 條目時沒有正確輸入密碼,嘗試用 Active Directory 認證登入時會遇到錯誤。
klist -kte /var/opt/mssql/secrets/mssql.keytab運作中 keytab 的範例如下。 此範例使用兩種加密類型,但您可以根據您環境中支援的加密類型,僅使用一或多個類型。 範例中,
sqluser@CONTOSO.COM是特權帳號(這與network.privilegedadaccount中的mssql-conf設定相符),而 SQL Server 的主機名稱為sqllinux.contoso.com,並在預設連接埠1433上接聽。$ kinit privilegeduser@CONTOSO.COM Password for privilegeduser@CONTOSO.COM: $ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: privilegeduser@CONTOSO.COM Valid starting Expires Service principal 01/26/22 20:42:02 01/27/22 06:42:02 krbtgt/CONTOSO.COM@CONTOSO.COM renew until 01/27/22 20:41:57 $ klist -kte /var/opt/mssql/secrets/mssql.keytab Keytab name: FILE:/var/opt/mssql/secrets/mssql.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes128-cts-hmac-sha1-96)
驗證 krb5.conf 中的領域資訊
在
krb5.conf(位於/etc/krb5.conf) 中,確認您提供預設領域、領域資訊和域到領域映射的值。 請參考以下範例krb5.conf檔案。 如需詳細資訊,請參閱瞭解 Linux 上的 SQL Server 和容器的 Active Directory 驗證。[libdefaults] default_realm = CONTOSO.COM default_keytab_name = /var/opt/mssql/secrets/mssql.keytab default_ccache_name = "" [realms] CONTOSO.COM = { kdc = adVM.contoso.com admin_server = adVM.contoso.com default_domain= contoso.com } [domain_realm] .contoso.com = CONTOSO.COM contoso.com = CONTOSO.COM您可以限制 SQL Server 對網域控制站子集的連絡,如果您的 DNS 組態傳回的網域控制站數目超過 SQL Server 需要連絡的數目,這會非常有用。 Linux 上的 SQL Server 允許你指定一份網域控制器清單,當執行輕量級目錄存取協定(LDAP)查詢時,SQL Server 以輪詢方式聯絡這些網域控制站。
完成這兩個步驟。 首先,透過新增你需要的網域控制器,並以
kdc =為前綴進行修改krb5.conf。[realms] CONTOSO.COM = { kdc = kdc1.contoso.com kdc = kdc2.contoso.com .. .. }該
krb5.conf檔案是常見的 Kerberos 用戶端設定檔,因此你在此檔案中所做的任何變更都會影響除了 SQL Server 以外的其他服務。 在做出任何變更前,請先諮詢你的網域管理員。啟用
network.enablekdcfromkrb5conf該設定,然後mssql-conf重新啟動 SQL Server:sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true sudo systemctl restart mssql-server
Kerberos 疑難排解
以下細節幫助您排除 Active Directory 認證問題並辨識特定錯誤訊息。
追蹤 Kerberos
建立使用者、SPN 和 keytab,並設定mssql-conf好後,請驗證 Active Directory 設定。
要驗證 Linux 上的 SQL Server 的設定,請使用特權帳號取得或續訂 Kerberos TGT。 執行此指令以顯示主控台中的 Kerberos 追蹤訊息(stdout):
root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser
如果沒有任何問題,您應該會看到類似下列範例的輸出。 如果沒有,追蹤會提供哪些步驟要回顧的上下文。
3791545 1640722276.100275: Getting initial credentials for sqluser@CONTOSO.COM
3791545 1640722276.100276: Looked up etypes in keytab: aes256-cts, aes128-cts
3791545 1640722276.100278: Sending unauthenticated request
3791545 1640722276.100279: Sending request (202 bytes) to CONTOSO.COM
3791545 1640722276.100280: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100281: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100282: Received answer (185 bytes) from stream 10.0.0.4:88
3791545 1640722276.100283: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100284: Response was from master KDC
3791545 1640722276.100285: Received error from KDC: -1765328359/Additional pre-authentication required
3791545 1640722276.100288: Preauthenticating using KDC method data
3791545 1640722276.100289: Processing preauth types: PA-PK-AS-REQ (16), PA-PK-AS-REP_OLD (15), PA-ETYPE-INFO2 (19), PA-ENC-TIMESTAMP (2)
3791545 1640722276.100290: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100291: Retrieving sqluser@CONTOSO.COM from /var/opt/mssql/secrets/mssql.keytab (vno 0, enctype aes256-cts) with result: 0/Success
3791545 1640722276.100292: AS key obtained for encrypted timestamp: aes256-cts/E84B
3791545 1640722276.100294: Encrypted timestamp (for 1640722276.700930): plain 301AA011180F32303231313XXXXXXXXXXXXXXXXXXXXXXXXXXXXX, encrypted 333109B95898D1B4FC1837DAE3E4CBD33AF8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3791545 1640722276.100295: Preauth module encrypted_timestamp (2) (real) returned: 0/Success
3791545 1640722276.100296: Produced preauth for next request: PA-ENC-TIMESTAMP (2)
3791545 1640722276.100297: Sending request (282 bytes) to CONTOSO.COM
3791545 1640722276.100298: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100299: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100300: Received answer (1604 bytes) from stream 10.0.0.4:88
3791545 1640722276.100301: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100302: Response was from master KDC
3791545 1640722276.100303: Processing preauth types: PA-ETYPE-INFO2 (19)
3791545 1640722276.100304: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100305: Produced preauth for next request: (empty)
3791545 1640722276.100306: AS key determined by preauth: aes256-cts/E84B
3791545 1640722276.100307: Decrypted AS reply; session key is: aes256-cts/05C0
3791545 1640722276.100308: FAST negotiation: unavailable
3791545 1640722276.100309: Initializing KCM:0:37337 with default princ sqluser@CONTOSO.COM
3791545 1640722276.100310: Storing sqluser@CONTOSO.COM -> krbtgt/CONTOSO.COM@CONTOSO.COM in KCM:0:37337
3791545 1640722276.100311: Storing config in KCM:0:37337 for krbtgt/CONTOSO.COM@CONTOSO.COM: pa_type: 2
3791545 1640722276.100312: Storing sqluser@CONTOSO.COM -> krb5_ccache_conf_data/pa_type/krbtgt/CONTOSO.COM@CONTOSO.COM@X-CACHECONF: in KCM:0:37337
$ sudo klist
Ticket cache: KCM:0:37337
Default principal: sqluser@CONTOSO.COM
Valid starting Expires Service principal
12/28/2021 20:11:16 12/29/2021 06:11:16 krbtgt/CONTOSO.COM@CONTOSO.COM
renew until 01/04/2022 20:11:16
啟用 Kerberos 及以安全性為基礎的 PAL 記錄
為了識別 PAL(平台抽象層)中的特定錯誤訊息,啟用 security.kerberos 並 security.ldap 記錄。 建立logger.ini一個包含以下內容的檔案,/var/opt/mssql/然後重新啟動 SQL Server,以捕捉任何初始化錯誤。 重現失敗的部分。 PAL 會將 Active Directory 錯誤與除錯訊息記錄為 /var/opt/mssql/log/security.log。
[Output:security]
Type = File
Filename = /var/opt/mssql/log/security.log
[Logger]
Level = Silent
[Logger:security.kerberos]
Level = Debug
Outputs = security
[Logger:security.ldap]
Level = Debug
Outputs = security
SQL Server 會偵測到未重啟時的logger.ini日誌變更,但啟動時服務初始化時Active Directory失敗SQL Server否則不會被注意到。 重新啟動 SQL Server 會捕捉所有錯誤訊息。
安全性記錄會繼續寫入磁碟機,直到您移除 logger.ini 中的變更為止。 一旦發現並解決問題,請停用 security.kerberos 並 security.ldap 記錄,以避免硬碟空間不足。
PAL 記錄器會以下列格式產生記錄檔:
<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>
例如,記錄檔中的範例行如下:
12/28/2021 13:56:31.609453055 Error [security.kerberos] <0003753757/0x00000324> Request ticket server MSSQLSvc/sql.contoso.com:1433@CONTOSO.COM kvno 3 enctype aes256-cts found in keytab but cannot decrypt ticket
啟用 PAL 日誌並重現問題後,尋找第一則日誌層級為 Error的訊息。 請參考以下表格找出錯誤,並依照指引與建議進行故障排除與解決問題。
常見的錯誤訊息
錯誤訊息:「登入失敗。 登入來自不受信任的網域,無法使用整合驗證。」
可能原因
當你設定 Active Directory 驗證後,嘗試用 Active Directory 帳號登入時會遇到這個錯誤。
指導
此一般錯誤訊息會要求您 啟用 PAL 記錄 來識別特定錯誤。
請參考以下常見錯誤清單,找出每個錯誤的可能原因,然後依照故障排除指引解決問題。
| 錯誤訊息 |
|---|
| 找不到 Windows NT 使用者或群組 'CONTOSO\user' |
| 因為發生錯誤,所以無法查閱簡短網域名稱 |
| 因為發生錯誤,所以無法針對主機 <主機名稱> 執行 rDNS 查閱 |
| rDNS 查閱未傳回 FQDN |
| 無法繫結至 LDAP 伺服器 |
| 找不到金鑰表項目 |
| 找不到 <主體> 的金鑰表項目 |
| 找不到要求票證伺服器<主體>於金鑰表中 (票證 kvno <KVNO>) |
| 在金鑰表中找到要求票證伺服器 <主體> kvno <KVNO>,但未使用 enctype <加密類型> |
| 在金鑰表中找到要求票證伺服器主體 <、kvno >、KVNO< 和加密類型 >,但無法解密票證。 |
錯誤訊息:找不到 Windows NT 使用者或群組 'CONTOSO\user'
可能原因
嘗試建立 Windows 登入或在群組重新整理期間,可能會遇到此錯誤。
指導
要驗證問題,請依照「登入失敗」的指引操作。 登入來自不受信任的網域,無法與整合式驗證搭配使用。 (Microsoft SQL Server,錯誤:18452)」並啟用 PAL 日誌以識別特定錯誤,並據此進行故障排除。
錯誤訊息:「因為發生錯誤,所以無法查閱簡短網域名稱」
可能原因
用於建立 Active Directory 登入的 Transact-SQL 語法為:
CREATE LOGIN [CONTOSO\user]
FROM WINDOWS;
指令中必須包含 NetBIOS 名稱(CONTOSO),但在執行 LDAP 連線時,必須在後端提供網域contoso.com的 FQDN。 若要進行這項轉換,則會對 CONTOSO 執行 DNS 查閱以解析為網域控制站的 IP,然後便可繫結至 LDAP 查詢。
指導
錯誤訊息「因錯誤無法查詢短網域名稱」暗示 nslookup for contoso 無法解析到網域控制器的 IP 位址。 檢查 DNS 和反向 DNS 查詢 ,確認 nslookup NetBIOS 和網域名稱是否匹配。
錯誤訊息:「因錯誤而無法執行主機名<>的 rDNS 查閱」或「rDNS 查閱未傳回 FQDN」
可能原因
這些錯誤訊息通常表示反向 DNS 紀錄(PTR 紀錄)並非所有網域控制器都存在。
指導
檢查 DNS 和反向 DNS 查找。 當你辨識出沒有 rDNS 條目的網域控制站後,你有兩個選擇:
為所有網域控制站新增 rDNS 項目
這個設定不是 SQL Server 的設定,你必須在網域層級設定。 你可能需要和網域管理團隊合作,為所有回
nslookup傳該網域名稱的網域控制器建立所需的 PTR 紀錄。將 SQL Server 限制為網域控制站的子集
如果你無法為所有回傳的網域控制器新增 PTR 紀錄,你可以限制 SQL Server 只用部分網域控制器。
錯誤訊息:「無法繫結至 LDAP 伺服器 ldap://CONTOSO.COM:3268:本機錯誤」
可能原因
OpenLDAP 的這個一般錯誤通常表示下列兩件事之一:
- 無認證
- rDNS 問題
以下是錯誤訊息的範例:
12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error
指導
無認證
如果憑證無法載入 LDAP 連線,其他錯誤訊息會先出現。 啟用 PAL 日誌 ,並在這筆錯誤之前檢查錯誤日誌是否有錯誤訊息。 如果沒有任何其他錯誤,很可能不是認證問題。 如果發現錯誤,先修正再繼續。 大多數情況下,這是本文所涵蓋的錯誤訊息之一。
rDNS 問題
檢查 DNS 和反向 DNS 查找。
當 OpenLDAP 函式庫連接到網域控制器時,會提供完全限定的網域名稱(FQDN),在此範例中為
contoso.com,或是 DC 的 FQDN(kdc1.contoso.com)。 建立連線後(但在呼叫者成功之前),OpenLDAP 函式庫會檢查它所連接伺服器的 IP。 接著執行反向 DNS 查詢,並檢查所連接kdc1.contoso.com伺服器名稱是否與請求的網域contoso.com()。 如果不符合,OpenLDAP 函式庫會因安全性原因而中斷連線。 這種不匹配正是為什麼 rDNS 設定在 Linux 上的 SQL Server 上很重要,也是本文的重點。
錯誤訊息:「找不到金鑰表項目」
可能原因
此錯誤表示鍵表檔案有存取問題或鍵表中缺少條目。
指導
請確定金鑰表檔案具有正確的存取層級及權限。 keytab 檔案的預設位置與名稱為 /var/opt/mssql/secrets/mssql.keytab。 要查看 secrets 資料夾下所有檔案的當前權限,請執行以下指令:
sudo ls -lrt /var/opt/mssql/secrets
請使用以下指令來設定 keytab 檔案的權限與存取權限:
sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab
如需更多有關列出 keytab 項目以及設定正確的許可權的詳細資訊,請參閱上一 節的 Check keytab 檔案和許可權 一節。 如果你不符合該區段的任何條件,你會看到這個錯誤或等效錯誤: "Key table entry not found"。
錯誤訊息:「找不到 <主體> 的金鑰表項目」
可能原因
當你嘗試從鍵籤中取得 的 <principal> 憑證時,卻找不到任何相關的條目。
指導
若要列出 keytab 中的所有條目,請遵循 本文的 檢查 keytab 檔案和權限 一節。 請確定 <principal> 存在。 在這種情況下,主帳戶通常是 network.privilegedadaccount 你登記 SPN 的帳戶。 如果不是,就用指令 adutil 加進去。 如需詳細資訊,請參閱使用 adutil 透過 Linux 上的 SQL Server 設定 Active Directory 驗證。
錯誤訊息:「請求票證伺服器 <主體> 在金鑰表中找不到(票證 kvno <KVNO>)」
可能原因
此錯誤表示 SQL Server 找不到符合指定金鑰版本號(KVNO)的請求工單的鍵表項目。
指導
若要列出 keytab 中的所有條目,請遵循 本文的 檢查 keytab 檔案和權限 一節。 如果你找不到符合 KVNO 的 <principal> 錯誤訊息,請依照該章節的步驟更新 keytab 檔案加入這個項目。
您也可以執行下列命令,從 DC 取得最新的 KVNO。 在執行此指令前,先取得或續約帶有該 kinit 指令的 Kerberos TGT。 如需詳細資訊,請參閱使用 adutil 為 SQL Server 建立 Active Directory 使用者,並設定服務主體名稱 (SPN)。
kvno MSSQLSvc/<hostname>
錯誤訊息:「在金鑰表中找到要求票證伺服器 <主體> kvno <KVNO>,但未使用 enctype <加密類型>」
可能原因
此錯誤表示 SQL Server 的鍵頁中沒有客戶端所請求的加密類型。
指導
要驗證時,請依照本文的 檢查鍵表檔案及權限 部分,列出鍵表中的所有項目。 如果你找不到符合主體、KVNO 和加密類型的錯誤訊息,請依照該章節的步驟更新 keytab 檔案,新增這個條目。
錯誤訊息:「請求票證伺服器 <主體> kvno <KVNO> enctype <加密類型> 在 keytab 中找到,但無法對票證進行解密」
可能原因
此錯誤訊息表示 SQL Server 無法使用鍵表檔案中的憑證來解密收到的認證請求。 密碼錯誤常常會導致此錯誤。
指導
用正確的密碼重新建立 keytab。 如果你使用 adutil,並建立正確的密碼鍵頁,並依照教學步驟操作:使用 adutil 在 Linux 上使用 Linux 上的 SQL Server 配置 Active Directory 認證。
通用連接埠
下表顯示 Linux 上的 SQL Server 用來配置和管理 Active Directory 認證的常見埠碼。
| Active Directory 服務 | Port |
|---|---|
| DNS | 53 |
| LDAP | 389 |
| LDAPS | 636 |
| Kerberos | 88 |