共用方式為


部署 Azure Arc 所啟用的 Active Directory 整合式 SQL 受控執行個體

在本文中,深入了解如何部署已啟用 Azure Arc 的 Azure SQL 受控執行個體搭配 Active Directory 驗證。

必要條件

開始部署 SQL 受控執行個體之前,請確定您具備下列必要條件:

連接器需求

客戶自控金鑰表 Active Directory 連接器和系統管理的金鑰表 Active Directory 連接器是具有不同需求和步驟的不同部署模式。 每個模式在部署期間都有特定需求。 選取您使用的連接器的索引標籤。

針對 Active Directory 客戶自控金鑰表部署,您必須提供:

  • 用於 SQL 的 Active Directory 使用者帳戶
  • 使用者帳戶下的服務主體名稱 (SPN)
  • SQL 主要端點的 DNS A (轉送) 記錄 (以及選用的次要端點)

準備開始部署

根據您的部署模式,完成下列步驟以準備部署 SQL 受控執行個體。

若要準備在客戶自控金鑰表模式中部署:

  1. 識別 SQL 端點的 DNS 名稱:為用戶端將從 Kubernetes 叢集外部連線的 SQL 端點選擇唯一的 DNS 名稱。

    • DNS 名稱應該位於 Active Directory 網域或其子系網域中。
    • 本文中的範例會使用 sqlmi-primary.contoso.local 作為主要 DNS 名稱和使用 sqlmi-secondary.contoso.local 作為次要 DNS 名稱。
  2. 識別 SQL 端點的連接埠號碼:為每個 SQL 端點輸入連接埠號碼。

    • 連接埠號碼必須位於 Kubernetes 叢集可接受的連接埠號碼範圍內。
    • 本文中的範例會使用 31433 作為主要連接埠號碼和使用 31434 作為次要連接埠號碼。
  3. 為受控執行個體建立 Active Directory 帳戶:選擇 Active Directory 帳戶的名稱來代表您的受控執行個體。

    • 名稱在 Active Directory 網域中必須是唯一的。
    • 本文中的範例會使用 sqlmi-account 作為 Active Directory 帳戶名稱。

    若要建立帳戶:

    1. 在網域控制站上,開啟 [Active Directory 使用者及電腦] 工具。 建立帳戶來代表受控執行個體。
    2. 輸入符合 Active Directory 網域密碼原則的帳戶密碼。 您將在後續小節的一些步驟中使用此密碼。
    3. 確保帳戶已啟用。 帳戶不需要任何特殊權限。
  4. 在 Active Directory DNS 伺服器中建立 SQL 端點的 DNS 記錄:在其中一部 Active Directory DNS 伺服器中,針對您在步驟 1 中選擇的 DNS 名稱建立 A 記錄 (正向查閱記錄)。

    • DNS 記錄應該指向 SQL 端點將接聽來自 Kubernetes 叢集外部連線的 IP 位址。
    • 您不需要建立與 A 記錄關聯的反向查閱指標 (PTR) 記錄。
  5. 建立 SPN:若要讓 SQL 能夠接受對 SQL 端點的 Active Directory 驗證,您必須於您在上一個步驟中建立的帳戶中註冊兩個 SPN。 必須為主要端點註冊兩個 SPN。 如果您想要對次要端點使用 Active Directory 驗證,也必須為次要端點註冊 SPN。

    若要建立和註冊 SPN:

    1. 使用下列格式來建立 SPN:

      MSSQLSvc/<DNS name>
      MSSQLSvc/<DNS name>:<port>
      
    2. 在其中一個網域控制站上,執行下列命令來註冊 SPN:

      setspn -S MSSQLSvc/<DNS name> <account>
      setspn -S MSSQLSvc/<DNS name>:<port> <account>
      

      例如,您的命令可能如下所示:

      setspn -S MSSQLSvc/sqlmi-primary.contoso.local sqlmi-account
      setspn -S MSSQLSvc/sqlmi-primary.contoso.local:31433 sqlmi-account
      
    3. 如果您想要在次要端點上使用 Active Directory 驗證,請執行相同的命令來為次要端點新增 SPN:

      setspn -S MSSQLSvc/<DNS name> <account>
      setspn -S MSSQLSvc/<DNS name>:<port> <account>
      

      例如,您的命令可能如下所示:

      setspn -S MSSQLSvc/sqlmi-secondary.contoso.local sqlmi-account
      setspn -S MSSQLSvc/sqlmi-secondary.contoso.local:31434 sqlmi-account
      
  6. 產生包含帳戶和 SPN 的項目的金鑰表檔案:若要讓 SQL 能夠向 Active Directory 驗證並接受來自 Active Directory 使用者的驗證,請使用 Kubernetes 祕密提供金鑰表檔案。

    • 金鑰表檔案包含針對受控執行個體和 SPN 產生的 Active Directory 帳戶的加密項目。

    • SQL Server 會使用此檔案作為對 Active Directory 的認證。

    • 您可以從多個工具中選擇,以產生金鑰表檔案:

      • adutil:適用於 Linux (請參閱 adutil 簡介)
      • ktutil:適用於 Linux
      • ktpass:適用於 Windows
      • 自訂指令碼

    若要特別針對受控執行個體產生金鑰表檔案:

    1. 使用下列其中一個自訂指令碼:

      指令碼會接受數個參數,並針對包含金鑰表的 Kubernetes 祕密產生金鑰表檔案和 YAML 規格檔案。

    2. 在您的指令碼中,將參數值取代為受控執行個體部署的值。

      針對輸入參數,請使用下列值:

      • --realm:大寫的 Active Directory 網域。 範例: CONTOSO.LOCAL
      • --account:註冊 SPN 所在的 Active Directory 帳戶。 範例: sqlmi-account
      • --port:主要 SQL 端點連接埠號碼。 範例: 31433
      • --dns-name:主要 SQL 端點的 DNS 名稱。
      • --keytab-file:金鑰表檔案的路徑。
      • --secret-name:要為其產生規格的金鑰表祕密的名稱。
      • --secret-namespace:包含金鑰表祕密的 Kubernetes 命名空間。
      • --secondary-port:次要 SQL 端點連接埠號碼 (選用)。 範例: 31434
      • --secondary-dns-name:次要 SQL 端點的 DNS 名稱 (選用)。

      為裝載金鑰表的 Kubernetes 祕密選擇名稱。 使用部署受控執行個體所在的命名空間。

    3. 執行下列命令來建立金鑰表:

      AD_PASSWORD=<password> ./create-sql-keytab.sh --realm <Active Directory domain in uppercase> --account <Active Directory account name> --port <endpoint port> --dns-name <endpoint DNS name> --keytab-file <keytab file name/path> --secret-name <keytab secret name> --secret-namespace <keytab secret namespace>
      

      例如,您的命令可能如下所示:

      AD_PASSWORD=<password> ./create-sql-keytab.sh --realm CONTOSO.LOCAL --account sqlmi-account --port 31433 --dns-name sqlmi.contoso.local --keytab-file sqlmi.keytab --secret-name sqlmi-keytab-secret --secret-namespace sqlmi-ns
      
    4. 執行下列命令來驗證金鑰表正確:

      klist -kte <keytab file>
      
  7. 部署金鑰表的 Kubernetes 祕密:使用您在上一個步驟中建立的 Kubernetes 祕密規格檔案來部署祕密。

    規格檔案看起來類似此範例:

    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: <secret name>
      namespace: <secret namespace>
    data:
      keytab: <keytab content in Base64>
    

    若要部署 Kubernetes 祕密,請執行此命令:

    kubectl apply -f <file>
    

    您的命令看起來可能會類似此範例:

    kubectl apply -f sqlmi-keytab-secret.yaml
    

設定 Active Directory 驗證的屬性

若要部署 Azure Arc 所啟用的 SQL 受控執行個體以便進行 Azure Arc Active Directory 驗證,請更新您的部署規格檔案,以參考要使用的 Active Directory 連接器執行個體。 參考 SQL 規格檔案中的 Active Directory 連接器會自動設定 SQL 進行 Active Directory 驗證。

若要在客戶自控金鑰表模式中支援 SQL 上的 Active Directory 驗證,請在部署規格檔案中設定下列屬性。 有些屬性是必要,有些則是選用。

必要

  • spec.security.activeDirectory.connector.name:要加入 Active Directory 驗證的既有 Active Directory 連接器自訂資源的名稱。 如果您輸入此屬性的值,則會實作 Active Directory 驗證。
  • spec.security.activeDirectory.accountName:受控執行個體的 Active Directory 帳戶名稱。
  • spec.security.activeDirectory.keytabSecret:為使用者裝載預先建立的金鑰表檔案的 Kubernetes 祕密名稱。 此祕密必須位於與受控執行個體相同的命名空間中。 只有在客戶自控金鑰表模式中的 Active Directory 部署才需要此參數。
  • spec.services.primary.dnsName:輸入主要 SQL 端點的 DNS 名稱。
  • spec.services.primary.port:輸入主要 SQL 端點的連接埠號碼。

選擇性

  • spec.security.activeDirectory.connector.namespace:要加入執行 Active Directory 驗證的既有 Active Directory 連接器的 Kubernetes 命名空間。 如果您未輸入值,則會使用 SQL 命名空間。
  • spec.services.readableSecondaries.dnsName:輸入次要 SQL 端點的 DNS 名稱。
  • spec.services.readableSecondaries.port:輸入次要 SQL 端點的連接埠號碼。

準備您的部署規格檔案

接下來,準備 YAML 規格檔案以部署 SQL 受控執行個體。 針對您使用的模式,在規格檔案中輸入您的部署值。

注意

在這兩個模式的規格檔案中,YAML 範例中的 admin-login-secret 值會提供基本驗證。 您可以使用參數值來登入受控執行個體,然後為 Active Directory 使用者和群組建立登入。 如需詳細資訊,請參閱連線至 Azure Arc 所啟用的 Active Directory 整合式 SQL 受控執行個體

下列範例顯示客戶自控金鑰表模式的規格檔案:

apiVersion: v1
data:
  password: <your Base64-encoded password>
  username: <your Base64-encoded username>
kind: Secret
metadata:
  name: admin-login-secret
type: Opaque
---
apiVersion: sql.arcdata.microsoft.com/v3
kind: SqlManagedInstance
metadata:
  name: <name>
  namespace: <namespace>
spec:
  backup:
    retentionPeriodInDays: 7
  dev: false
  tier: GeneralPurpose
  forceHA: "true"
  licenseType: LicenseIncluded
  replicas: 1
  security:
    adminLoginSecret: admin-login-secret
    activeDirectory:
      connector:
        name: <Active Directory connector name>
        namespace: <Active Directory connector namespace>
      accountName: <Active Directory account name>
      keytabSecret: <keytab secret name>
  services:
    primary:
      type: LoadBalancer
      dnsName: <primary endpoint DNS name>
      port: <primary endpoint port number>
    readableSecondaries:
      type: LoadBalancer
      dnsName: <secondary endpoint DNS name>
      port: <secondary endpoint port number>
  storage:
    data:
      volumes:
      - accessMode: ReadWriteOnce
        className: local-storage
        size: 5Gi
    logs:
      volumes:
      - accessMode: ReadWriteOnce
        className: local-storage
        size: 5Gi

部署受控執行個體

針對客戶自控金鑰表模式和系統管理的金鑰表模式,請使用備妥的規格 YAML 檔案來部署受控執行個體:

  1. 儲存檔案。 下一個步驟中的範例會使用 sqlmi.yaml 作為規格檔案名稱,但您可以選擇任何檔案名稱。

  2. 執行下列命令,以使用規格部署執行個體:

    kubectl apply -f <specification file name>
    

    例如,您的命令可能如下所示:

    kubectl apply -f sqlmi.yaml