分享方式:


教學課程:使用 adutil 為 Linux 上的 SQL Server 設定 Active Directory 驗證

適用於:Linux 上的 SQL Server

本教學課程說明如何使用 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) 是一台名為 adVM.contoso.com 的 Windows Server 電腦,運行為網域控制器(DC),其網域名稱為 contoso.com。 第二部 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 '<password>'
    

    您可以使用如上所示的辨別名稱 (--distname) 來指定帳戶的名稱,或是使用組織單位 (OU) 名稱。 若同時指定這兩種名稱,則 OU 名稱 (--ou) 會優先於辨別名稱。 您可以執行下列命令以取得更多詳細資料:

    adutil user create --help
    

    警告

    您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

  3. 向先前建立的主體註冊 SPN。 您必須使用電腦的完整網域名稱 (FQDN)。 在本教學課程中,我們會使用 SQL Server 的預設連接埠 1433, 但連接埠號碼可能有所不同。

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 1433
    
    • 只要 addauto 帳戶有足夠的權限,kinit 就會自動建立 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. 請確定 mssql 使用者擁有檔案 /var/opt/mssql/mssql.conf ,而不是 root。 否則,您必須使用 執行 sudo 命令。

  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 '<password>' -s MSSQLSvc
    

    警告

    您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

    可能的命令列選項如下:

    • -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 '<password>'
    

    警告

    您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

    • -k:要建立 mssql.keytab 檔案的路徑。
    • -p:要新增至 keytab 的主體。

    adutil keytab [ create | autocreate ] 不會覆寫先前的檔案,只會附加至檔案 (如果檔案已經存在)。

  3. 請確定 mssql 用戶擁有已建立的keytab,且只有 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

用你的 Windows 憑證透過 SQL Server 管理工作室(SSMS)連接到 SQL Server 實例。

您也可以使用 sqlcmd 公用程式 之類的工具,使用 Windows 驗證連線到 SQL Server 實例。

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