0 / 0
영어 버전 문서로 돌아가기

Parquet 모듈형 암호화

마지막 업데이트 날짜: 2024년 10월 04일
Parquet 모듈형 암호화

데이터가 열 형식으로 저장된 경우 Parquet 파일을 작성할 때 Parquet 모듈식 암호화를 사용하여 민감한 열을 암호화하고, 암호화된 파일을 읽을 때 이러한 열을 복호화할 수 있습니다. 열 수준의 데이터 암호화를 사용하면 암호화할 열과 열 액세스 제어 방법을 결정할 수 있습니다.

개인정보 보호 외에도 Parquet 모듈식 암호화를 통해 저장된 데이터의 무결성을 보호합니다. 파일 컨텐츠에 대한 변경이 감지되면 리더측 예외가 트리거됩니다.

키 기능에는 다음이 포함됩니다.

  1. Parquet 모듈식 암호화 및 복호화는 Spark 클러스터에서 수행됩니다. 따라서 민감한 데이터와 암호화 키가 스토리지에 표시되지 않습니다.

  2. 인코딩, 압축, columnar 투영(columnar projection) 및 조건절 푸시다운(predicate push-down) 같은 표준 Parquet 기능은 Parquet 모듈식 암호화 형식을 가진 파일에서 계속해서 작동합니다.

  3. Parquet 스펙에 정의된 2개의 암호화 알고리즘 중 하나를 선택할 수 있습니다. 두 알고리즘 모두 열 암호화를 지원합니다. 그러나 다음을 참고하십시오.

    • 기본 알고리즘 AES-GCM은 Parquet 파일의 데이터와 메타데이터 파트가 변경되지 않도록 완벽한 보호를 제공합니다.
    • 대체 알고리즘 AES-GCM-CTR은 Parquet 파일에 대한 부분적인 무결성 보호를 지원합니다. 데이터 파트가 아닌 메타데이터 파트만 변경되지 않도록 보호됩니다. 이 알고리즘의 이점은 AES-GCM 알고리즘과 비교하여 처리량 오버헤드가 더 낮다는 것입니다.
  4. 암호화할 열을 선택할 수 있습니다. 다른 열은 암호화되지 않으므로 처리량 오버헤드가 줄어듭니다.

  5. 다른 열을 다른 키로 암호화할 수 있습니다.

  6. 기본적으로 기본 Parquet 메타데이터 모듈(파일 바닥글)이 암호화되어 파일 스키마와 민감한 열 목록을 숨깁니다. 그러나 암호화된 파일에서 암호화되지 않은 열을 읽기 위해 레거시 리더(예: 아직 Parquet 모듈 암호화를 지원하지 않는 다른 Spark 분포)를 사용하기 위해 파일 바닥글을 암호화하지 않도록 선택할 수 있습니다.

  7. 암호화 키는 다음 두 가지 방법 중 하나로 관리할 수 있습니다.

    • 애플리케이션에서 직접. 애플리케이션에서 키 관리를 참조하십시오.
    • Spark 서비스에서 사용되는 암호화 키를 생성하고 저장하고 영구 삭제하는 키 관리 시스템(KMS)에서. 이러한 키는 KMS 서버에 계속 있으므로 Spark 서비스를 포함한 다른 구성요소에 표시되지 않습니다. KMS의 키 관리를 참조하십시오.

    참고: 애플리케이션 또는 KMS에서는 마스터 암호화 키(MEK)만 관리해야 합니다.

    민감한 각 열에 대해 암호화에 사용할 마스터 키를 지정해야 합니다. 또한 각 암호화 파일(데이터 프레임)의 바닥글에 대해 마스터 키를 지정해야 합니다. 기본적으로 바닥글 키는 바닥글 암호화에 사용됩니다. 그러나 일반 텍스트 바닥글 모드를 선택하는 경우 바닥글은 암호화되지 않으며 키는 바닥글의 무결성 검증에만 사용됩니다.

    예를 들어, 애플리케이션의 SparkContext의 Hadoop 구성에 구성 값을 설정하여 암호화 매개변수를 표준 Spark Hadoop 구성을 통해 전달할 수 있습니다.

    sc.hadoopConfiguration.set("<parameter name>" , "<parameter value>")
    

    또는 쓰기 옵션을 통해 매개변수 값을 전달할 수 있습니다.

    <data frame name>.write
    .option("<parameter name>" , "<parameter value>")
    .parquet("<write path>")
    

Parquet 모듈식 암호화를 사용하여 실행

Parquet 모듈식 암호화는 IBM Analytics Engine 서비스 인스턴스에서 실행되는 Spark 노트북에서만 사용 가능합니다. Parquet 모듈식 암호화는 Spark 환경에서 실행되는 노트북에서는 지원되지 않습니다.

Parquet 모듈식 암호화를 사용하려면 Parquet 모듈식 암호화를 구현하는 Parquet JAR 파일과 키 관리 JAR 파일을 가리키도록 다음 Spark classpath 특성을 설정하십시오.

  1. Ambari > Spark > 구성 -> 사용자 정의 spark2-default로 이동하십시오.

  2. JAR 파일의 위치를 명시적으로 가리키도록 다음 두 매개변수를 추가하십시오. 클러스터에서 실제 버전의 JAR 파일을 사용하도록 경로를 편집해야 합니다.

    spark.driver.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet-kms-<latestversion>-jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-<latestversion>.jar:/home/common/lib/parquetEncryption/parquet-hadoop-<latestversion>.jar
    
    spark.executor.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet-<latestversion>-jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-<latestversion>.jar:/home/common/lib/parquetEncryption/parquet-hadoop-<latestversion>.jar
    

필수 매개변수

다음 매개변수는 암호화된 데이터를 기록하기 위해 필요합니다.

  • 마스터 암호화 키를 사용하여 암호화할 열 목록:

    parameter name: "encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,.."
    
  • 푸터 키:

    parameter name: "encryption.footer.key"
    parameter value: "<master key ID>"
    

    예를 들어,

    dataFrame.write
    .option("encryption.footer.key" , "k1")
    .option("encryption.column.keys" , "k2:SSN,Address;k3:CreditCard")
    .parquet("<path to encrypted files>")
    
    중요:

    encryption.column.keys 매개변수와 encryption.footer.key 매개변수를 모두 설정하지 않으면 파일이 암호화되지 않습니다. 이러한 매개변수 중 하나만 설정하면 암호화된 파일에 이러한 매개변수가 필수이므로 예외가 발생합니다.

선택적 매개변수

암호화된 데이터를 기록할 때 다음 선택적 매개변수를 사용할 수 있습니다.

  • 암호화 알고리즘 AES-GCM-CTR

    기본적으로 Parquet 모듈 암호화는 Parquet 파일의 데이터 및 메타데이터를 조작하는 것에 대해 완전한 보호를 제공하는 AES-GCM 알고리즘을 사용합니다. 그러나 Spark 2.3.0은 CPU 하드웨어에서 AES 가속(Java 9에만 추가됨)을 지원하지 않는 Java 8에서 실행되므로 데이터 무결성 검증의 오버헤드가 특정 상황에서 워크로드에 영향을 미칠 수 있습니다.

    이를 보상하기 위해 데이터 무결성 검증 지원을 끄고 대체 알고리즘 AES-GCM-CTR을 사용하여 암호화된 파일을 작성할 수 있습니다. 이 알고리즘은 메타데이터 파트의 무결성만 검증하고 데이터 파트의 무결성은 검증하지 않으며, AES-GCM 알고리즘과 비교하여 처리량 오버헤드가 낮습니다.

    parameter name: "encryption.algorithm"
    parameter value: "AES_GCM_CTR_V1"
    
  • 레거시 리더를 위한 평문 바닥글 모드

    기본적으로 기본 Parquet 메타데이터 모듈(파일 바닥글)이 암호화되어 파일 스키마와 민감한 열 목록을 숨깁니다. 그러나 암호화된 파일에서 암호화되지 않은 열을 읽기 위해 다른 Spark 및 파켓 리더(아직 Parquet 모듈 암호화를 지원하지 않음)를 사용 가능하게 하기 위해 파일 바닥글을 암호화하지 않기로 결정할 수 있습니다. 바닥글 암호화를 끄려면 다음 매개변수를 설정하십시오.

    parameter name: "encryption.plaintext.footer"
    parameter value: "true"
    
    중요:

    일반 텍스트 바닥글 모드에서도 encryption.footer.key 매개변수를 지정해야 합니다. 바닥글은 암호화되지 않지만 키는 바닥글 컨텐츠에 서명하는 데 사용되므로 새로운 독자가 무결성을 확인할 수 있습니다. 기존의 독자는 바닥글 서명을 추가해도 영향을 받지 않습니다.

사용 예제

Python 의 다음 샘플 코드 스니펫은 데이터 프레임을 작성하고 암호화된 parquet 파일에 기록하며 암호화된 parquet 파일에서 읽는 방법을 보여줍니다.

  • Python: 암호화된 데이터 쓰기:

    from pyspark.sql import Row
    
    squaresDF = spark.createDataFrame(
        sc.parallelize(range(1, 6))
        .map(lambda i: Row(int_column=i, square_int_column=i ** 2)))
    
    sc._jsc.hadoopConfiguration().set("encryption.key.list",
        "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    sc._jsc.hadoopConfiguration().set("encryption.column.keys",
        "key1:square_int_column")
    sc._jsc.hadoopConfiguration().set("encryption.footer.key", "key2")
    
    encryptedParquetPath = "squares.parquet.encrypted"
    squaresDF.write.parquet(encryptedParquetPath)
    
  • Python: 암호화된 데이터 읽기:

    sc._jsc.hadoopConfiguration().set("encryption.key.list",
        "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    
    encryptedParquetPath = "squares.parquet.encrypted"
    parquetFile = spark.read.parquet(encryptedParquetPath)
    parquetFile.show()
    

Python 작업 파일 InMemoryKMS.py 의 내용은 다음과 같습니다.

from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.sql import Row

if __name__ == "__main__":
    spark = SparkSession \
        .builder \
        .appName("InMemoryKMS") \
        .getOrCreate()
    sc = spark.sparkContext
    ##KMS operation
    print("Setup InMemoryKMS")
    hconf = sc._jsc.hadoopConfiguration()
    encryptedParquetFullName = "testparquet.encrypted"
    print("Write Encrypted Parquet file")
    hconf.set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    btDF = spark.createDataFrame(sc.parallelize(range(1, 6)).map(lambda i: Row(ssn=i,  value=i ** 2)))
    btDF.write.mode("overwrite").option("encryption.column.keys", "key1:ssn").option("encryption.footer.key", "key2").parquet(encryptedParquetFullName)
    print("Read Encrypted Parquet file")
    encrDataDF = spark.read.parquet(encryptedParquetFullName)
    encrDataDF.createOrReplaceTempView("bloodtests")
    queryResult = spark.sql("SELECT ssn, value FROM bloodtests")
    queryResult.show(10)
    sc.stop()
    spark.stop()

암호화 키 내부 처리

Parquet 파일을 작성할 때 암호화된 각 열과 바닥글에 대해 무작위 데이터 암호화 키(DEK)가 생성됩니다. 이러한 키를 사용하여 Parquet 파일에서 데이터와 메타데이터 모듈을 암호화합니다.

데이터 암호 키는 키 암호화 키(KEK)로 암호화되고, 각 마스터 키의 Spark/Parquet 내부에 생성됩니다. 키 암호화 키는 로컬에서 마스터 암호화 키(MEK)를 사용하여 암호화됩니다.

암호화된 데이터 암호화 키와 키 암호화 키는 마스터 키 ID와 함께 Parquet 파일 메타데이터에 저장됩니다. 각 키 암호화 키는 고유한 ID(일반적으로 로컬에 있는 소스 무작위 16바이트 값)를 가지며 파일 메타데이터에 저장됩니다.

Parquet 파일을 읽으면 마스터 암호화 키(MEK)의 ID, 해당 ID를 가진 암호화된 키 암호화 키(KEK) 및 암호화된 데이터 암호화 키(DEK)가 파일 메타데이터에서 추출됩니다.

키 암호화 키는 로컬에서 마스터 암호화 키를 사용하여 복호화됩니다. 그런 다음 키 암호화 키(KEK)를 사용하여 로컬에서 데이터 암호화 키(DEK)가 복호화됩니다.

자세히 알아보기