待用加密概念和設定指南

重要

Microsoft SQL Server 2019 巨量資料叢集附加元件將會淘汰。 SQL Server 2019 巨量資料叢集的支援將於 2025 年 2 月 28 日結束。 平台上將完全支援含軟體保證 SQL Server 2019 的所有現有使用者,而且軟體將會持續透過 SQL Server 累積更新來維護,直到該時間為止。 如需詳細資訊,請參閱公告部落格文章Microsoft SQL Server 平台上的巨量資料選項

從 Microsoft SQL Server 2019 CU8 巨量資料叢集開始,您可以使用待用加密功能,向儲存在平台中的所有資料提供應用程式層級加密。 此指南描述巨量資料叢集待用加密功能集的概念、架構和設定。

SQL Server 巨量資料叢集會將資料儲存在下列位置:

  • SQL Server 主要執行個體。
  • HDFS。 由存放集區和 Spark 使用。

有兩種方法可以透明的方式,加密 SQL Server 巨量資料叢集中的資料:

  • 磁碟區加密。 Kubernetes 平台支援此方法。 這是巨量資料叢集部署的最佳做法。 此文章未涵蓋磁碟區加密。 請參閱您的 Kubernetes 平台或設備文件,以了解如何為將用於 SQL Server 巨量資料叢集的磁碟區正確加密。
  • 應用程式層級加密。 此架構是指先由處理資料的應用程式加密資料,再將資料寫入到磁碟中。 如果將磁碟區公開,除非目的地系統也設定了相同的加密金鑰,否則攻擊者將無法在別處還原資料成品。

SQL Server 巨量資料叢集的待用加密功能集可支援 SQL Server 和 HDFS 元件應用程式層級加密的核心案例。

此功能可提供下列功能:

  • 系統管理的待用加密。 此功能可在 CU8+ 中使用。
  • 使用者管理的待用加密也稱為攜帶您自己的金鑰 (BYOK)。 服務管理的整合是在 SQL Server 2019 CU8 中推出的功能。 外部金鑰提供者整合是在 SQL Server 2019 CU11+ 中推出的功能。

如需詳細資訊,請參閱 SQL Server 巨量資料叢集中的金鑰版本

金鑰定義

  • SQL Server 巨量資料叢集金鑰管理服務 (KMS)

    控制器裝載的服務,負責管理 SQL Server 巨量資料叢集待用加密功能集的金鑰與憑證。 此服務支援下列功能︰

    • 安全地管理和儲存用於待用加密的金鑰和憑證。
    • Hadoop KMS 相容性。 KMS 可作為巨量資料叢集上 HDFS 元件的金鑰管理服務。
    • SQL Server 透明資料加密 (TDE) 憑證管理。
  • 系統管理的金鑰

    巨量資料叢集 KMS 服務可管理 SQL Server 和 HDFS 的所有金鑰和憑證

  • 使用者定義的金鑰

    使用者定義的金鑰是由巨量資料叢集 KMS 所管理,通常稱為攜帶您自己的金鑰。 SQL Server 巨量資料叢集支援 SQL Server 和 HDFS 元件上用於加密的金鑰自訂定義。 巨量資料叢集 KMS 可管理那些金鑰。

    警告

    SQL Server 主要執行個體會繼承 SQL Server TDE 功能。 但不支援手動將自訂金鑰從檔案載入 Pod、在 SQL Server 上註冊自訂金鑰,以及將自訂金鑰用於 TDE。 巨量資料叢集 KMS 不會管理那些金鑰。 這種情況可能會導致無法讀取資料庫。 為正確使用外部提供的金鑰,請使用此文章中所述的「外部提供者」功能。

  • 外部提供者

    加密作業委派支援與巨量資料叢集 KMS 相容的外部金鑰解決方案。 SQL Server 2019 CU11+ 支援此功能。 啟用此功能後,加密的根金鑰會裝載在巨量資料叢集控制器外部。

SQL Server 巨量資料叢集上的待用加密

巨量資料叢集 KMS 控制器服務支援系統管理的金鑰和外部提供者控制的金鑰,以便在 SQL Server 和 HDFS 上完成資料待用加密。

那些金鑰和憑證是受服務管理的。 此文章提供如何與服務互動的操作指引。

此功能集引進了巨量資料叢集 KMS 控制器服務,可為 SQL Server 和 HDFS 上的資料待用加密提供系統管理的金鑰與憑證。 那些金鑰和憑證是受服務管理的。 此文章提供如何與服務互動的操作指引。

  • SQL Server 執行個體使用已建立的透明資料加密 (TDE) 功能。
  • HDFS 使用每個 Pod 內的原生 Hadoop KMS,與控制器上的巨量資料叢集 KMS 互動。 此方法會啟用 HDFS 加密區域,以便在 HDFS 上提供安全的路徑。

SQL Server 執行個體

  • 系統產生的憑證會安裝在要搭配 TDE 命令使用的 SQL Server Pod 上。 系統管理憑證的命名標準是 TDECertificate + timestamp。 例如: TDECertificate2020_09_15_22_46_27
  • 系統不會自動加密主要執行個體巨量資料叢集佈建的資料庫和使用者資料庫。 資料庫管理員可使用已安裝的憑證來加密任何資料庫。
  • 系統會使用系統產生的憑證,自動加密計算集區和存放集區。
  • 雖然在技術上可使用 T-SQL EXECUTE AT 命令,但不建議這麼做,而且目前也不支援資料集區加密。 使用此技術來加密資料集區資料庫可能不會生效,而且加密可能不會在所需的狀態下進行。 此方法也會為後續版本建立不相容的升級路徑。
  • SQL Server 金鑰輪替是使用標準 T-SQL 系統管理命令來進行的。 如需詳細資訊,請參閱 SQL Server 巨量資料叢集透明待用資料加密 (TDE) 使用指南
  • 加密監視會透過現有適用於 TDE 的標準 SQL Server DMV 來進行。
  • 支援將已啟用 TDE 的資料庫備份並還原到叢集。
  • 支援高可用性。 如果將 SQL Server 主要執行個體上的資料庫加密,則資料庫的所有次要複本也會一併加密。

HDFS 加密區域

  • 需要 Active Directory 整合才能啟用 HDFS 的加密區域功能。
  • 系統產生的金鑰會在 Hadoop KMS 中佈建。 金鑰名稱為 securelakekey。 在 CU8 上,預設金鑰為 256 位元,而且我們支援 256 位元的 AES 加密。
  • 預設的加密區域將會使用上述系統產生的金鑰,在名為 /securelake 的路徑上佈建。
  • 使用者可以使用此指南中提供的特定指示來建立其他金鑰和加密區域。 使用者能夠在金鑰建立期間選擇 128、192 或 256 的金鑰大小。
  • HDFS 加密區域金鑰輪替是使用 azdata 進行的。 如需詳細資訊,請參閱 SQL Server 巨量資料叢集 HDFS 加密區域使用指南
  • 不支援在加密區域之上執行 HDFS 階層處理掛接。

待用加密管理

下列清單包含待用加密的管理功能:

  • SQL Server TDE 管理是使用標準 T-SQL 命令執行的。
  • HDFS 加密區域和 HDFS 金鑰管理是使用 azdata 命令執行的。
  • 下列系統管理功能則是使用操作筆記本執行的:
    • HDFS 金鑰備份和復原
    • HDFS 金鑰刪除

設定指南

在 CU8 後,於新部署 SQL Server 巨量資料叢集時預設會啟用並設定待用加密。 這表示:

  • 巨量資料叢集 KMS 元件將部署在控制器中,並產生一組預設的金鑰和憑證。
  • SQL Server 將會在開啟 TDE 的情況下進行部署,且憑證會由控制器安裝。
  • 適用於 HDFS 的 Hadoop KMS 將會設定為與巨量資料叢集 KMS 互動以進行加密作業。 HDFS 加密區域已設定完成並可供使用。

適用上一節所述的需求和預設行為。

如果執行新的 SQL Server 巨量資料叢集 CU8 部署,或直接升級至 CU9,則不需要其他任何步驟。

升級案例

在現有的叢集上,升級程序不會對尚未加密的使用者資料強制執行新的加密或重新加密。 此行為是設計所致,而且需要針對每個元件考慮下列問題:

  • SQL Server

    • SQL Server 主要執行個體。 升級程序不會影響任何主要執行個體資料庫和已安裝的 TDE 憑證。 建議您先備份資料庫和手動安裝的 TDE 憑證,再進行升級程序。 我們也建議您將那些成品儲存在巨量資料叢集之外。
    • 計算和存放集區。 那些資料庫由系統管理、會變動,而且會在升級叢集時重新建立並自動加密。
    • 資料集區。 升級不會影響資料集區的 SQL Server 執行個體部分的資料庫。
  • HDFS

    升級流程不會觸碰加密區域之外的 HDFS 檔案和資料夾。

從 CU8 或更舊版本升級至 CU9

不需要其他任何步驟。

從 CU6 或更舊版本升級至 CU8

警告

在升級至 SQL Server 巨量資料叢集 CU8 之前,請完整備份您的資料。

系統不會設定加密區域。 Hadoop KMS 元件不會設定為使用巨量資料叢集 KMS。 若要在升級後設定並啟用 HDFS 加密區域,請依照下一節中的指示進行。

升級至 CU8 後啟用 HDFS 加密區域

如果您將叢集升級至 CU8 (azdata upgrade),而且想要啟用 HDFS 加密區域,有兩個選項可供選擇:

  • 執行名為 SOP0128 - 啟用巨量資料叢集中的 HDFS 加密區域的 Azure Data Studio 操作筆記本來執行設定。
  • 執行指令碼,如下所示。

需求:

  • Active Directory 整合式叢集。
  • Azure Data CLI (azdata) 會以 AD 模式進行設定並登入叢集。

請依照下列程序,重新設定具有加密區域支援的叢集。

  1. 使用 azdata 執行升級之後,請儲存下列指令碼。

    指令碼執行需求:

    • 這兩個指令碼應該位於相同的目錄。
    • kubectl$HOME/.kube 資料夾中 Kubernetes 的 PATH 組態檔上。

    此指令碼應該命名為 run-key-provider-patch.sh

    #!/bin/bash
    
    if [[ -z "${BDC_DOMAIN}" ]]; then
      echo "BDC_DOMAIN environment variable with the domain name of the cluster is not defined."
      exit 1
    fi
    
    if [[ -z "${BDC_CLUSTER_NS}" ]]; then
      echo "BDC_CLUSTER_NS environment variable with the cluster namespace is not defined."
      exit 1
    fi
    
    kubectl get configmaps -n test
    
    diff <(kubectl get configmaps mssql-hadoop-storage-0-configmap -n $BDC_CLUSTER_NS -o json | ./updatekeyprovider.py) <(kubectl get configmaps mssql-hadoop-storage-0-configmap -n $BDC_CLUSTER_NS -o json | python -m json.tool)
    
    diff <(kubectl get configmaps mssql-hadoop-sparkhead-configmap -n $BDC_CLUSTER_NS -o json | ./updatekeyprovider.py) <(kubectl get configmaps mssql-hadoop-sparkhead-configmap -n $BDC_CLUSTER_NS -o json | python -m json.tool)
    
    # Replace the config maps.
    #
    kubectl replace -n $BDC_CLUSTER_NS -o json -f <(kubectl get configmaps mssql-hadoop-storage-0-configmap -n $BDC_CLUSTER_NS -o json | ./updatekeyprovider.py)
    
    kubectl replace -n $BDC_CLUSTER_NS -o json -f <(kubectl get configmaps mssql-hadoop-sparkhead-configmap -n $BDC_CLUSTER_NS -o json | ./updatekeyprovider.py)
    
    # Restart the pods which need to have the necessary changes with the core-site.xml
    kubectl delete pods -n $BDC_CLUSTER_NS nmnode-0-0
    kubectl delete pods -n $BDC_CLUSTER_NS storage-0-0
    kubectl delete pods -n $BDC_CLUSTER_NS storage-0-1
    
    # Wait for sometime for pods to restart
    #
    sleep 300
    
    # Check for the KMS process status.
    #
    kubectl exec -n $BDC_CLUSTER_NS -c hadoop nmnode-0-0 -- bash -c 'ps aux | grep kms'
    kubectl exec -n $BDC_CLUSTER_NS -c hadoop storage-0-0 -- bash -c 'ps aux | grep kms'
    kubectl exec -n $BDC_CLUSTER_NS -c hadoop storage-0-1 -- bash -c 'ps aux | grep kms'
    

    此指令碼應該命名為 updatekeyprovider.py

    #!/usr/bin/env python3
    
    import json
    import re
    import sys
    import xml.etree.ElementTree as ET
    import os
    
    class CommentedTreeBuilder(ET.TreeBuilder):
        def comment(self, data):
            self.start(ET.Comment, {})
            self.data(data)
            self.end(ET.Comment)
    
    domain_name = os.environ['BDC_DOMAIN']
    
    parser = ET.XMLParser(target=CommentedTreeBuilder())
    
    core_site = 'core-site.xml'
    j = json.load(sys.stdin)
    cs = j['data'][core_site]
    csxml = ET.fromstring(cs, parser=parser)
    props = [prop.find('value').text for prop in csxml.findall(
        "./property/name/..[name='hadoop.security.key.provider.path']")]
    
    kms_provider_path=''
    
    for x in range(5):
        if len(kms_provider_path) != 0:
            kms_provider_path = kms_provider_path + ';'
        kms_provider_path = kms_provider_path + 'nmnode-0-0.' + domain_name
    
    if len(props) == 0:
        prop = ET.SubElement(csxml, 'property')
        name = ET.SubElement(prop, 'name')
        name.text = 'hadoop.security.key.provider.path'
        value = ET.SubElement(prop, 'value')
        value.text = 'kms://https@' + kms_provider_path + ':9600/kms'
        cs = ET.tostring(csxml, encoding='utf-8').decode('utf-8')
    
    j['data'][core_site] = cs
    
    kms_site = 'kms-site.xml.tmpl'
    ks = j['data'][kms_site]
    
    kp_uri_regex = re.compile('(<name>hadoop.kms.key.provider.uri</name>\s*<value>\s*)(.*)(\s*</value>)', re.MULTILINE)
    
    def replace_uri(match_obj):
        key_provider_uri = 'bdc://https@hdfsvault-svc.' + domain_name
        if match_obj.group(2) == 'jceks://file@/var/run/secrets/keystores/kms/kms.jceks' or match_obj.group(2) == key_provider_uri:
            return match_obj.group(1) + key_provider_uri + match_obj.group(3)
        return match_obj.group(0)
    
    ks = kp_uri_regex.sub(replace_uri, ks)
    
    j['data'][kms_site] = ks
    print(json.dumps(j, indent=4, sort_keys=True))
    

    使用適當的參數,執行 run-key-provider-patch.sh

設定外部提供者

如前幾節所述,SQL Server 2019 CU8+ 巨量資料叢集部署預設會使用系統管理的金鑰啟用待用加密功能。 若要讓外部金鑰提供者保護 SQL Server 和 HDFS 加密的根金鑰,請參閱 SQL Server 巨量資料叢集中的外部金鑰提供者

下一步

若要深入了解如何在 SQL Server 巨量資料叢集上使用金鑰版本,請參閱 SQL Server 巨量資料叢集中的金鑰版本

若要深入了解如何有效使用待用加密 SQL Server 巨量資料叢集,請參閱下列文章:

若要深入了解 SQL Server 巨量資料叢集,請參閱下列概觀: