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

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

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

  • 安裝 adutil
  • 將 Linux 主機加入 AD 網域
  • 為 SQL Server 建立 AD 使用者,並使用 adutil 工具以設定 ServicePrincipalName (SPN)
  • 建立 SQL Server 服務金鑰表檔案
  • 建立 SQL Server 容器所要使用的 mssql.conf 和 krb5.conf 檔案
  • 掛接組態檔並部署 SQL Server 容器
  • 使用 Transact-SQL 建立以 AD 為基礎的 SQL Server 登入
  • 使用 AD 驗證連線到 SQL Server

Prerequisites

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

  • 網路中擁有 AD 網域控制站 (Windows)。
  • 在已加入網域的 Linux 主機電腦上安裝 adutil 工具。 如需詳細資訊,請遵循下方 的安裝 adutil 一節。

容器部署和準備

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

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

請確定 Active Directory 中新增了 Linux 主機 IP 位址的轉送主機 (A) 專案,對應至SQL Server容器的名稱。 在本教學課程中,myubuntu 主機電腦的 IP 位址是 10.0.0.10,而我的 SQL Server 容器名稱則是 sql1。 我們會在 Active Directory 中新增轉送主機項目,如下所示。 專案可確保當使用者連線到 sql1.contoso.com 時,它會到達正確的主機。

新增主機記錄

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

注意

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

安裝 adutil

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

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

如果您不想讓 Linux 上的 SQL Server 容器主機成為網域的一部分,而且尚未遵循將機器加入網域的步驟,請在已屬於 AD 網域的另一個 Linux 電腦上,遵循下列步驟:

  1. 為 SQL Server 建立 AD 使用者,並使用 adutil 工具以設定 SPN。

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

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

為 SQL Server 建立 AD 使用者,並使用 adutil 工具以設定 ServicePrincipalName

若要在 Linux 的 SQL Server 容器上啟用 AD 驗證,您必須在屬於 AD 網域的 Linux 機器上執行以下所述的步驟 1-3。

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

    在此範例腳本中,已在網域控制站上建立名為 privilegeduser@CONTOSO.COM 的特殊許可權使用者。

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

    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 連線才會正常運作。

建立 SQL Server 服務 keytab 檔案

建立金鑰表檔案,在該檔案中,先前所建立的 4 個 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:這是稍早所建立具特殊權限 AD 使用者帳戶的密碼。
  • -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:要新增至金鑰表的主體。

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

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

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

注意

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

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

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

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    

    注意

    • privilegedadaccount:要用於 AD 驗證的特殊權限 AD 使用者。
    • 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 容器,並掛接先前建立的正確 AD 組態檔,如下所示:

重要

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 上,所以必須將相同順序的 AD 詳細資料附加至 docker run 命令。 在我們的範例中,網域控制站 adVM 位於網域 contoso.com 中,IP 位址是 10.0.0.4。 網域控制站會執行 DNS 和 KDC。

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

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

create login [contoso\amvin] From Windows
SELECT name FROM sys.server_principals;

使用 AD 驗證連線到 SQL Server

若要使用SSMSADS進行連線,請使用SQL Server名稱和埠號碼 (名稱來登入SQL Server,可能是容器名稱或主機名稱) 。 在我們的範例中,伺服器名稱會是 sql1.contoso.com, 5433

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

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

資源

下一步