教學課程:透過 Linux 上的 SQL Server 使用 Active Directory 驗證

適用於:Linux 上的 SQL Server

本教學課程說明如何設定 Linux 上的 SQL Server,以支援 Active Directory 驗證 (也稱為整合式驗證)。 如需概觀,請參閱適用於 Linux 上 SQL Server 的 Active Directory 驗證。

本教學課程包含下列工作:

  • 將 SQL Server 主機加入 Active Directory 網域
  • 建立一個 SQL Server 的 Active Directory 使用者,並設定 SPN
  • 設定 SQL Server 服務金鑰表
  • 保護 Keytab 檔案
  • 設定 SQL Server 以使用 Keytab 檔案進行 Kerberos 驗證
  • 在 Transact-SQL 中建立 Active Directory 型登入
  • 使用 Active Directory 驗證連線至 SQL Server

先決條件

在設定 Active Directory 認證之前,您需要:

Note

從 SQL Server 2025(17.x)開始,SUSE Linux Enterprise Server(SLES)不再支援。

將 SQL Server 主機加入 Active Directory 網域

將你的 SQL Server Linux 主機連接到 Active Directory 網域控制器。 關於如何加入 Active Directory 網域的資訊,請參見「在 Linux 主機上加入 SQL Server 到 Active Directory 網域」。

建立適用於 SQL Server 的 Active Directory 使用者並設定 SPN

Note

下列步驟會使用您的完整網域名稱 (FQDN)。 如果您是在 Azure 上,您必須先建立 FQDN,然後繼續執行。

  1. 在您的網域控制站上執行 New-ADUser PowerShell 命令,以建立密碼永不過期的新 Active Directory 使用者。 下列範例會將帳戶命名為 sqlsvc,但帳戶名稱可以是您喜歡的任何名稱。 系統將提示您輸入該帳戶的新密碼。

    Import-Module ActiveDirectory
    
    New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $true
    

    安全性最佳做法是針對 SQL Server 使用專用的 Active Directory 帳戶,讓 SQL Server 執行個體認證不會與使用相同帳戶的其他服務共用。 不過,如果您知道帳戶的密碼 (在下一個步驟中產生金鑰表檔案所需的項目),則可以選擇性地重複使用現有的 Active Directory 帳戶。 此外,該帳戶應能夠支援使用者帳戶上的 128 位元與 256 位元 Kerberos AES 加密 (msDS-SupportedEncryptionTypes 屬性)。 若要驗證帳戶是否為已啟用 AES 加密的帳戶,請在 [Active Directory 使用者與電腦] 公用程式中找到帳戶,然後選取 [屬性]。 在 [屬性] 中找到 [帳戶] 索引標籤,並驗證已選取下列兩個核取方塊。

    1. 這個帳戶支援 Kerberos AES 128 位元加密
    2. 這個帳戶支援 Kerberos AES 256 位元加密
  2. 請使用 setspn.exe 工具設定此帳戶的服務主體名稱(SPN)。 SPN 必須與下列範例中所指定的格式完全相同。 您可以在 SQL Server 主機上執行 hostname --all-fqdns,以尋找 SQL Server 主機電腦的完整網域名稱。 除非您已將 SQL Server 設定為使用不同的連接埠號碼,否則 TCP 通訊埠應為 1433。

    setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc
    setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvc
    

    Note

    如果您收到錯誤 Insufficient access rights,請洽詢您的網域系統管理員,確定您有足夠的權限可在此帳戶上設定 SPN。 用來註冊 SPN 的帳戶將會需要 Write servicePrincipalName 權限。 如需詳細資訊,請參閱 註冊 Kerberos 連線的服務主體名稱。

    如果您日後變更 TCP 通訊埠,則必須使用新的連接埠號碼再次執行 setspn 命令。 您還需要遵循下一節中的步驟,將新的 SPN 新增至 SQL Server 服務 Keytab。

如需詳細資訊,請參閱 註冊 Kerberos 連線的服務主體名稱。

設定 SQL Server 服務金鑰表

設定 Linux 上的 SQL Server 的 Active Directory 驗證需要 Active Directory 使用者帳戶,以及在上一節中建立的 SPN。

Important

如果 Active Directory 帳戶的密碼已變更,或受派 SPN 帳戶的密碼已變更,您就必須使用新的密碼和金鑰版本號碼 (KVNO) 來更新金鑰表。 某些服務也可能會自動輪替密碼。 請檢閱前述帳戶的任何密碼輪替原則,並將它們與排程的維護活動配合,以避免產生非預期的停機時間。

SPN Keytab 條目

  1. 請檢查前一節建立的 Active Directory 帳號的金鑰版本號(KVNO)。 通常是 2,但如果您多次變更帳戶的密碼,則可能是另一個整數。 在 SQL Server 主機電腦上,請執行下列命令:

    • 以下範例假設 user 位於 @CONTOSO.COM 網域中。 將使用者和網域名稱修改為您的使用者和網域名稱。
    kinit user@CONTOSO.COM
    kvno user@CONTOSO.COM
    kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM
    

    Note

    SPN 可能需要幾分鐘的時間才能傳播到您的網域,特別是當網域很大時。 如果您收到錯誤 kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM,請稍候幾分鐘,然後再試一次。 只有在伺服器已加入 Active Directory 網域時,先前的命令才能運作,該網域已在先前章節中涵蓋。

  2. 使用 ktpass,請在 Windows 命令提示字元中使用以下指令為每個 SPN 新增按鍵表條目:

    • <DomainName>\<UserName> - Active Directory 使用者帳戶
    • @CONTOSO.COM - 使用您的網域名稱
    • /kvno <#> - 將 <#> 替換為在前面步驟中獲得的 KVNO
    • <password> - 您的密碼應遵循 SQL Server 預設 密碼原則。 根據預設,密碼長度必須至少為8個字元,且包含下列四個集合中的三個字元:大寫字母、小寫字母、基底10位數和符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    

    先前的命令同時允許 AES 和 RC4 加密加密密碼進行 Active Directory 驗證。 RC4 是較舊的加密編碼器,如果需要較高的安全性等級,您可以選擇只使用 AES 加密編碼器來建立 Keytab 項目。

    Note

    最後兩個 UserName 項目必須使用小寫,否則認證可能會失敗。

  3. 執行上述命令之後,您應該會有名為 的 mssql.keytabkeytab檔案。 將檔案複製到 SQL Server 機器的 /var/opt/mssql/secrets 資料夾下。

  4. 保護 Keytab 檔案。

    有權存取此 Keytab 檔案的任何人都可以在網域上模擬 SQL Server,因此請務必限制檔案的存取權,只讓 mssql 帳戶具有讀取權限:

    sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab
    sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
    
  5. 以下設定選項需在工具中 mssql-conf 設定,以指定存取 keytab 檔案時要使用的帳號。

    sudo mssql-conf set network.privilegedadaccount <username>
    

    Note

    只包含使用者名稱,而非 domainname\username 或 username@domain。 使用此使用者名稱時,SQL Server 會在內部視需要新增網域名稱。

  6. 使用下列步驟來設定 SQL Server,以開始使用 Keytab 檔案進行 Kerberos 驗證。

    sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    sudo systemctl restart mssql-server
    

    您可以選擇性地停用域控制器的 UDP 連線,以改善效能。 在許多情況下,連線到網域控制站時,UDP 連線會一直失敗,因此您可以在 /etc/krb5.conf 中針對設定選項進行設定以略過 UDP 呼叫。 請編輯 /etc/krb5.conf 並設定下列選項:

    [libdefaults]
    udp_preference_limit = 0
    

此時,您已準備好在 SQL Server 中使用 Active Directory 型登入。

在 Transact-SQL 中建立 Active Directory 型登入

  1. 連線到 SQL Server 並建立新的 Active Directory 型登入:

    CREATE LOGIN [CONTOSO\user]
        FROM WINDOWS;
    
  2. 確認登入現在已列在 sys.server_principals 系統目錄檢視中:

    SELECT name
    FROM sys.server_principals;
    

使用 Active Directory 驗證連線至 SQL Server

使用您的網域認證來登入用戶端電腦。 現在您可以使用 Active Directory 驗證連線到 SQL Server,而不需要重新輸入密碼。 如果您建立 Active Directory 群組的登入,則任何屬於該群組成員的 Active Directory 使用者都可以使用相同方式進行連線。

用戶端要使用 Active Directory 驗證時的特定連接字串參數,取決於您所使用的驅動程式。 請考慮下列各節中的範例。

在已加入網域的 Linux 客戶端上使用 sqlcmd

使用 ssh 和您的網域認證登入已加入網域的 Linux 用戶端:

ssh -l user@contoso.com client.contoso.com

請確保你安裝了 mssql-tools 套件,然後用 sqlcmd 以下方式連線,且不指定任何憑證:

sqlcmd -S mssql-host.contoso.com

與 Windows 上的 SQL Server 不同,Kerberos 認證適用於 Linux 上與 Linux 上的 SQL Server 的本地連線。 不過,你仍然需要提供 SQL Server 主機的 FQDN。 如果你嘗試連接到 .、 localhost或 127.0.0.1,Active Directory 認證將無法運作。

在加入網域的 Windows 用戶端上使用 SSMS

使用網域認證登入已加入網域的 Windows 用戶端。 請確定已安裝 SQL Server Management Studio,然後在 [連線到伺服器]mssql-host.contoso.com 對話方塊中指定 [Windows 驗證],以連線到您的 SQL Server 執行個體 (例如 )。

使用其他用戶端驅動程式的 Active Directory 驗證

下表描述其他用戶端驅動程式的建議:

用戶端驅動程式 Recommendation
JDBC 使用 Kerberos 整合式驗證來連接 SQL Server。
ODBC 使用整合式驗證。
ADO.NET 連接字串語法。

其他組態選項

如果你使用第三方工具如 PBIS、VAS 或 Centrify 將 Linux 主機加入 Active Directory 網域,且想強制 SQL Server 直接使用 OpenLDAP 函式庫,你可以以下mssql-conf設定:disablesssd

sudo mssql-conf set network.disablesssd true
sudo systemctl restart mssql-server

Note

有些工具像 是 realmd 可以設定 SSSD,而其他工具如 PBIS、VAS 和 Centrify 則不會設定 SSSD。 如果用來加入 Active Directory 網域的工具未設定 SSSD,您應將 disablesssd 選項設為 true。 雖然這不是必須的,因為 SQL Server 嘗試先使用 SSSD 管理 Active Directory,然後才退回到 OpenLDAP 機制,但設定此選項後,SQL Server 能直接呼叫 OpenLDAP,繞過 SSSD。

如果您的網域控制站支援 LDAPS,您可以強制所有從 SQL Server 到網域控制站的連線都是透過 LDAPS 來進行。 若要檢查您的用戶端是否可以透過 LDAPS 與網域控制站連線,請執行下列 Bash 命令 ldapsearch -H ldaps://contoso.com:3269。 若要將 SQL Server 設定為只使用 LDAPS,請執行下列命令:

sudo mssql-conf set network.forcesecureldap true
sudo systemctl restart mssql-server

如果主機使用 SSSD 加入 Active Directory 網域且disablesssd未設定為 true,SQL Server 會使用 LDAPS 而非 SSSD 。 若 forcesecureldap 和 disablesssd 都設為 true,SQL Server 會透過 OpenLDAP 使用 LDAPS。

SQL Server 2017 CU 14 及後續版本

從 SQL Server 2017(14.x)CU 14 開始,如果 SQL Server 是透過第三方提供者加入 Active Directory 網域,且藉由將 disablesssd 設定為 true 來使用 OpenLDAP 呼叫進行一般 Active Directory 查閱,則也可以使用 enablekdcfromkrb5conf 選項,強制 SQL Server 使用 krb5 程式庫來查閱 KDC,而不是透過反向 DNS 查閱 KDC 伺服器。

當您想要手動設定 SQL Server 嘗試與其通訊的網域控制器,並搭配使用 OpenLDAP 函式庫機制與 krb5.conf 中的 KDC 清單時,這樣可能會很有用。

首先,將 disablesssd 和 enablekdcfromkrb5conf 設定為 true,然後重新啟動 SQL Server:

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
sudo systemctl restart mssql-server

然後,在 /etc/krb5.conf 中設定 KDC 清單,如下所示:

[realms]
CONTOSO.COM = {
  kdc = dcWithGC1.contoso.com
  kdc = dcWithGC2.contoso.com
}

雖然不建議這麼做,但您可以使用 realmd 之類的公用程式,在將 Linux 主機加入網域時設定 SSSD,同時將 disablesssd 設定為 true,讓 SQL Server 使用 OpenLDAP 呼叫,而不是使用用於 Active Directory 相關呼叫的 SSSD。

Note

不支援使用 FQDN 進行 SQL Server 登入 (例如,CONTOSO.COM\Username)。 請使用 CONTOSO\Username 格式。

不支援從網域本機群組進行 SQL Server 登入。 請改用全域安全性網域群組。

參與編輯 SQL 文件

您知道您可以自行編輯 SQL 內容嗎? 如果這麼做,您不僅能協助改善我們的文件,還能被列為該頁面的貢獻者。

欲了解更多資訊,請參閱 編輯Microsoft學習文件。