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

適用於:SQL Server - Linux

本教學課程說明如何設定 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 驗證之前,您必須:

將 SQL Server 主機加入 Active Directory 網域

將 SQL Server Linux 主機加入 Active Directory 網域控制站。 如需如何加入 Active Directory 網域的資訊,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域

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

注意

下列步驟會使用您的完整網域名稱 (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 工具來設定此帳戶的 ServicePrincipalName (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
    

    注意

    如果您收到錯誤 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。

重要

如果 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
    

    注意

    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. 在 Windows 機器命令提示字元中,使用下列命令,以 ktpass 為每個 SPN 新增 Keytab 項目:

    • <DomainName>\<UserName> - Active Directory 使用者帳戶
    • @CONTOSO.COM - 使用您的網域名稱
    • /kvno <#> - 將 <#> 取代為先前步驟中取得的 KVNO
    • <StrongPassword> - 使用強式密碼
    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 <StrongPassword>
    
    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 <StrongPassword>
    
    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 <StrongPassword>
    
    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 <StrongPassword>
    
    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 <StrongPassword>
    
    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 <StrongPassword>
    

    注意

    上述命令允許 AES 和 RC4 加密編碼器進行 Active Directory 驗證。 RC4 是較舊的加密編碼器,如果需要較高的安全性等級,您可以選擇只使用 AES 加密編碼器來建立 Keytab 項目。 最後兩個 UserName 項目必須是小寫,否則授權驗證可能會失敗。

  3. 執行上述命令之後,您應該會有名為 mssql.keytab 的 Keytab 檔案。 將檔案複製到 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>
    

    注意

    只包含使用者名稱,而非 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 並設定下列選項:

    /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

不同於 SQL Windows,Kerberos 驗證適用於 SQL Linux 中的本機連線。 不過,您仍然需要提供 SQL Linux 主機的 FQDN,如果您嘗試連線到 .localhost127.0.0.1 等等,則無法使用 Active Directory 驗證。

已加入網域的 Windows 用戶端上 SSMS

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

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

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

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

其他組態選項

如果您使用 PBISVASCentrify 等第三方公用程式將 Linux 主機加入 Active Directory 網域,且想要強制 SQL Server 直接使用 OpenLDAP 程式庫,您可以使用 mssql-conf 來設定 disablesssd 選項,如下所示:

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

注意

有些公用程式 (例如 realmd) 會設定 SSSD,而 PBIS、VAS 和 Centrify 之類的其他工具則不會設定 SSSD。 如果用來加入 Active Directory 網域的公用程式未設定 SSSD,則建議您將 disablesssd 選項設定為 true。 雖然這不是必要項目,因為 SQL Server 會在回到 OpenLDAP 機制之前嘗試針對 Active Directory 使用 SSSD,但設定此項會提高效能,因此 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
systemctl restart mssql-server

如果主機上的 Active Directory 網域加入作業是透過 SSSD 套件完成,且 disablesssd 未設定為 true,則這會使用 LDAPS 而非 SSSD。 如果 disablesssd 設定為 true,且 forcesecureldap 設定為 true,則會使用 LDAPS 通訊協定,而非由 SQL Server 所進行的 OpenLDAP 程式庫呼叫。

SQL Server 2017 CU 14 之後

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

當您想要手動設定 SQL Server 嘗試與其通訊的網域控制站時,這可能會很有用。 而且您可以使用 OpenLDAP 程式庫機制,方法是在 krb5.conf 中使用 KDC 清單。

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

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
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。

注意

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

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

參與編輯 SQL 文件

您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。

如需詳細資訊,請參閱如何參與 SQL Server 文件