IBM Cloud Docs
튜토리얼: 암호화 키 작성 및 가져오기

튜토리얼: 암호화 키 작성 및 가져오기

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

조직의 보안 전문가는 항상 클라우드에서 저장 데이터의 보안을 강화하는 방법을 찾고 있습니다.

엄격한 데이터 통제 및 규제 감사 요구사항을 준수하기 위해 암호화 키에 대한 세분화된 액세스 제어, 감사 추적 기능 및 온프레미스에서 생성하는 암호화 키를 업로드하기 위한 유연한 옵션을 제공하는 키 관리 서비스와 앱을 통합하려고 합니다.

Key Protect를 사용하면 내부 키 관리 시스템을 통해 암호화 키를 작성한 후 클라우드에서 사용하도록 해당 키를 업로드할 수 있습니다.

진행 중인 보안 요구사항에 따라 키를 업로드하는 여러 가지 옵션 중에서 선택할 수 있습니다. 암호화 키의 라이프사이클을 관리할 때 Cloud Identity and Access Management를 사용하여 리소스에 대한 액세스를 제어하고 IBM Cloud Logs를 사용하여 서비스에 대한 API 활동을 모니터합니다.

이 튜토리얼에서는 가져오기 토큰을 통해 Key Protect에 암호화 키를 업로드합니다. 키를 Key Protect로 가져오기 위한 옵션에 대해 자세히 알아보려면 키 자료 가져오기 사전 계획을 참조하십시오.

가져오기 토큰 없이 키 가져오기를 알아보려면 루트 키 가져오기를 참조하십시오.

목표

이 튜토리얼에서는 암호화 키를 작성하고 Key Protect 서비스로 안전하게 가져오는 방법을 설명합니다. 다음은 Key Protect를 처음 사용하지만 키 관리 시스템에 대해서는 어느 정도 알고 있을 수 있는 사용자를 대상으로 합니다. 다음 단계를 완료하려면 약 20분이 걸립니다.

  • Key Protect CLI 설정

  • 키 가져오기를 시작하기 위해 Key Protect 서비스 인스턴스 준비

  • OpenSSL 암호화 툴킷을 사용하여 키 작성 및 암호화

  • 암호화된 키를 Key Protect 인스턴스

이 학습서는 IBM Cloud 계정.

시작하기 전에

시작하려면 다음에서 프로비저닝하는 서비스와 상호작용할 수 있도록 IBM Cloud CLI가 필요합니다. IBM Cloud. 또한 컴퓨터에 로컬로 설치된 openssljq 패키지가 필요합니다.

  1. 다음 IBM Cloud 계정.

  2. 사용자 운영 체제에 대한 운영 체제에 대한 IBM Cloud 기본 CLI.

  3. 키 관리를 시작하도록 Key Protect CLI 플러그인 을 구성하고 설정하십시오. 이전에 나열된 처음 두 단계를 이미 완료한 경우에는 이 학습서로 돌아가기 전에 링크의 3단계부터 시작하십시오.

  4. 암호화 라이브러리를 다운로드하여 설치하세요 OpenSSL 암호화 라이브러리를 다운로드하여 설치합니다.

    openssl 명령을 사용하여 로컬 컴퓨터에 암호화 키를 생성할 수 있으며 처음으로 Key Protect를 사용하는 경우에 해당합니다. 이 튜토리얼에서는 OpenSSL 버전 1.0.2r 이상이 필요합니다.

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

  5. Jq를 다운로드하여 설치합니다.

    jq을(를) 사용하면 JSON 데이터를 분할할 수 있습니다. 이 학습서의 jq을(를) 사용하여 다음 Key Protect API.

1단계. Key Protect 인스턴스 작성

IBM Cloud 계정을 설정한 후 다음 단계를 완료하여 Key Protect 인스턴스.

  1. 터미널 창에서 다음 명령을 실행하여 IBM Cloud에 IBM Cloud CLI.

    ibmcloud login
    

    로그인에 실패하면 ibmcloud login --sso 명령을 실행하여 다시 시도하십시오. --sso 매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오.

  2. 계정 및 리소스 그룹을 선택하십시오. 여기에 Key Protect 인스턴스에 저장되는 루트 키를 사용하십시오.

    이 튜토리얼에서는 워싱턴 DC 지역과 상호 작용합니다. 다른 지역에 로그인한 경우 다음 명령을 실행하여 워싱턴 DC를 대상 지역으로 설정해야 합니다.

    ibmcloud target -r us-east
    
  3. 해당 계정 및 리소스 그룹 내에 Key Protect의 인스턴스를 프로비저닝하십시오.

    먼저 다음을 실행하여 인스턴스에 대한 자원 그룹을 지정하십시오.

    ibmcloud target -g <your-resource-group>
    

    예를 들어, 다음과 같습니다. ibmcloud target -g Default

    그런 다음 다음을 실행하여 인스턴스를 작성할 수 있습니다.

    ibmcloud resource service-instance-create "import-keys-demo" kms tiered-pricing us-east
    

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

  4. 선택사항: 사용 가능한 Key Protect 인스턴스를 나열하여 Key Protect 인스턴스가 작성되었는지 확인하십시오.

    ibmcloud resource service-instances
    

    성공! 이제 암호화 키를 저장 및 관리할 수 있는 Key Protect 인스턴스가 설정되었습니다. 다음 단계를 계속하십시오.

2단계. Key Protect API 설정

이제 다음 Key Protect의 인스턴스가 프로비저닝되었으며 API 사용을 시작할 준비가 되었습니다.

Key Protect는 암호화 키를 생성, 추적 및 관리하는 그래픽 사용자 인터페이스와 REST API를 제공합니다. 다음 Key Protect API는 서비스를 인증하는 데 IBM Cloud IAM 토큰 및 인스턴스 ID가 필요합니다.

이 단계에서는 IBM Cloud CLI를 사용하여 Key Protect API와 상호작용을 시작하는 데 필요한 인증 신임 정보를 수집합니다. 이후 단계를 위해 인증 정보를 검색하고 준비하려면, 인증 정보를 터미널의 환경 변수로 설정하십시오.

  1. 터미널 창에서 환경 변수로 Key Protect API 엔드포인트를 설정하십시오.

    export KP_API_URL=https://<region>.kms.cloud.ibm.com
    
  2. IBM Cloud 액세스 토큰은 Key Protect CLI 플러그인을 사용하여 생성할 수 있으며 이를 환경 변수로 설정하십시오.

    환경 변수는 권한 부여 유형으로 시작해야 합니다, Bearer. 예제에 표시된 대로 CLI 명령에는 올바른 유형이 자동으로 포함됩니다.

    export ACCESS_TOKEN=`ibmcloud iam oauth-tokens | grep IAM | cut -d \: -f 2 | sed 's/^ *//'`
    

    IBM Cloud 액세스 토큰은 1시간 동안 유효하지만 필요에 따라 재생성할 수 있습니다. 새 액세스 토큰을 생성하려면 다음을 실행하십시오. ibmcloud iam oauth-tokens명령의 JSON 키 및 값에 대한 설명입니다. 다음 IBM Cloud 액세스 토큰 검색에 대해 자세히 알아보려면, 액세스 토큰 검색을 참조하십시오.

  3. 다음 Key Protect 인스턴스와 연관된 ID를 검색한 후 해당 값을 환경 변수로 설정하십시오.

    export INSTANCE_ID=`ibmcloud resource service-instance "import-keys-demo" --output json | jq -r '.[].guid'`
    
  4. 선택사항: 터미널 화면에 환경 변수를 출력하여 환경 변수가 올바르게 설정되었는지 확인하십시오.

    $ echo $KP_API_URL
    https://us-east.kms.cloud.ibm.com
    $ echo $ACCESS_TOKEN
    Bearer eyJraWQiOiIyM...
    $ echo $INSTANCE_ID
    c1cf624b-6bed-4d4d-bd54-8e2534258a88
    

    성공! 이제 Key Protect API를 인증하는 데 필요한 서비스 인증 정보로 설정되었습니다. 다음 단계를 계속하십시오.

3단계. 가져오기 토큰 작성

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

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

  1. 터미널 세션을 사용하여 새 key-protect-test 디렉토리로 변경하십시오.

    mkdir key-protect-test && cd key-protect-test
    

    이 디렉토리를 사용하여 이후 단계에 대한 파일을 저장합니다.

  2. 가져오기 토큰을 Key Protect 인스턴스에 대해 작성한 후 해당 응답을 JSON 파일에 저장하십시오.

    $ curl -X POST \
        "$KP_API_URL/api/v2/import_token" \
        -H "accept: application/vnd.ibm.collection+json" \
        -H "authorization: $ACCESS_TOKEN" \
        -H "bluemix-instance: $INSTANCE_ID" \
        -H "content-type: application/json" \
        -d '{
                "expiration": 1200,
                "maxAllowedRetrievals": 1
            }' > createImportTokenResponse.json
    

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

  3. 가져오기 토큰에 대한 세부사항을 보십시오.

    jq '.' createImportTokenResponse.json
    

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

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

4단계. 가져오기 토큰 검색

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

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

이 단계에서는 가져오기 토큰과 연관된 공개 암호화 키 및 난스(nonce) 값을 검색합니다. 나중에 진행되는 단계에서 데이터를 암호화하려면 공개 키가 필요하며 Key Protect 서비스.

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

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

    $ curl -X GET \
        "$KP_API_URL/api/v2/import_token" \
        -H "accept: application/vnd.ibm.collection+json" \
        -H "authorization: $ACCESS_TOKEN" \
        -H "bluemix-instance: $INSTANCE_ID" > getImportTokenResponse.json
    
  2. 선택사항: 가져오기 토큰의 컨텐츠 검사

    jq '.' getImportTokenResponse.json
    

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

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

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

  3. 공개 키를 디코딩하고 PublicKey.pem이라는 파일에 저장히십시오.

    jq -r '.payload' getImportTokenResponse.json | base64 --decode -o PublicKey.pem
    

    이제 공개 키가 사용자의 컴퓨터에 PEM 형식으로 다운로드됩니다. 다음 단계를 계속하십시오.

5단계. 암호화 키 작성

Key Protect를 사용하면 IBM Cloud에서 사용하기 위해 고유 키를 작성하고 업로드하여 BYOK(Bring Your Own Key)의 보안 이점을 누릴 수 있습니다.

다음 단계에서는 256비트 AES 대칭 키를 사용자의 로컬 컴퓨터에 작성합니다.

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

  1. 터미널 창에서 다음 openssl 명령을 실행하여 256비트 암호화 키를 작성하십시오.

    openssl rand 32 > PlainTextKey.bin
    

    성공! 이제 암호화 키가 다음과 같은 파일에 저장됩니다 PlainTextKey.bin. 다음 단계를 계속하십시오.

6단계. 난스(nonce) 암호화

수신하는 비트가 요청의 일부로 전송하는 비트와 정확히 동일한지 확인하려면 Key Protect가 해당 서비스에 대칭 키를 업로드할 때 난스(nonce) 값 검증이 필요합니다.

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

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

  1. 이전 단계에서 생성한 키를 인코딩하고 인코딩된 값을 환경 변수로 설정하십시오.

    KEY_MATERIAL=$(base64 PlainTextKey.bin)
    
  2. 4단계에서 검색한 난스(nonce) 값을 수집하십시오.

    NONCE=$(jq -r '.nonce' getImportTokenResponse.json)
    
  3. 다음을 실행하여 5단계에서 생성한 암호화 키로 난스 값을 암호화하십시오. 그런 다음 응답을 다음과 같은 파일에 저장합니다 EncryptedValues.json.

    ibmcloud kp import-token nonce-encrypt -k $KEY_MATERIAL -n $NONCE --output json > EncryptedValues.json
    
  4. 선택사항: 표시된 대로 jq을(를) 사용하여 JSON 파일의 컨텐츠를 검사하십시오.

    jq '.' EncryptedValues.json
    

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

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

    encryptedNonce 값은 OpenSSL을 사용하여 생성한 암호화 키로 랩핑된(또는 암호화된) 원래의 난스(nonce)를 표시합니다. 다음 iv 값은 AES- 알고리즘에 의해 생성되는 초기화 벡터(IV)입니다 GCM 알고리즘에 의해 생성되며 나중에 필요한 값입니다 Key Protect에서 난스 값을 복호화할 수 있도록 나중에 필요합니다.

7단계. 키 암호화

다음으로, Key Protect에 의해 분배된 공용 키를 사용하여 OpenSSL로 생성한 대칭 키를 암호화하십시오.

  1. 4단계에서 검색한 공개 키를 사용하여 생성된 키를 암호화하십시오.

    openssl pkeyutl \
        -encrypt \
        -pubin \
        -keyform PEM \
        -inkey PublicKey.pem \
        -pkeyopt rsa_padding_mode:oaep \
        -pkeyopt rsa_oaep_md:sha256 \
        -in PlainTextKey.bin \
        -out EncryptedKey.bin
    

    매개변수 설정 오류가 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/ 위치에서 사용 가능한지 확인합니다. 계속해서 오류가 발생하면 이 예에 나열된 매개변수만 사용해야 합니다.

    성공! 이제 암호화된 키가 다음과 같은 파일에 저장됩니다 EncryptedKey.bin. 암호화된 키를 다음에 업로드하도록 설정이 완료되었습니다. Key Protect. 다음 단계를 계속하십시오.

8단계. 키 가져오기

이제 암호화된 키를 Key Protect API.

키를 가져오려면 다음을 수행하십시오.

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

    ENCRYPTED_KEY=$(openssl enc -base64 -A -in EncryptedKey.bin)
    
    ENCRYPTED_NONCE=$(jq -r '.encryptedNonce' EncryptedValues.json)
    
    IV=$(jq -r '.iv' EncryptedValues.json)
    
  2. 암호화된 키를 Key Protect 인스턴스에 대해 사용으로 설정하려면 curl 명령을 실행하십시오.

    $ curl -X POST \
        "$KP_API_URL/api/v2/keys" \
        -H "accept: application/vnd.ibm.collection+json" \
        -H "authorization: $ACCESS_TOKEN" \
        -H "bluemix-instance: $INSTANCE_ID" \
        -H "content-type: application/json" \
        -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_256",
                        "encryptedNonce": "'"$ENCRYPTED_NONCE"'",
                        "iv": "'"$IV"'"
                    }
                ]
            }' > createRootKeyResponse.json
    

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

    Key Protect는 TLS 1.2 또는 1.3 프로토콜을 통해 암호화된 패킷을 수신합니다. 하드웨어 보안 모듈에서 시스템은 개인 키를 사용하여 대칭 키를 복호화합니다. 마지막으로 시스템은 대칭 키 및 IV를 사용하여 난스(nonce)를 복호화하고 요청을 확인합니다.

    가져오기 토큰 만기 오류로 API 요청이 실패하면 3단계로 돌아가서 새 가져오기 토큰을 작성하십시오. 가져오기 토큰 및 연관된 공개 키는 작성 시 지정하는 정책에 따라 만료됩니다.

  3. 암호화 키에 대한 세부사항을 보십시오.

    jq '.' createRootKeyResponse.json
    

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

    {
        "metadata": {
            "collectionType": "application/vnd.ibm.kms.key+json",
            "collectionTotal": 1
        },
        "resources": [
            {
                "id": "02fd6835-6001-4482-a892-13bd2085f75d",
                "type": "application/vnd.ibm.kms.key+json",
                "name": "encrypted-root-key",
                "state": 1,
                "crn": "crn:v1:bluemix:public:kms:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:12e8c9c2-a162-472d-b7d6-8b9a86b815a6:key:02fd6835-6001-4482-a892-13bd2085f75d",
                "extractable": false,
                "imported": true
            }
        ]
    }
    

    id 값은 키에 지정되는 고유 ID이며 Key Protect API. 1로 설정된 state 값은 암호화 키가 현재 활성 키 상태임을 나타냅니다. crn 값에는 리소스가 IBM Cloud 내에 상주하는 위치를 지정하는 키에 대한 전체 범위 경로를 제공합니다. 마지막으로 extractableimported 값은 서비스에 가져온 루트 키로 이 리소스에 대해 설명합니다.

  4. 선택사항: 다음 Key Protect 대시보드로 이동하여 암호화 키를 확인하고 관리할 수 있습니다.

    이 이미지는 Key Protect 대시보드 보기를 표시합니다.

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

9단계. 정리

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

    ROOT_KEY_ID=$(jq -r '.resources[].id' createRootKeyResponse.json)
    
  2. 암호화 키를 Key Protect 인스턴스에 저장되는 루트 키를 사용하십시오.

    $ curl -X DELETE \
        "$KP_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 .
    
  3. 이 튜토리얼과 연관된 모든 로컬 파일을 제거하십시오.

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

    cd .. && rm -r key-protect-test
    
  5. 선택사항: Key Protect 서비스 인스턴스를 제거하십시오.

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

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

다음 단계

이 학습서에서는 Key Protect API를 설정하고, 암호화 키를 작성하고, 암호화된 키를 Key Protect 인스턴스에 저장되는 루트 키를 사용하십시오.