Key Protect를 통한 키 관리

이 주제에서는 IBM® Key Protect for IBM Cloud®(Key Protect)를 사용한 열 암호화 키 관리에 대해 설명합니다. 또한 Key Protect 인스턴스를 작성하고 마스터 키를 제공하는 방법과 이러한 마스터 키를 사용하여 암호화된 데이터를 쓰고 읽는 방법에 대해 설명합니다.

Key Protect 인스턴스 및 마스터 키 작성

Key Protect 인스턴스 및 마스터 키를 작성하려면 다음을 수행하십시오.

  1. Key Protect 서비스 인스턴스를 작성하십시오. 서비스 프로비저닝을 참조하십시오.

  2. 이 인스턴스에서 고객 루트 키를 작성하십시오. 고객 루트 키는 열 암호화를 위한 마스터 키 역할을 합니다. 루트 키 작성을 참조하십시오.

    기존 루트 키를 사용하려는 경우 해당 키를 가져올 수 있습니다. 루트 키 가져오기를 참조하십시오.

  3. IBM IAM 서비스를 사용하여 마스터 키에 대한 사용자 액세스 권한을 구성하십시오. 마스터 키에 대한 액세스 부여를 참조하십시오.

암호화된 데이터 쓰기

암호화된 데이터를 쓰려면 다음을 수행하십시오.

  1. 다음 매개변수를 IBM Analytics Engine Serverless에 전달하십시오.

    • "parquet.crypto.factory.class": EncryptionProperties팩토리를 구현하는 클래스입니다. "com.ibm.parquet.key.management.IBMKeyToolsFactory" 로 설정하십시오.
      sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
      
    • "parquet.encryption.kms.instance.id": KeyProtect 인스턴스의 ID입니다. 예:
      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "27861a9a-6779-4026-bca4-01e59acf0767")
      
    • "parquet.encryption.kms.instance.url": KeyProtect 인스턴스의 URL입니다. 예:
      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<region>.kms.cloud.ibm.com")
      
    • "parquet.encryption.key.access.token": KeyProtect 인스턴스의 필수 키에 대한 액세스 권한이 있는 유효한 IAM 토큰입니다. 예:
      sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
      
      토큰을 로컬 파일에 보관하면 이를 로드할 수 있습니다.
      val token = scala.io.Source.fromFile("<token file>").mkString
      sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
      
  2. 암호화해야 하는 열을 마스터 키와 함께 지정하십시오. 푸터 키도 지정해야 합니다. Key Protect를 통한 키 관리에서 마스터 키 ID는 IBM Cloud 서비스 창에서 찾을 수 있는 Key Protect CRK(고객 루트 키)의 ID입니다. 예를 들어, 다음과 같습니다.

    val k1 = "d1ae3fc2-6b7d-4a03-abb6-644e02933734"
    val k2 = "c4a21521-2a78-4968-a7c2-57c481f58d5c"
    val k3 = "a4ae4bc2-9d78-8748-f8a2-17f584d48c5b"
    
    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" 매개변수를 설정하지 않은 경우 예외가 발생합니다.

암호화된 데이터 읽기

KeyProtect 인스턴스의 ID와 URL을 포함한 필수 메타데이터가 암호화된 Parquet 파일에 저장됩니다.

암호화된 메타데이터를 읽으려면 다음을 수행하십시오.

  1. EncryptionProperties팩토리를 구현하는 클래스를 설정하십시오.
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. 관련 키의 IAM 액세스 토큰을 제공하십시오.
    sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
    
  3. 다음과 같은 일반 parquet 읽기 명령을 호출하십시오.
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

키 순환

키 회전이 필요한 경우 관리자는 수동으로 키 회전에 설명된 절차를 사용하여 Key Protect 에서 마스터 키를 회전해야 합니다. 그런 다음 관리자는 다음을 호출하여 Parquet 키 순환을 트리거할 수 있습니다.

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

Parquet 키 순환을 사용으로 설정하려면 다음 Hadoop 구성 특성이 설정되어야 합니다.

  • 매개변수 "parquet.encryption.key.access.token", "parquet.encryption.kms.instance.url", "parquet.encryption.kms.instance.id"

  • "parquet.encryption.key.material.store.internally" 매개변수를 "false"(으)로 설정해야 함

  • "parquet.encryption.kms.client.class" 매개변수를 "com.ibm.parquet.key.management.KeyProtectClient"(으)로 설정해야 함

  • "parquet.crypto.factory.class" 매개변수를 "com.ibm.parquet.key.management.IBMKeyToolsFactory" 로 설정해야 합니다.

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

    sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
    sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<region>.kms.cloud.ibm.com")
    sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id", "27861a9a-6779-4026-bca4-01e59acf0767")
    sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
    sc.hadoopConfiguration.set("parquet.encryption.kms.client.class" "com.ibm.parquet.key.management.KeyProtectClient")
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
    KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)