教學課程:使用 adutil 為 Linux 上的 SQL Server 設定 Active Directory 驗證
適用於:SQL Server - Linux
本教學課程說明如何使用 adutil 為 Linux 上的 SQL Server 設定 Windows Active Directory 驗證。 如需另一種使用 ktpass 設定 Active Directory 驗證的方法,請參閱教學課程:在 Linux 上的 SQL Server 使用 Active Directory 驗證。
本教學課程包含下列工作:
- 安裝 adutil
- 將 Linux 電腦加入 Active Directory 網域
- 建立 SQL Server 的 Active Directory 使用者,並使用 adutil 設定服務主體名稱 (SPN)
- 建立 SQL Server 服務 Keytab (金鑰表) 檔案
- 將 SQL Server 設定為使用 keytab 檔案
- 使用 Transact-SQL 建立以 Active Directory 為基礎的 SQL Server 登入
- 使用 Active Directory 驗證連線至 SQL Server
必要條件
在設定 Active Directory 驗證之前,您必須:
- 在您網路中執行 Active Directory Domain Services 的 Windows 網域控制站。
- 安裝在已加入網域主機電腦上的 adutil 工具。
準備網域機器
請確定已在 Linux 主機 IP 位址的 Active Directory 中,新增轉送主機 (A) 項目。 在本教學課程中,sql1
主機機器的 IP 位址為 10.0.0.10
。 在下列範例中,我們會在 Active Directory 中新增轉送主機項目。 此項目可確保當使用者連線至 sql1.contoso.com
時,能夠連接到正確的主機。
在本教學課程中,我們會在 Azure 中使用具有三部虛擬機器 (VM) 的環境。 一部 VM 是名為 adVM.contoso.com
的 Windows Server 電腦,以網域名稱為 contoso.com
的網域控制站 (DC) 執行。 第二部 VM 是執行 Windows 10 且名為 winbox
的用戶端電腦,其中已安裝 SQL Server Management Studio (SSMS)。 第三部機器是名為 sql1
的 Ubuntu 18.04 LTS 機器,其裝載了 SQL Server。
將 Linux 主機電腦加入 Active Directory 網域
如需將 sql1
加入 Active Directory 網域,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域。
安裝 adutil
若要安裝 adutil,請遵循您在上一個步驟中新增至網域的主機電腦上 adutil - Active Directory 公用程式簡介一文中所說明的步驟。
使用 adutil 建立 SQL Server 的 Active Directory 使用者,並設定服務主體名稱 (SPN)
使用
kinit
命令取得或更新 Kerberos TGT (票證授權票證)。 您必須使用kinit
命令的特殊權限帳戶,主機電腦應該已經是網域的一部分。 此帳戶必須具有連線至網域的權限,且必須在網域中建立帳戶和 SPN。在此範例指令碼中,已在網域控制站上建立名為
privilegeduser@CONTOSO.COM
的特殊權限使用者。kinit privilegeduser@CONTOSO.COM
使用 adutil,透過 SQL Server 建立將作為具特殊權限 Active Directory 帳戶的新使用者。
您可以使用三種不同的方式來指定密碼。 如果您使用這些方法中的多個方法,則會依下列順序優先:
- 使用密碼旗標:
--password <password>
- 在環境變數中:
ADUTIL_ACCOUNT_PWD
- 命令列提示字元中的互動式輸入
環境變數或互動式輸入方法較密碼旗標更為安全。
adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
您可以使用如上所示的辨別名稱 (
--distname
) 來指定帳戶的名稱,或是使用組織單位 (OU) 名稱。 若同時指定這兩種名稱,則 OU 名稱 (--ou
) 會優先於辨別名稱。 您可以執行下列命令以取得更多詳細資料:adutil user create --help
- 使用密碼旗標:
向先前建立的主體註冊 SPN。 您必須使用電腦的完整網域名稱 (FQDN)。 在本教學課程中,我們會使用 SQL Server 的預設連接埠 1433, 但連接埠號碼可能有所不同。
adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 1433
- 只要
kinit
帳戶有足夠的權限,addauto
就會自動建立 SPN。 -n
:要指派 SPN 帳戶的名稱。-s
:要用來產生 SPN 的服務名稱。 因為這是 SQL Server 服務相關案例,所以服務名稱為MSSQLSvc
。-H
:要用來產生 SPN 的主機名稱。 如果未指定,則會使用本機主機的 FQDN。 在本案例中,主機名稱為sql1
,FQDN 為sql1.contoso.com
。-p
:要用來產生 SPN 的連接埠。 如果未指定,則會在不使用連接埠的情況下產生 SPN。 只有當 SQL Server 接聽預設連接埠 1433 時,本案例中的 SQL 連線才會正常運作。
- 只要
使用 mssql-conf 來建立 SQL Server 服務 Keytab 檔案
您可以安裝 adutil,並將其與 mssql-conf 整合,以直接使用 mssql-conf 建立及設定金鑰表。 這是建立 SQL Server 服務 Keytab 檔案的慣用方法。 否則,您可以手動建立 SQL Server 服務 Keytab 檔案。
必要條件
請確定
/var/opt/mssql/mssql.conf
檔案是由mssql
而非root
所擁有。 如果不是這種情況,您必須使用sudo
來執行 mssql-conf 命令。在網域控制站上,在
network.privilegedadaccount
帳戶的 Active Directory 設定中 (在這些範例中為sqluser@CONTOSO.COM
),在 [帳戶選項] 區段的 [帳戶] 索引標籤下啟用下列選項:- 這個帳戶支援 Kerberos AES 128 位元加密
- 這個帳戶支援 Kerberos AES 256 位元加密
建立 Keytab 檔案
建立使用者和 SPN 之後,您就可以使用下列步驟來建立 Keytab。
切換至
mssql
使用者:su mssql
使用
kinit
命令,以 Active Directory 使用者身分登入:kinit privilegeduser@CONTOSO.COM
建立 Keytab 檔案:
/opt/mssql/bin/mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser
系統會提示您重新啟動 SQL Server 服務,以採用新的 Active Directory 設定,您可以在下一節中執行此設定。
確認已使用正確的項目建立 keytab:
klist -kte /var/opt/mssql/secrets/mssql.keytab
您應該會看到如以下範例所示的輸出:
keytab name: FILE:/var/opt/mssql/secrets/mssql.keytab KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 4 12/30/2021 14:02:08 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96) 4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96) 4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96) 4 12/30/2021 14:02:08 MSSQLSvc/sql1:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96) 4 12/30/2021 14:02:08 MSSQLSvc/sql1@CONTOSO.COM (aes256-cts-hmac-sha1-96)
如果
/var/opt/mssql/mssql.conf
檔案不是由mssql
所擁有,您必須設定 mssql-conf,以根據先前的步驟設定 network.kerberoskeytabfile 和 network.privilegedadaccount 值。 出現提示時,請輸入密碼。/opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab /opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser
驗證您的設定,以確保 Active Directory 驗證可順利運作而不會發生任何問題。
/opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
您應該會看到類似下列範例的結果:
Detected Configuration: Default Realm: CONTOSO.COM Keytab: /var/opt/mssql/secrets/mssql.keytab Reverse DNS Result: sql1.contoso.com SQL Server Port: 1433 Detected SPNs (SPN, KVNO): (MSSQLSvc/sql1.CONTOSO.COM:1433, 4) (MSSQLSvc/sql1.CONTOSO.COM, 4) (MSSQLSvc/sql1:1433, 4) (MSSQLSvc/sql1, 4) Privileged Account (Name, KVNO): (sqluser, 4)
手動建立 SQL Server 服務 Keytab 檔案
如果您已安裝 adutil,並將其與 mssql-conf 整合,您可以直接跳至使用 mssql-conf 來建立 SQL Server 服務 Keytab 檔案。
建立 Keytab 檔案,在該檔案中,先前所建立的四個 SPN 皆各有一個項目,而使用者也擁有一個項目。
adutil keytab createauto -k /var/opt/mssql/secrets/mssql.keytab -p 1433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
可能的命令列選項如下:
-k
:建立mssql.keytab
檔案的路徑。 在上述範例中,目錄/var/opt/mssql/secrets/
應該已存在於主機上。-p
:要用來產生 SPN 的連接埠。 如果未指定,則會在不使用連接埠的情況下產生 SPN。-H
:要用來產生 SPN 的主機名稱。 如果未指定,則會使用本機主機的 FQDN。 在本案例中,主機名稱為sql1
,FQDN 為sql1.contoso.com
。-s
:要用來產生 SPN 的服務名稱。 在此範例中,SQL Server 服務名稱為MSSQLSvc
。--password
:稍早所建立具特殊權限 Active Directory 使用者帳戶的密碼。-e
或--enctype
:keytab 項目的加密類型。 使用以逗號分隔的值清單。 如果未指定,則會顯示互動式提示。
只要您的主機和網域支援加密類型,您就可以選擇多個加密類型。 在此範例中,您可以選擇
aes256-cts-hmac-sha1-96
和aes128-cts-hmac-sha1-96
。 不過,您應在生產環境中避免arcfour-hmac
,因為其具有弱式加密。如果您想要選擇加密類型而無需提示,可以在之前的命令中,使用
-e
引數以指定您選擇的加密類型。 如需adutil keytab
選項的詳細說明,請執行這個命令:adutil keytab createauto --help
在 keytab 中為主體名稱與密碼新增項目,以供 SQL Server 用來連線到 Active Directory:
adutil keytab create -k /var/opt/mssql/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
-k
:要建立mssql.keytab
檔案的路徑。-p
:要新增至 keytab 的主體。
adutil keytab [ create | autocreate ]
不會覆寫先前的檔案,只會附加至檔案 (如果檔案已經存在)。請確定所建立的 keytab 是由
mssql
使用者所擁有,且只有mssql
使用者具有該檔案的讀取/寫入存取權。 您可執行chown
和chmod
命令,如下所示:chown mssql /var/opt/mssql/secrets/mssql.keytab chmod 440 /var/opt/mssql/secrets/mssql.keytab
將 SQL Server 設定為使用 keytab
執行以下命令,將 SQL Server 設定為使用在上一個步驟中建立的 keytab,並將具特殊權限的 Active Directory 帳戶設為先前建立的使用者。 在範例中,使用者名稱為 sqluser
。
/opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
/opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser
重新啟動 SQL Server
執行以下命令,以重新啟動 SQL Server 服務:
sudo systemctl restart mssql-server
在 Transact-SQL 中建立以 Active Directory 為基礎的 SQL Server 登入
連線到 SQL Server 並執行下列命令來建立登入,確認登入已存在。
CREATE LOGIN [contoso\privilegeduser] FROM WINDOWS;
SELECT name FROM sys.server_principals;
使用 Active Directory 驗證連線至 SQL Server
若要使用 SSMS 或 Azure Data Studio 進行連線,請使用 Windows 認證登入 SQL Server。
您也可以透過 sqlcmd 之類的工具來使用 Windows 驗證連線到 SQL Server。
sqlcmd -E -S 'sql1.contoso.com'