教學課程:使用 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 時,能夠連接到正確的主機。

add host record

在本教學課程中,我們會在 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)

  1. 使用 kinit 命令取得或更新 Kerberos TGT (票證授權票證)。 您必須使用 kinit 命令的特殊權限帳戶,主機電腦應該已經是網域的一部分。 此帳戶必須具有連線至網域的權限,且必須在網域中建立帳戶和 SPN。

    在此範例指令碼中,已在網域控制站上建立名為 privilegeduser@CONTOSO.COM 的特殊權限使用者。

    kinit privilegeduser@CONTOSO.COM
    
  2. 使用 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
    
  3. 向先前建立的主體註冊 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 檔案

必要條件

  1. 請確定 /var/opt/mssql/mssql.conf 檔案是由 mssql 而非 root 所擁有。 如果不是這種情況,您必須使用 sudo 來執行 mssql-conf 命令。

  2. 在網域控制站上,在 network.privilegedadaccount 帳戶的 Active Directory 設定中 (在這些範例中為 sqluser@CONTOSO.COM),在 [帳戶選項] 區段的 [帳戶] 索引標籤下啟用下列選項:

    • 這個帳戶支援 Kerberos AES 128 位元加密
    • 這個帳戶支援 Kerberos AES 256 位元加密

建立 Keytab 檔案

建立使用者和 SPN 之後,您就可以使用下列步驟來建立 Keytab。

  1. 切換至 mssql 使用者:

    su mssql
    
  2. 使用 kinit 命令,以 Active Directory 使用者身分登入:

    kinit privilegeduser@CONTOSO.COM
    
  3. 建立 Keytab 檔案:

    /opt/mssql/bin/mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser
    

    系統會提示您重新啟動 SQL Server 服務,以採用新的 Active Directory 設定,您可以在下一節中執行此設定。

  4. 確認已使用正確的項目建立 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.kerberoskeytabfilenetwork.privilegedadaccount 值。 出現提示時,請輸入密碼。

    /opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    /opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser
    
  5. 驗證您的設定,以確保 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 檔案

  1. 建立 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-96aes128-cts-hmac-sha1-96。 不過,您應在生產環境中避免 arcfour-hmac,因為其具有弱式加密。

    如果您想要選擇加密類型而無需提示,可以在上述命令中,使用 -e 引數以指定您選擇的加密類型。 如需 adutil keytab 選項的詳細說明,請執行這個命令:

    adutil keytab createauto --help
    
  2. 在 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 ] 不會覆寫先前的檔案,只會附加至檔案 (如果檔案已經存在)。

  3. 請確定所建立的 keytab 是由 mssql 使用者所擁有,且只有 mssql 使用者具有該檔案的讀取/寫入存取權。 您可執行 chownchmod 命令,如下所示:

    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

若要使用 SSMSAzure Data Studio 進行連線,請使用 Windows 認證登入 SQL Server。

您也可以透過 sqlcmd 之類的工具來使用 Windows 驗證連線到 SQL Server。

sqlcmd -E -S 'sql1.contoso.com'