미사용 데이터 암호화 개념 및 구성 가이드

Important

Microsoft SQL Server 2019 빅 데이터 클러스터 추가 기능이 사용 중지됩니다. SQL Server 2019 빅 데이터 클러스터에 대한 지원은 2025년 2월 28일에 종료됩니다. Software Assurance를 사용하는 SQL Server 2019의 모든 기존 사용자는 플랫폼에서 완전히 지원되며, 소프트웨어는 지원 종료 시점까지 SQL Server 누적 업데이트를 통해 계속 유지 관리됩니다. 자세한 내용은 공지 블로그 게시물Microsoft SQL Server 플랫폼의 빅 데이터 옵션을 참조하세요.

Microsoft SQL Server 2019 CU8 빅 데이터 클러스터부터 미사용 데이터 암호화 기능을 사용하여 플랫폼에 저장된 모든 데이터에 대한 애플리케이션 수준 암호화를 제공할 수 있습니다. 이 가이드에서는 빅 데이터 클러스터의 미사용 데이터 암호화 기능 세트에 대한 개념, 아키텍처, 구성을 설명합니다.

SQL Server 빅 데이터 클러스터는 다음 위치에 데이터를 저장합니다.

  • SQL Server 마스터 인스턴스.
  • HDFS. 스토리지 풀 및 Spark에서 사용됩니다.

SQL Server 빅 데이터 클러스터에서 데이터를 투명하게 암호화하는 두 가지 방법이 있습니다.

  • 볼륨 암호화 Kubernetes 플랫폼은 이 접근 방식을 지원합니다. 빅 데이터 클러스터 배포에 대한 모범 사례입니다. 이 문서에서는 볼륨 암호화를 다루지 않습니다. SQL Server 빅 데이터 클러스터에 사용할 볼륨을 적절히 암호화하는 방법은 Kubernetes 플랫폼 또는 어플라이언스 설명서를 참조하세요.
  • 애플리케이션 수준 암호화. 이 아키텍처는 디스크에 데이터를 쓰기 전에 애플리케이션이 처리하는 데이터 암호화를 나타냅니다. 볼륨이 노출되는 경우 대상 시스템도 동일한 암호화 키로 구성되지 않은 한 공격자는 다른 곳에서 데이터 아티팩트를 복원할 수 없습니다.

SQL Server 빅 데이터 클러스터의 미사용 데이터 암호화 기능 세트는 SQL Server 및 HDFS 구성 요소에 대한 애플리케이션 수준 암호화의 핵심 시나리오를 지원합니다.

이 기능은 다음과 같은 기능을 제공합니다.

  • 미사용 시스템 관리형 암호화. 이 기능은 CU8 이상에서 사용할 수 있습니다.
  • 미사용 데이터 사용자 관리형 암호화는 BYOK(Bring Your Own Key)라고도 합니다. 서비스 관리형 통합은 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에 대한 모든 키 및 인증서를 관리합니다.

  • 사용자 정의 키

    일반적으로 Bring Your Own Key라고 하는 빅 데이터 클러스터 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 암호화 영역

  • HDFS에 암호화 영역 기능을 사용하도록 설정하려면 Active Directory 통합이 필요합니다.
  • 시스템 생성 키는 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 명령을 사용하여 수행됩니다.
  • 운영 Notebook을 사용하여 수행되는 관리 기능은 다음과 같습니다.
    • HDFS 키 백업 및 복구
    • HDFS 키 삭제

구성 가이드

SQL Server 빅 데이터 클러스터를 새로 배포하는 동안 CU8 이상에서는 미사용 데이터 암호화가 기본적으로 사용하도록 설정되고 구성됩니다. 이는 다음을 의미합니다.

  • 빅 데이터 클러스터 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 운영 Notebook을 실행합니다.
  • 아래에 설명된 대로 스크립트를 실행합니다.

요구 사항:

  • Active Directory 통합 클러스터.
  • AD 모드의 클러스터에 구성되고 로그인된 Azure Data CLI(azdata)입니다.

이 절차에 따라 암호화 영역을 지원하도록 클러스터를 다시 구성합니다.

  1. azdata로 업그레이드를 수행한 후 다음 스크립트를 저장합니다.

    스크립트 실행 요구 사항:

    • 두 스크립트는 동일한 디렉터리에 있어야 합니다.
    • $HOME/.kube 폴더에 있는 Kubernetes용 PATH 구성 파일의 kubectl.

    이 스크립트의 이름은 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 빅 데이터 클러스터 대한 자세한 내용은 다음 개요를 참조하세요.