教學課程:透過 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 驗證之前,您必須:
- 在您的網路上設定 Active Directory 網域控制站 (Windows)
- 安裝 SQL Server
將 SQL Server 主機加入 Active Directory 網域
將 SQL Server Linux 主機加入 Active Directory 網域控制站。 如需如何加入 Active Directory 網域的資訊,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域。
建立適用於 SQL Server 的 Active Directory 使用者並設定 SPN
在您的網域控制站上執行 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 使用者與電腦] 公用程式中找到帳戶,然後選取 [屬性]。 在 [屬性] 中找到 [帳戶] 索引標籤,並驗證已選取下列兩個核取方塊。這個帳戶支援 Kerberos AES 128 位元加密
這個帳戶支援 Kerberos AES 256 位元加密
使用 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 項目
檢查上一個步驟中所建立的 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 網域 (涵蓋在上一節中) 時,上述命令才會生效。- 以下範例假設
在 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
項目必須是小寫,否則授權驗證可能會失敗。執行上述命令之後,您應該會有名為
mssql.keytab
的 Keytab 檔案。 將檔案複製到 SQL Server 機器的/var/opt/mssql/secrets
資料夾下。保護 Keytab 檔案。
有權存取此 Keytab 檔案的任何人都可以在網域上模擬 SQL Server,因此請務必限制檔案的存取權,只讓 mssql 帳戶具有讀取權限:
sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
必須使用 mssql-conf 工具來設定下列設定選項,以指定存取 Keytab 檔案時要使用的帳戶。
sudo mssql-conf set network.privilegedadaccount <username>
注意
只包含使用者名稱,而非 domainname\username 或 username@domain。 使用此使用者名稱時,SQL Server 會在內部連同此使用者名稱,視需要新增網域名稱。
使用下列步驟來設定 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 型登入
連線到 SQL Server 並建立新的 Active Directory 型登入:
CREATE LOGIN [CONTOSO\user] FROM WINDOWS;
確認登入現在已列在 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,如果您嘗試連線到 .
、localhost
、127.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 | 連接字串語法。 |
其他組態選項
如果您使用 PBIS、VAS 或 Centrify 等第三方公用程式將 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 清單。
首先,將 disablesssd
和 enablekdcfromkrb5conf
設定為 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 登入。 請改用全域安全性網域群組。
相關內容
- 加密 Linux 上的 SQL Server 的連線
- 了解 Linux 上的 SQL Server 和容器的 Active Directory 驗證
- 針對 Linux 上的 SQL Server 和容器的 Active Directory 驗證進行疑難排解
參與編輯 SQL 文件
您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。
如需詳細資訊,請參閱如何參與 SQL Server 文件