IBM Cloud Docs
Parquet 모듈 암호화에 대한 작업

Parquet 모듈 암호화에 대한 작업

IBM Analytics Engine Serverless는 Parquet 모듈 암호화를 지원하며 Parquet 파일을 쓸 때 민감한 열을 암호화하고 암호화된 파일을 읽을 때 이러한 열을 복호화할 수 있도록 하는 Parquet 표준에 새로 추가되었습니다. Parquet 모듈 암호화를 참조하십시오.

개인정보 보호를 보장하는 것 외에 Parquet 암호화는 저장된 데이터의 무결성도 보호합니다. 파일 컨텐츠 변조가 발견되고 이로 인해 리더 측 예외가 트리거됩니다.

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

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

  2. 표준 Parquet 기능(예: 인코딩, 압축, 원주형 투영 및 술어 푸시다운)은 Parquet 모듈 암호화 형식의 파일에서 일반적인 작업을 계속합니다.

  3. Parquet 스펙에 정의된 두 개의 암호화 알고리즘 중 하나를 선택할 수 있습니다. 두 알고리즘 모두 열 암호화를 지원하지만 다음과 같은 점이 있습니다.

    • 기본 알고리즘 AES-GCM은 Parquet 파일의 데이터 및 메타데이터 파트 변조로부터 완전히 보호합니다.
    • 대체 알고리즘 AES-GCM-CTR은 Parquet 파일의 부분적 무결성 보호를 지원합니다. 데이터 파트가 아닌 메타데이터 파트만 변조에 대해 보호됩니다. 이 알고리즘의 장점은 AES-GCM 알고리즘에 비해 처리량 오버헤드가 낮다는 점입니다.
  4. 암호화할 열을 선택할 수 있습니다. 다른 열은 암호화되지 않으므로 처리량 오버헤드를 줄일 수 있습니다.

  5. 서로 다른 키를 사용하여 여러 열을 암호화할 수 있습니다.

  6. 기본적으로 기본 Parquet 메타데이터 모듈(파일 푸터)은 파일 스키마 및 민감한 열 목록을 숨기도록 암호화됩니다. 하지만 레거시 리더가(예: 아직 Parquet 암호화를 지원하지 않는 기타 Spark 분산) 암호화된 파일에서 암호화되지 않은 열을 읽을 수 있도록 파일 푸터를 암호화하지 않게 선택할 수 있습니다.

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

    • 애플리케이션에서 직접. 애플리케이션별 키 관리를 참조하십시오.
    • IBM® Key Protect for IBM Cloud®에서 사용되는 암호화 키 생성, 관리 및 영구 삭제를 위한 중앙 집중식 키 관리 시스템(KMS)인 IBM Analytics Engine를 통해. Key Protect{: {: external}}를 참조하십시오.

    IBM® Key Protect for IBM Cloud®를 사용하면 IBM Cloud Identity and Access Management(IAM) 역할에 맞춰 암호화 키를 관리할 수 있습니다.

    참고: 마스터 암호화 키(MEK)만 관리해야 합니다(애플리케이션 또는 Key Protect로). 데이터 암호화 키(DEK)는 Spark/Parquet에서 자동으로 처리됩니다. Parquet 암호화 내 키 처리에 대한 세부사항은 암호화 키 처리의 내부를 참조하십시오.

    각 민감한 열에 대해 암호화에 사용할 마스터 키를 지정해야 합니다. 또한 각 암호화된 파일(데이터 프레임)의 푸터에 마스터 키를 지정해야 합니다. 이러한 푸터는 역시 민감할 수 있는 민감한 열의 목록 및 스키마와 같은 메타데이터를 보관하기 때문입니다. 기본적으로 푸터 키는 푸터 암호화에 사용됩니다. 하지만 일반 텍스트 푸터 모드를 선택하면 푸터가 암호화되지 않으며 키는 푸터의 무결성 검증에만 사용됩니다.

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

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

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

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

Parquet 암호화를 사용하여 실행하기 위한 필수 매개변수

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

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

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

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

    예를 들어, 다음과 같습니다.

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

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

  • EncryptionPropertiesFactory 를 구현하는 클래스:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    

    중요: "parquet.crypto.factory.class" 가 설정되지 않은 경우 파일은 암호화 팩토리에 의해 암호화되지 않습니다.

선택적 매개변수

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

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

    기본적으로 Parquet 암호화는 Parquet 파일의 데이터 및 메타데이터 변조로부터 완전히 보호하는 AES-GCM 알고리즘을 사용합니다. 하지만 Spark 2.3.0은 CPU 하드웨어의 AES 가속화(Java 9에만 추가됨)를 지원하지 않는 Java 8에서 실행되므로, 특정 상황에서 데이터 무결성 검증의 오버헤드가 워크로드 처리량에 반영될 수 있습니다.

    이를 보완하기 위해 데이터 무결성 검증 지원을 해제하고, 데이터 파트의 무결성이 아닌 메타데이터 파트의 무결성을 검증하고 AES-GCM-CTR 알고리즘에 비해 처리량 오버헤드가 낮은 대체 알고리즘 AES-GCM로 암호화된 파일을 작성할 수 있습니다.

    parameter name: "parquet.encryption.algorithm"
    parameter value: "AES_GCM_CTR_V1"
    
  • 레거시 리더를 위한 일반 텍스트 푸터 모드

    기본적으로 기본 Parquet 메타데이터 모듈(파일 푸터)은 파일 스키마 및 민감한 열 목록을 숨기도록 암호화됩니다. 하지만 다른 Spark 및 Parquet 리더가(아직 Parquet 암호화를 지원하지 않음) 암호화된 파일에서 암호화되지 않은 열을 읽을 수 있도록 파일 푸터를 암호화하지 않게 결정할 수 있습니다. 푸터 암호화를 해제하려면 다음 매개변수를 설정하십시오.

    parameter name: "parquet.encryption.plaintext.footer"
    parameter value: "true"
    

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

사용 예제

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

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

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

    sc._jsc.hadoopConfiguration().set("parquet.crypto.factory.class",
        "com.ibm.parquet.key.management.IBMKeyToolsFactory")
    sc._jsc.hadoopConfiguration().set("parquet.encryption.key.list",
         "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    
    encryptedParquetPath = "squares.parquet.encrypted"
    parquetFile = spark.read.parquet(encryptedParquetPath)
    parquetFile.show()
    
  • Scala: 암호화된 데이터 쓰기

    case class SquareItem(int_column: Int, square_int_column: Double)
    val dataRange = (1 to 6).toList
    val squares = sc.parallelize(dataRange.map(i => new SquareItem(i, scala.math.pow(i,2))))
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    sc.hadoopConfiguration.set("parquet.encryption.key.list","key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    val encryptedParquetPath = "squares.parquet.encrypted"
    squares.toDS().write
      .option("parquet.encryption.column.keys", "key1:square_int_column")
      .option("parquet.encryption.footer.key", "key2")
      .parquet(encryptedParquetPath)
    
  • Scala: 암호화된 데이터 읽기

    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    sc.hadoopConfiguration.set("parquet.encryption.key.list","key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
    val encryptedParquetPath = "squares.parquet.encrypted"
    val parquetFile = spark.read.parquet(encryptedParquetPath)
    parquetFile.show()
    

암호화 키 처리의 내부

Parquet 파일을 작성할 때 랜덤 데이터 암호화 키(DEK)는 푸터 및 각 암호화된 열에 대해 생성됩니다. 이러한 키는 Parquet 파일에서 데이터 및 메타데이터 모듈을 암호화하는 데 사용됩니다.

그런 다음, 데이터 암호화 키는 키 암호화 키(KEK)로 암호화되고 각 마스터 키에 대해 Spark/Parquet 내에 생성됩니다. 키 암호화 키는 마스터 키가 애플리케이션에서 관리되는 경우에는 로컬로, 마스터 키가 IBM® Key Protect for IBM Cloud®에서 관리되는 경우에는 KeyProtect 서비스에서 마스터 암호화 키(MEK)로 암호화됩니다.

암호화된 데이터 암호화 키 및 키 암호화 키는 마스터 키 ID와 함께 Parquet 파일 메타데이터에 저장됩니다. 각 키 암호화 키는 파일 메타데이터에 저장된 고유 ID(보안 랜덤 16바이트 값으로 로컬로 생성됨)를 갖습니다. 키 암호화 키는 액세스 토큰에 의해 캐시되므로, 동일한 마스터 암호화 키를 사용하는 경우 암호화된 각 열 또는 파일에 대해 KeyProtect 서비스와 상호작용할 필요가 없습니다.

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

키 암호화 키는 마스터 키가 애플리케이션에서 관리되는 경우에는 로컬로, 마스터 키가 IBM® Key Protect for IBM Cloud®에서 관리되는 경우에는 KeyProtect 서비스에서 마스터 암호화 키로 복호화됩니다. 키 암호화 키는 액세스 토큰에 의해 캐시되므로, 동일한 키 암호화 키를 사용하는 경우 복호화된 각 열 또는 파일에 대해 KeyProtect 서비스와 상호작용할 필요가 없습니다. 그런 다음 데이터 암호화 키(DEK)가 키 암호화 키(KEK)를 사용하여 로컬로 복호화됩니다.

키 순환(선택적 기능)

엔벨로프 암호화 방식에는 손상된 MEK로 인한 민감함 데이터 유출 위험을 최소화하기 위해 마스터 키를 순환(변경)하는 고급 옵션이 있습니다. DEK는 변경할 수 없습니다. 이는 Parquet 파일 전체의 암호화를 의미하기 때문입니다. 새 MEK(및 투명하게 재생성된 KEK)는 DEK를 재암호화하는데 사용됩니다.

Parquet 파일에서 키 순환을 사용하려면 parquet 파일을 작성할 때 Hadoop 구성에서 "parquet.encryption.key.material.store.internally" 매개변수를 "false"(으)로 설정해야 합니다.

이 매개변수 세트를 사용하면 Parquet가 Parquet 파일 내부 대신 별도의 작은 파일에 키(MEK로 랩핑된)를 저장합니다. 키 순환이 수행될 때, 소형 키 자료 파일만 대체됩니다. Parquet 파일을 수정할 필요가 없습니다(종종 변경 불가능함). 대부분의 KMS 시스템은 저장된 마스터 키의 내용을 대체하고 MEK ID를 그대로 유지함으로써 키 순환을 지원합니다(그러나 키 버전을 업데이트함). 사용자 또는 관리자가 KMS 특정 API를 사용하여 KMS 인스턴스 내부에서 마스터 키 순환을 수행하면, Parquet 키 순환 메카니즘은 다음과 같이 호출하여 트리거될 수 있습니다(예를 들어, 동일한 관리자에 의해).

public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig)

키 순환이 수행되면 folderPath의 모든 키 자료 파일에 있는 모든 KEK가 DEK를 복호화할 수 있도록 이전 MEK 버전으로 랩핑 해제됩니다. 각 마스터 키 ID에 대해 새 KEK가 생성되고, 새 MEK 버전으로 랩핑됩니다. 이전 KEK를 재사용하는 대신에 새 KEK를 작성하면 보안이 강화될 뿐만 아니라 후속 데이터 읽기 조작의 성능이 향상됩니다. 이는 관리자가 실행하는 단일 키 순환 프로세스가 여러 프로세스를 통해 작성된 여러 파일에 걸쳐 작동하기 때문이며, 이는 동일한 MEK ID에 대한 여러 서로 다른 KEK를 의미합니다. 키 순환 프로세스는 이전 KEK를 하나의 새로운 KEK로 대체되며, 이를 통해 독자는 각 마스터 키에 대한 KMS와의 단일 랩핑 해제 상호작용을 실행할 수 있습니다.

키 순환을 사용하는 방법에 대한 예는 다음과 같습니다.

자세한 정보

다음 샘플 노트북에서 Parquet 암호화를 사용하는 방법을 알아보십시오.