IBM Cloud Docs
암호화 키 작성 및 가져오기

암호화 키 작성 및 가져오기

Hyper Protect Crypto Services를 사용하여 암호화 키를 작성하고, 암호화하고, 클라우드에 가져오는 방법을 알아봅니다.

목표

이 튜토리얼에서는 암호화 키를 작성하여 Hyper Protect Crypto Services 서비스로 안전하게 가져오는 과정을 안내합니다. 이는 Hyper Protect Crypto Services의 키 관리 기능은 처음 사용하지만 키 관리 시스템에 대해서는 어느 정도 알고 있는 사용자를 대상으로 합니다. 다음 단계를 완료하기까지 약 20분 정도가 소요됩니다.

  • 키 관리 서비스 API 설정
  • 키 가져오기를 시작하기 위해 Hyper Protect Crypto Services 서비스 인스턴스 준비
  • OpenSSL 암호화 툴킷을 사용하여 키 작성 및 암호화
  • Hyper Protect Crypto Services 서비스 인스턴스에 암호화된 키 가져오기

이 튜토리얼에서는 IBM Cloud 계정에 대한 비용을 부과하지 않습니다.

태스크 플로우

다음 플로우 차트에서는 암호화 키를 작성하고 가져오는 방법에 대한 개요를 제공합니다. 차트의 각 단계를 클릭하여 해당 단계의 세부사항을 확인할 수 있습니다.

플로우에 대한 세부사항을 확인하려면 각각의 단계를 클릭하십시오.
암호화 키를 작성하고 가져오기 위한 태스크 플로우
1. 가져오기 토큰 작성 2. 가져오기 토큰 검색 3. 암호화 키 작성 4. 암호화 키를 환경 변수로 설정 5. 암호화 키를 사용하여 난스 암호화 6. 작성된 암호화 키 암호화 7. 암호화된 키 가져오기 8. 정리

시작하기 전에

시작하려면 IBM Cloud에 프로비저닝하는 서비스와 상호작용할 수 있도록 IBM Cloud CLI가 필요합니다. 워크스테이션에 로컬로 설치된 openssljq 패키지도 필요합니다.

  1. IBM Cloud 계정을 작성하십시오.

  2. 사용자의 운영 체제에 맞는 IBM CloudCLI를 다운로드하여 설치하십시오.

  3. IBM Key Protect CLI 플러그인 v0.6.3 이상을 다운로드하여 설치한 후 Hyper Protect Crypto Services에서 사용하도록 구성하십시오. KP_PRIVATE_ADDR 변수를 현재 인스턴스 키 관리 엔드포인트 URL로 업데이트해야 합니다.

    IBM Key Protect CLI 플러그인 버전을 확인하려면 다음 명령을 실행하십시오.

    ibmcloud plugin show key-protect
    

    IBM Key Protect CLI 플러그인을 최신 버전으로 업데이트하려면 다음 명령을 실행하십시오.

    ibmcloud plugin update key-protect -r 'IBM Cloud'
    
  4. OpenSSL 암호화 라이브러리를 다운로드하여 설치하십시오.

    처음으로 Hyper Protect Crypto Services을(를) 사용하는 경우 로컬 워크스테이션에서 openssl 명령을 사용하여 암호화 키를 작성할 수 있습니다. 이 튜토리얼에서는 OpenSSL 버전 1.0.2r 이상이 필요합니다.

    Mac을 사용 중인 경우 Homebrew를 사용하여 OpenSSL 을 빠르게 시작하고 실행할 수 있습니다. 처음 패키지를 설치하는 경우에는 brew install openssl을 실행하고, 기존 패키지를 최신 버전으로 업그레이드하려면 brew upgrade openssl을 실행하십시오.

  5. jq를 다운로드하여 설치하십시오.

    jq을(를) 사용하면 JSON 데이터를 분할할 수 있습니다. 이 학습서에서 jq을(를) 사용하여 Hyper Protect Crypto Services 키 관리 서비스 API 호출 시 리턴되는 특정 데이터를 점유하고 사용할 수 있습니다.

  6. Hyper Protect Crypto Services 서비스 인스턴스를 작성하십시오.

  7. Hyper Protect Crypto Services 서비스 인스턴스를 초기화하십시오.

  8. Hyper Protect Crypto Services 키 관리 서비스 API 설정.

가져오기 토큰 작성

서비스 신임 정보로 키 관리 서비스 API와의 상호 작용을 시작하여 암호화 키를 작성하고 서비스로 가져올 수 있습니다.

다음 단계에서는 Hyper Protect Crypto Services 서비스 인스턴스에 대한 가져오기 토큰을 작성합니다. 지정하는 정책을 기반으로 가져오기 토큰을 작성하여 서비스로 이동하는 중에 암호화 키에 대한 추가 보안을 사용으로 설정합니다.

  1. 명령행에서 새 hs-crypto-test 디렉토리로 변경하십시오.

    mkdir hs-crypto-test && cd hs-crypto-test
    

    이후 단계에서 작성할 파일을 저장하려면 이 디렉토리를 사용합니다.

  2. 키 관리 서비스 API를 사용하거나 CLI를 사용하여 Hyper Protect Crypto Services 서비스 인스턴스에 대한 가져오기 토큰을 작성한 후 응답을 JSON 파일에 저장할 수 있습니다.

    • API 사용

      curl -X POST $HPCS_API_URL/api/v2/import_token \
          -H "Accept: application/vnd.ibm.collection+json" \
          -H "Authorization: $ACCESS_TOKEN" \
          -H "Content-Type: application/json" \
          -H "Bluemix-Instance: $INSTANCE_ID" \
          -d '{
              "expiration": 1200,
              "maxAllowedRetrievals": 1
            }' > createImportTokenResponse.json
      

      요청 본문에서 시간 및 사용량에 따라 사용을 제한하는 가져오기 토큰에 대한 정책을 지정할 수 있습니다. 이 예에서 가져오기 토큰에 대한 만기 시간을 1200초(20분)로 설정하고 만기 시간 내에 해당 토큰의 검색을 한 번만 허용합니다.

    • IBM Key Protect CLI 사용

      ibmcloud kp import-token create --instance-id $INSTANCE_ID --max-retrievals=1 --expiration=1200 -o json > createImportTokenResponse.json
      
  3. 가져오기 토큰에 대한 세부사항을 보십시오.

    jq '.' createImportTokenResponse.json
    

    출력에는 가져오기 토큰과 연관된 메타데이터(예: 작성 날짜 및 정책 세부사항)가 표시됩니다. 다음 스니펫은 출력 예를 보여줍니다.

    {
      "creationDate": "2020-06-08T16:58:29Z",
      "expirationDate": "2020-06-08T17:18:29Z",
      "maxAllowedRetrievals": 1,
      "remainingRetrievals": 1
    }
    

가져오기 토큰 검색

이전 단계에서 가져오기 토큰을 작성했으며 토큰과 연관된 메타데이터를 확인했습니다.

이 단계에서는 가져오기 토큰과 연관된 공용 키 및 난스 값을 검색합니다. 이후 단계에서 데이터를 암호화하려면 공개 키가 필요하고 Hyper Protect Crypto Services 서비스에 대한 보안 가져오기 요청을 확인하려면 난스(nonce)가 필요합니다.

가져오기 토큰 컨텐츠를 검색하려면 다음을 수행하십시오.

  1. 이전 단계에서 생성한 가져오기 토큰을 검색한 후 응답을 JSON 파일에 저장하십시오.

    • API 사용

      curl -X GET $HPCS_API_URL/api/v2/import_token \
          -H "Accept: application/vnd.ibm.collection+json" \
          -H "Authorization: $ACCESS_TOKEN" \
          -H "Bluemix-Instance: $INSTANCE_ID" > getImportTokenResponse.json
      
    • IBM Key Protect CLI 사용

      ibmcloud kp import-token show -o json > getImportTokenResponse.json
      
  2. 선택사항: 가져오기 토큰의 컨텐츠 검사

    jq '.' getImportTokenResponse.json
    

    출력에는 가져오기 토큰에 대한 상세 정보가 표시됩니다. 다음 스니펫은 잘린 값이 포함된 출력 예를 보여줍니다.

    {
      "creationDate": "2020-06-08T16:58:29Z",
      "expirationDate": "2020-06-08T17:18:29Z",
      "maxAllowedRetrievals": 1,
      "remainingRetrievals": 0,
      "payload": "MIICIjANBgkqhkiG...",
      "nonce": "8zJE9pKVdXVe/nLb"
    }
    

    payload 값은 가져오기 토큰과 연관된 공개 키를 나타냅니다. 이 값은 base64로 인코딩되어 있습니다. 추가 보안을 위해 Hyper Protect Crypto Services는 서비스에 대한 요청의 원본을 확인하는 데 사용되는 nonce 값을 제공합니다. 암호화 키를 가져올 때 이 값을 암호화하고 제공해야 합니다.

  3. 공개 키를 디코딩하고 PublicKey.pem 파일에 저장한 후 나중에 사용할 수 있도록 변수로 값을 추출하십시오.

    jq -r '.payload' getImportTokenResponse.json | openssl enc -base64 -A -d -out PublicKey.pem
    
    HPCS_PUBKEY="$(jq -r '.payload' getImportTokenResponse.json)"
    NONCE="$(jq -r '.nonce' getImportTokenResponse.json)"
    

    이제 공개 키는 PEM 형식으로 워크스테이션에 다운로드됩니다. 다음 단계를 계속하십시오.

암호화 키 작성

Hyper Protect Crypto Services을(를) 사용하는 경우 IBM Cloud에서 사용할 고유 암호화 키를 작성하고 업로드하여 KYOK(Keep Your Own Key)의 보안을 활용할 수 있습니다.

다음 단계에서 사용자의 로컬 시스템에 256비트의 AES 대칭 키를 작성합니다.

이 튜토리얼에서는 OpenSSL 암호화 툴킷을 사용하여 의사 랜덤 키를 생성하지만 보안 요구사항에 따라 더욱 강력한 키를 생성하기 위해 다른 옵션을 탐색할 수 있습니다. 예를 들어, 온프레미스 HSM(Hardware Security Module)에서 지원하는 조직의 내부 키 관리 시스템을 사용하여 키를 작성하고 내보낼 수 있습니다.

명령행에서 256비트 AES 대칭 키를 작성하려면 다음 openssl 명령을 실행하십시오.

openssl rand 32 > PlainTextKey.bin

이 튜토리얼에서 고유한 키를 사용하는 경우에는 이 단계를 건너뛸 수 있습니다.

성공! 이제 암호화 키가 PlainTextKey.bin이라고 하는 파일에 저장되었습니다. 다음 단계를 계속하십시오.

암호화 키를 환경 변수로 설정

3단계를 수행하여 키를 작성하는 경우 해당 키를 인코딩하고 인코딩된 값을 환경 변수로 설정하기 위해 다음 명령을 수행하십시오. 이 학습서에서 고유 키를 사용하는 경우 이 단계를 건너뛸 수 있습니다.

KEY_MATERIAL=$(openssl enc -base64 -A -in PlainTextKey.bin)

암호화 키를 사용하여 난스 암호화

추가적인 보안을 위해 Hyper Protect Crypto Services에서 서비스로 암호화 키를 가져올 때 난스 검증이 필요합니다.

암호화에서 난스(nonce)는 악의적인 공격 및 권한 없는 호출로부터 보호하기 위해 요청의 원본을 확인하는 세션 토큰의 역할을 합니다. Hyper Protect Crypto Services에서 분배되는 동일한 난스(nonce)를 사용하면 키 업로드 요청이 유효한지 확인하는 데 도움이 됩니다. 난스(nonce)는 서비스에 가져올 동일한 키를 사용하여 암호화되어야 합니다.

난스(nonce) 값을 암호화하려면 다음을 수행하십시오.

  1. 서브넷 단계를 수행하는 데 API를 사용할 경우 다음을 수행하십시오.

    IBM Key Protect CLI를 사용할 경우 이 단계를 수행할 필요는 없습니다.

    1. 운영 체제와 호환 가능한 샘플 kms-encrypt-nonce 2진 을 다운로드하십시오. 파일을 추출한 후 2진을 hs-crypto-test 디렉토리로 이동시키십시오.

      이 바이너리에는 2단계에서 생성된 키를 사용하여 난스 값에 대한 AES-CBC 암호화를 실행하기 위해 사용할 수 있는 스크립트가 포함되어 있습니다. 스크립트에 대해 자세히 알아보려면 GitHub에서 소스 파일을 체크아웃하십시오.

    2. Linux를 사용하는 경우 다음 chmod 명령을 실행하여 파일을 실행 가능으로 표시하십시오. Windows를 사용하는 경우에는 이 단계를 건너뛸 수 있습니다.

      chmod +x ./kms-encrypt-nonce
      
    3. 이 스크립트를 실행하여 2단계에서 생성된 키로 난스 값을 암호화하십시오.

  2. 암호화된 난스를 EncryptedValues.json 파일에 저장하십시오.

    • API 사용

      ./kms-encrypt-nonce -key $KEY_MATERIAL -nonce $NONCE -alg "CBC" > EncryptedValues.json
      
    • IBM Key Protect CLI 사용

      ibmcloud kp import-token nonce-encrypt --key "$KEY_MATERIAL" --nonce "$NONCE" --cbc -o json > EncryptedValues.json
      
  3. 선택사항: JSON 파일의 컨텐츠 검사

    jq '.' EncryptedValues.json
    

    출력에는 다음 단계를 위해 제공해야 할 값이 표시됩니다. 다음 스니펫은 잘린 값이 포함된 출력 예를 보여줍니다.

    {
      "encryptedNonce": "DVy/Dbk37X8gSVwRA5U6vrHdWQy8T2ej+riIVw==",
      "iv": "puQrzDX7gU1TcTTx"
    }
    

    encryptedNonce 값은 OpenSSL을 사용하여 생성한 키로 랩핑(또는 암호화)된 원래의 난스를 나타냅니다. iv 값은 AES-CBC 알고리즘으로 작성된 초기화 벡터(IV)이며, Hyper Protect Crypto Services가 난스(nonce)를 복호화할 수 있도록 나중에 필요합니다.

작성된 암호화 키 암호화

이제 2단계에서 Hyper Protect Crypto Services에 의해 배포된 공개 키를 사용하여 OpenSSL을 사용하여 작성한 암호화 키를 암호화하십시오.

  • API를 사용하여 작성된 암호화 키를 암호화한 후 다음과 같이 해당 키를 환경 변수에 지정하십시오.

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -keyform PEM \
      -inkey PublicKey.pem \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:sha1 \
      -in PlainTextKey.bin \
      -out EncryptedKey.bin
    
    ENCRYPTED_KEY=$(openssl enc -base64 -A -in EncryptedKey.bin)
    

    Mac OSX에서 openssl 명령을 실행할 때 매개변수 설정 오류가 발생하는 경우 OpenSSL이 사용자 환경에 맞게 올바르게 구성되어 있는지 확인해야 할 수 있습니다. Homebrew를 사용하여 OpenSSL을 설치한 경우 brew updatebrew install openssl을 차례로 실행하여 최신 버전을 가져오십시오. 그런 다음 export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile을 실행하여 패키지를 대칭 링크로 사용 가능하도록 하십시오. 명령행에서 which openssl && openssl version을 실행하여 OpenSSL의 최신 버전이 /usr/local/ 위치에서 사용 가능한지 확인하십시오. 계속해서 오류가 발생하면 이 예에 나열된 매개변수만 사용해야 합니다.

  • IBM Key Protect CLI를 사용하여 작성된 암호화 키를 암호화하십시오.

    ibmcloud kp import-token key-encrypt -k "$KEY_MATERIAL" -p "$HPCS_PUBKEY" --hash SHA1 -o json > EncryptedKey.json
    ENCRYPTED_KEY=$(jq -r '.encryptedKey' EncryptedKey.json)
    

    성공! 이제 암호화된 키를 Hyper Protect Crypto Services에 업로드할 준비가 되었습니다. 다음 단계를 계속하십시오.

암호화된 키 가져오기

이제 키 관리 서비스 API를 사용하여 암호화된 키를 가져올 수 있습니다.

암호화된 키를 가져오려면 다음 작업을 수행하십시오.

  1. 암호화된 난스(nonce) 및 초기화 벡터(IV) 값을 수집하십시오.

    ENCRYPTED_NONCE=$(jq -r '.encryptedNonce' EncryptedValues.json)
    
    IV=$(jq -r '.iv' EncryptedValues.json)
    
  2. Hyper Protect Crypto Services 서비스 인스턴스에 암호화된 키를 저장하십시오.

    • API 사용

      curl -X POST  $HPCS_API_URL/api/v2/keys \
          -H "Accept: application/vnd.ibm.collection+json" \
          -H "Authorization: $ACCESS_TOKEN" \
          -H "Content-Type: application/json" \
          -H "Bluemix-Instance: $INSTANCE_ID" \
          -d '{
            "metadata": {
              "collectionType": "application/vnd.ibm.kms.key+json",
              "collectionTotal": 1
            },
            "resources": [
            {
              "name": "encrypted-root-key",
              "type": "application/vnd.ibm.kms.key+json",
              "payload": "'"$ENCRYPTED_KEY"'",
              "extractable": false,
              "encryptionAlgorithm": "RSAES_OAEP_SHA_1",
              "encryptedNonce": "'"$ENCRYPTED_NONCE"'",
              "iv": "'"$IV"'"
            }
          ]
        }' > createRootKeyResponse.json
      

      요청 본문에서는 이전 단계에서 준비한 암호화 키를 제공합니다. 암호화된 난스(nonce) 및 요청을 확인하는 데 필요한 IV 값도 제공합니다. 마지막으로 extractable로 설정된 false 값이 엔벨로프 암호화에 사용할 수 있는 서비스에서 루트 키로 새 키를 지정합니다.

      API 요청이 암호화 토큰 만료 오류와 함께 실패한 경우 새 가져오기 토큰을 작성하려면 1단계로 돌아가기를 수행하십시오. 가져오기 토큰 및 연관된 공개 키는 작성 시 지정하는 정책에 따라 만료됩니다.

    • IBM Key Protect CLI 사용

      ibmcloud kp key create new-imported-key --key-material "$ENCRYPTED_KEY" --encrypted-nonce "$ENCRYPTED_NONCE" --iv "$IV" --sha1 -o json > createRootKeyResponse.json
      

      뒤에서 Hyper Protect Crypto Services는 TLS 1.2 연결을 통해 암호화된 패킷을 수신합니다. 하드웨어 보안 모듈에서 시스템은 개인 키를 사용하여 대칭 키를 복호화합니다. 마지막으로 시스템은 대칭 키 및 IV를 사용하여 난스(nonce)를 복호화하고 요청을 확인합니다. 키는 이제 위조가 방지된 FIPS 140-2 레벨 4 확인 하드웨어 보안 모듈에 저장됩니다.

  3. 키에 대한 세부사항을 확인하십시오.

    jq '.' createRootKeyResponse.json
    

    다음 스니펫은 예제 출력을 보여줍니다.

    {
      "metadata": {
        "collectionType": "application/vnd.ibm.kms.key+json",
        "collectionTotal": 1
      },
      "resources": [
        {
          "id": "644cba65-e240-471f-8b84-14115447d2ae",
          "type": "application/vnd.ibm.kms.key+json",
          "name": "encrypted-root-key",
          "state": 1,
          "crn": "crn:v1:bluemix:public:hs-crypto:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:346d9f67-4bb2-481e-a3e1-3c2c646aa886:key:644cba65-e240-471f-8b84-14115447d2ae",
          "extractable": false,
          "imported": true
        }
      ]
    }
    
    • id 값은 해당 키에 지정되어 키 관리 서비스 API에 대한 후속 호출 시 사용되는 고유 ID입니다.

    • 1로 설정된 state 값은 키가 이제 활성 키 상태 에 있음을 표시합니다.

    • crn 값에는 리소스가 IBM Cloud 내에 상주하는 위치를 지정하는 키에 대한 전체 범위 경로를 제공합니다.

    • 마지막으로 extractableimported 값은 서비스에 가져온 루트 키로 이 리소스에 대해 설명합니다. extractable 속성을 true(으)로 설정하면 서비스는 키를 앱 또는 서비스에 저장할 수 있는 표준 키로 지정합니다. 그렇지 않고 extractable 속성을 false(으)로 설정하면 서비스가 키를 루트 키로 지정합니다.

  4. 선택사항: 키를 확인 및 관리하려면 Hyper Protect Crypto Services 대시보드로 이동하십시오.

    애플리케이션 세부사항 페이지에서 키의 일반 특성을 찾아볼 수 있습니다. 키 관리 옵션(예: 키 순환 또는 키 삭제)에서 선택하십시오.

정리

  1. 이전 단계에서 가져온 암호화 키의 ID를 수집하십시오.

    ROOT_KEY_ID=$(jq -r '.resources[].id' createRootKeyResponse.json)
    
  2. Hyper Protect Crypto Services 서비스 인스턴스에 암호화된 키를 제거하십시오.

    • API 사용

      curl -X DELETE $HPCS_API_URL/api/v2/keys/$ROOT_KEY_ID \
        -H "Accept: application/vnd.ibm.collection+json" \
        -H "Authorization: $ACCESS_TOKEN" \
        -H "Bluemix-Instance: $INSTANCE_ID" | jq .
      
    • IBM Key Protect CLI 사용

      ibmcloud kp key delete {ROOT_KEY_ID}
      
  3. 이 튜토리얼과 관련된 모든 로컬 파일을 제거하십시오.

    rm kms-encrypt-nonce *.json *.bin *.pem
    
  4. 이 튜토리얼에 대해 작성한 테스트 디렉토리를 삭제하십시오.

    cd .. && rm -r hs-crypto-test
    
  5. 선택사항: Hyper Protect Crypto Services 서비스 인스턴스를 제거하십시오.

    ibmcloud resource service-instance-delete import-keys-demo
    

    서비스 인스턴스에서 더 많은 테스트 키를 작성한 경우 인스턴스를 디프로비저닝하기 전에 서비스 인스턴스에서 암호화 키를 제거해야 합니다.

다음 단계

이 학습서에서는 Hyper Protect Crypto Services 키 관리 서비스 API를 설정하고, 암호화 키를 작성하고, 암호화된 키를 Hyper Protect Crypto Services 서비스 인스턴스로 안전하게 가져오는 방법에 대해 설명합니다.