教學課程:為 Linux 上的 SQL Server 容器設定 Active Directory 驗證

適用於:SQL Server - Linux

本教學課程說明如何設定 Linux 上的 SQL Server 容器,以支援 Active Directory 驗證 (也稱為整合式驗證)。 如需概觀,請參閱適用於 Linux 上 SQL Server 的 Active Directory 驗證

注意

如需網路設定的目前指引,請參閱作業系統 (OS) 的文件。

本教學課程包含下列工作:

  • 安裝 adutil
  • 將 Linux 主機加入 Active Directory 網域
  • 建立 SQL Server 的 Active Directory 使用者,並使用 adutil 工具設定服務主體名稱 (SPN)
  • 建立 SQL Server 服務 keytab 檔案
  • 建立 SQL Server 容器所要使用的 mssql.confkrb5.conf
  • 掛接組態檔並部署 SQL Server 容器
  • 使用 Transact-SQL 建立以 Active Directory 為基礎的 SQL Server 登入
  • 使用 Active Directory 驗證連線至 SQL Server

必要條件

設定 Active Directory 驗證之前,您必須具備下列條件:

  • 在您的網路中擁有 Active Directory 網域控制站 (Windows)。
  • 在已加入網域的 Linux 主機電腦上安裝 adutil。 如需詳細資料,請遵循安裝 adutil 一節。

容器部署和準備

若要設定容器,您必須事先知道主機上的容器將要使用的連接埠。 預設連接埠 1433 可能會以不同的方式對應到您的容器主機。 在本教學課程中,主機上的連接埠 5433 將會對應到容器的連接埠 1433。 如需詳細資訊,請參閱快速入門:使用 Docker 執行 SQL Server Linux 容器映像快速入門。

當您註冊服務主體名稱 (SPN) 時,您可以使用電腦的主機名或容器的名稱。 不過,您應該根據您想要在外部連線到容器時看到的內容來進行設定。

請確定已在 Active Directory 中針對 Linux 主機 IP 位址新增轉送主機 (A) 項目,且對應至 SQL Server 容器的名稱。 在本教學課程中,sql1 主機電腦的 IP 位址是 10.0.0.10,而我的 SQL Server 容器名稱則是 sql1。 在 Active Directory 中新增轉送主機項目,如螢幕擷取畫面所示。 此項目可確保當使用者連線至 sql1.contoso.com 時,能夠連接到正確的主機。

Screenshot of adding a host record.

在本教學課程中,我們會在 Azure 中使用具有三部虛擬機器 (VM) 的環境。 其中一部 VM 作為 Windows 網域控制站 (DC),其網域名稱為 contoso.com。 此網域控制站的名稱為 adVM.contoso.com。 第二部機器是名為 winbox 的 Windows 機器,執行 Windows 10 Desktop,其作為用戶端機上盒,並已安裝 SQL Server Management Studio (SSMS)。 第三部機器是名為 sql1 的 Ubuntu 18.04 LTS 機器,其裝載了 SQL Server 容器。 所有機器都已加入 contoso.com 網域。 如需詳細資訊,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域

注意

如您在本文稍後所見,將主機容器機器加入網域並非必要。

安裝 adutil

若要安裝 adutil,請在已加入網域的主機電腦上遵循 adutil 簡介 - Active Directory 公用程式中所述的步驟。

建立 Active Directory 使用者、SPN 與 SQL Server 服務金鑰表

如果您不想讓容器主機成為網域的一部分,且尚未遵循將機器加入網域的步驟,請在已屬於 Active Directory 網域的另一部 Linux 機器上,遵循以下步驟:

  1. 使用 adutil 為 SQL Server 建立 Active Directory 使用者並設定 SPN。

  2. 建立並設定 SQL Server 服務金鑰表檔案。

將建立的 mssql.keytab 檔案複製到將執行 SQL Server 容器的主機電腦,並將容器設定為使用複製的 mssql.keytab。 您還可以將執行 SQL Server 容器的 Linux 主機加入 Active Directory 網域,並在同一部機器上遵循下列步驟。

建立 SQL Server 的 Active Directory 使用者,並使用 adutil 設定服務主體名稱

若要在 Linux 的 SQL Server 容器上啟用 Active Directory 驗證,您必須在屬於 Active Directory 網域的 Linux 機器上執行以下步驟。

  1. 使用 kinit 命令取得或更新 Kerberos TGT (票證授權票證)。 針對 kinit 命令使用具特殊權限的帳戶。 此帳戶必須具有連線到網域的權限,且必須能夠在網域中建立帳戶和 SPN。

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

    kinit privilegeduser@CONTOSO.COM
    
  2. 使用 adutil,透過 SQL Server 建立將作為具特殊權限 Active Directory 帳戶的新使用者。

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

    您可使用下列三種方式中的任意一種來指定密碼:

    • 密碼旗標:--password <password>
    • 環境變數 - ADUTIL_ACCOUNT_PWD
    • 互動式輸入

    密碼輸入方法的優先順序會遵循上方所列選項順序。 建議使用環境變數或互動式輸入來提供密碼,因為這兩者相較於密碼旗標要更為安全。

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

    adutil user create --help
    
  3. 向上方建立的使用者註冊 SPN。 您可以視需要使用主機名稱 (而不是容器名稱),這取決於您希望連線在外部的顯示方式。 在本教學課程中,會使用連接埠 5433,而不是 1433。 這是容器的連接埠對應。 但您的連接埠號碼可能有所不同。

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto 會自動建立 SPN,但前提是 kinit 帳戶有足夠的權限。
    • -n:要指派給 SPN 的帳戶名稱。
    • -s:要用於產生 SPN 的服務名稱。 因為此為 SQL Server 服務相關案例,所以服務名稱為 MSSQLSvc。
    • -H:要用於產生 SPN 的主機名稱。 如果未指定,則會使用本機主機的 FQDN。 請一併提供容器名稱的 FQDN。 在本案例中,主機名稱為 sql1,FQDN 為 sql1.contoso.com
    • -p:要用於產生 SPN 的連接埠。 如果未指定,則會在不使用連接埠的情況下產生 SPN。 只有當 SQL Server 接聽預設連接埠 1433 時,本案例中的連線才會正常運作。

建立 SQL Server 服務金鑰表檔案

建立 Keytab 檔案,在該檔案中,先前所建立的四個 SPN 皆各有一個項目,而使用者也擁有一個項目。 金鑰表檔案將會掛接至容器,因此可以在主機的任何位置上建立該檔案。 您可以安全地變更此路徑,只要在使用 docker/podman 部署容器時,產生的金鑰表正確地掛接即可。

若要為所有 SPN 建立金鑰表,我們可以使用 createauto 選項:

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k:欲建立 mssql.keytab 檔案的路徑。 在上述範例中,目錄 /container/sql1/secrets 應該已存在於主機上。
  • -p:要用來產生 SPN 的連接埠。 如果未指定,則會在不使用連接埠的情況下產生 SPN。
  • -H:要用來產生 SPN 的主機名稱。 如果未指定,則會使用本機主機的 FQDN。 請一併提供容器名稱的 FQDN。 在本案例中,主機名稱為 sql1,FQDN 為 sql1.contoso.com
  • -s:要用於產生 SPN 的服務名稱。 因為此為 SQL Server 服務相關案例,所以服務名稱為 MSSQLSvc。
  • --password:這是稍早所建立具特殊權限 Active Directory 使用者帳戶的密碼。
  • -e--enctype:keytab 項目的加密類型。 使用以逗號分隔的值清單。 如果未指定,則會顯示互動式提示。

當提供加密類型的選項時,即可選擇一個以上的加密類型。 在此範例中,我們會選擇 aes256-cts-hmac-sha1-96arcfour-hmac。 請確定選擇主機與網域支援的加密類型。

如果您想要以非互動方式選擇加密類型,可以在上述命令中,使用 -e 引數以指定您選擇的加密類型。 如需 adutil 命令的其他說明,請執行以下命令。

adutil keytab createauto --help

警告

arcfour-hmac 是弱式加密,此加密類型不建議在實際執行環境中使用。

若要為使用者建立金鑰表,命令為:

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k:欲建立 mssql.keytab 檔案的路徑。 在上述範例中,目錄 /container/sql1/secrets 應該已存在於主機上。
  • -p:要新增至 keytab 的主體。

adutil 金鑰表建立/自動建立不會覆寫先前的檔案;其附加至檔案 (如果檔案已經存在)。

請確定在部署容器時,所建立的金鑰表具有正確的權限集。

chmod 440 /container/sql1/secrets/mssql.keytab

此時,您可以將 mssql.keytab 從目前的 Linux 主機複製到您要部署 SQL Server 容器的 Linux 主機,並在將執行 SQL Server 容器的 Linux 主機上遵循其餘步驟。 如果上述步驟是在將部署 SQL Server 容器的相同 Linux 主機上執行,則請在相同的主機上,同時遵循後續步驟。

建立 SQL Server 容器所要使用的組態檔

  1. 建立具有 Active Directory 設定的 mssql.conf 檔案。 這個檔案可以在主機上的任何位置建立,而且必須在 docker run 命令期間正確地掛接。 在此範例中,我們將這個 mssql.conf 檔案放在容器目錄 /container/sql1 下。 mssql.conf 的內容如下所示:

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount:用於 Active Directory 驗證的具特殊權限 Active Directory 使用者。
    • kerberoskeytabfile:容器中 mssql.keytab 檔案所在的路徑。
  2. 建立 krb5.conf 檔案,例如下列範例。 這些檔案的大小寫很重要。

    [libdefaults]
    default_realm = CONTOSO.COM
    
    [realms]
    CONTOSO.COM = {
        kdc = adVM.contoso.com
        admin_server = adVM.contoso.com
        default_domain = CONTOSO.COM
    }
    
    [domain_realm]
    .contoso.com = CONTOSO.COM
    contoso.com = CONTOSO.COM
    
  3. 將所有檔案 mssql.confkrb5.confmssql.keytab 複製到掛接目標 SQL Server 容器的位置。 在此範例中,這些檔案會放置在主機的下列位置:將 mssql.confkrb5.conf 放置在 /container/sql1/。 將 mssql.keytab 放置在位置 /container/sql1/secrets/

  4. 請確定執行 docker/podman 命令的使用者對這些資料夾擁有足夠權限。 當容器啟動時,使用者需要存取所建立的資料夾路徑。 在此範例中,我們為資料夾路徑指定了以下權限:

    sudo chmod 755 /container/sql1/
    

掛接設定檔並部署 SQL Server 容器

執行您的 SQL Server 容器,並掛接先前建立的正確 Active Directory 組態檔:

重要

SA_PASSWORD 環境變數已被取代。 請改用 MSSQL_SA_PASSWORD

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

注意

在 SELinux 啟用主機之類的 LSM (Linux 安全性模組) 上執行容器時,您必須使用 Z 選項以掛接磁碟區,這會指示 Docker 以私人未共用標籤標示內容。 如需詳細資訊,請參閱 configure the SE Linux label (設定 SE Linux 標籤)。

我們的範例會包含下列命令:

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
  • mssql.confkrb5.conf 檔案位於主機檔案路徑 /container/sql1 中。
  • 建立的 mssql.keytab 則位於主機檔案路徑 /container/sql1/secrets
  • 因為我們的主機電腦是在 Azure 上,所以必須將 Active Directory 詳細資料以相同順序附加至 docker run 命令。 在我們的範例中,網域控制站 adVM 位於網域 contoso.com 中,IP 位址是 10.0.0.4。 網域控制站會執行 DNS 和 KDC。

使用 Transact-SQL 建立以 Active Directory 為基礎的 SQL Server 登入

連線至 SQL Server 容器。 使用下列命令,建立登入並確認其存在。 您可以從執行 SSMS、Azure Data Studio 或任何其他命令列介面 (CLI) 工具的用戶端機器 (Windows 或 Linux) 執行此命令。

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

使用 Active Directory 驗證連線至 SQL Server

若要使用 SQL Server Management Studio (SSMS) 或 Azure Data Studio 進行連線,請使用 SQL Server 名稱和連接埠號碼 (名稱可以是容器名稱或主機名稱) 以 Windows 認證登入 SQL Server。 在我們的範例中,伺服器名稱會是 sql1.contoso.com,5433

您也可以使用 sqlcmd 之類的工具,連線到容器中的 SQL Server。

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

資源