튜토리얼: 암호화 키 작성 및 가져오기
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. 또한 컴퓨터에 로컬로 설치된 openssl
및 jq
패키지가 필요합니다.
-
다음 IBM Cloud 계정.
-
사용자 운영 체제에 대한 운영 체제에 대한 IBM Cloud 기본 CLI.
-
키 관리를 시작하도록 Key Protect CLI 플러그인 을 구성하고 설정하십시오. 이전에 나열된 처음 두 단계를 이미 완료한 경우에는 이 학습서로 돌아가기 전에 링크의 3단계부터 시작하십시오.
-
암호화 라이브러리를 다운로드하여 설치하세요 OpenSSL 암호화 라이브러리를 다운로드하여 설치합니다.
openssl
명령을 사용하여 로컬 컴퓨터에 암호화 키를 생성할 수 있으며 처음으로 Key Protect를 사용하는 경우에 해당합니다. 이 튜토리얼에서는 OpenSSL 버전1.0.2r
이상이 필요합니다.Mac을 사용하는 경우 다음을 사용하여 OpenSSL 을 다운로드할 수 있습니다 홈브루. 처음 패키지를 설치하는 경우에는
brew install openssl
을 실행하고, 기존 패키지를 최신 버전으로 업그레이드하려면brew upgrade openssl
을 실행하십시오. -
Jq를 다운로드하여 설치합니다.
jq
을(를) 사용하면 JSON 데이터를 분할할 수 있습니다. 이 학습서의jq
을(를) 사용하여 다음 Key Protect API.
1단계. Key Protect 인스턴스 작성
IBM Cloud 계정을 설정한 후 다음 단계를 완료하여 Key Protect 인스턴스.
-
터미널 창에서 다음 명령을 실행하여 IBM Cloud에 IBM Cloud CLI.
ibmcloud login
로그인에 실패하면
ibmcloud login --sso
명령을 실행하여 다시 시도하십시오.--sso
매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오. -
계정 및 리소스 그룹을 선택하십시오. 여기에 Key Protect 인스턴스에 저장되는 루트 키를 사용하십시오.
이 튜토리얼에서는 워싱턴 DC 지역과 상호 작용합니다. 다른 지역에 로그인한 경우 다음 명령을 실행하여 워싱턴 DC를 대상 지역으로 설정해야 합니다.
ibmcloud target -r us-east
-
해당 계정 및 리소스 그룹 내에 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 계정에 대한 비용을 부과하지 않습니다.
-
선택사항: 사용 가능한 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와 상호작용을 시작하는 데 필요한 인증 신임 정보를 수집합니다. 이후 단계를 위해 인증 정보를 검색하고 준비하려면, 인증 정보를 터미널의 환경 변수로 설정하십시오.
-
터미널 창에서 환경 변수로 Key Protect API 엔드포인트를 설정하십시오.
export KP_API_URL=https://<region>.kms.cloud.ibm.com
-
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 액세스 토큰 검색에 대해 자세히 알아보려면, 액세스 토큰 검색을 참조하십시오. -
다음 Key Protect 인스턴스와 연관된 ID를 검색한 후 해당 값을 환경 변수로 설정하십시오.
export INSTANCE_ID=`ibmcloud resource service-instance "import-keys-demo" --output json | jq -r '.[].guid'`
-
선택사항: 터미널 화면에 환경 변수를 출력하여 환경 변수가 올바르게 설정되었는지 확인하십시오.
$ 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 인스턴스에 대한 가져오기 토큰을 작성합니다. 지정하는 정책을 기반으로 가져오기 토큰을 작성하여 서비스로 이동하는 중에 암호화 키에 대한 추가 보안을 사용으로 설정합니다.
-
터미널 세션을 사용하여 새
key-protect-test
디렉토리로 변경하십시오.mkdir key-protect-test && cd key-protect-test
이 디렉토리를 사용하여 이후 단계에 대한 파일을 저장합니다.
-
가져오기 토큰을 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분)로 설정하고 만기 시간 내에 해당 토큰의 검색을 한 번만 허용합니다.
-
가져오기 토큰에 대한 세부사항을 보십시오.
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 서비스.
가져오기 토큰 컨텐츠를 검색하려면 다음을 수행하십시오.
-
이전 단계에서 생성한 가져오기 토큰을 검색한 후 응답을 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
-
선택사항: 가져오기 토큰의 컨텐츠 검사
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
값은 서비스에 대한 요청의 원본성을 확인하는 데 사용됩니다. 이후 단계에서 암호화 키를 가져올 때 이 값을 암호화하여 제공해야 합니다. -
공개 키를 디코딩하고
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)에서 지원하는 조직의 내부 키 관리 시스템을 사용하여 키를 작성하고 내보낼 수 있습니다.
-
터미널 창에서 다음
openssl
명령을 실행하여 256비트 암호화 키를 작성하십시오.openssl rand 32 > PlainTextKey.bin
성공! 이제 암호화 키가 다음과 같은 파일에 저장됩니다
PlainTextKey.bin
. 다음 단계를 계속하십시오.
6단계. 난스(nonce) 암호화
수신하는 비트가 요청의 일부로 전송하는 비트와 정확히 동일한지 확인하려면 Key Protect가 해당 서비스에 대칭 키를 업로드할 때 난스(nonce) 값 검증이 필요합니다.
암호화에서 난스(nonce)는 악의적인 공격 및 권한 없는 호출로부터 보호하기 위해 요청의 원본을 확인하는 세션 토큰의 역할을 합니다. 다음 Key Protect에 의해 분배된 동일한 난스를 사용하면 키 업로드 요청이 유효한지 확인하는 데 도움이 됩니다. 난스(nonce)는 서비스에 가져올 동일한 키를 사용하여 암호화되어야 합니다.
난스(nonce) 값을 암호화하려면 다음을 수행하십시오.
-
이전 단계에서 생성한 키를 인코딩하고 인코딩된 값을 환경 변수로 설정하십시오.
KEY_MATERIAL=$(base64 PlainTextKey.bin)
-
4단계에서 검색한 난스(nonce) 값을 수집하십시오.
NONCE=$(jq -r '.nonce' getImportTokenResponse.json)
-
다음을 실행하여 5단계에서 생성한 암호화 키로 난스 값을 암호화하십시오. 그런 다음 응답을 다음과 같은 파일에 저장합니다
EncryptedValues.json
.ibmcloud kp import-token nonce-encrypt -k $KEY_MATERIAL -n $NONCE --output json > EncryptedValues.json
-
선택사항: 표시된 대로
jq
을(를) 사용하여 JSON 파일의 컨텐츠를 검사하십시오.jq '.' EncryptedValues.json
다음 단계를 위해 제공해야 하는 값이 출력에 표시됩니다. 다음 스니펫은 잘린 값이 포함된 출력 예를 보여줍니다.
{ "encryptedNonce": "DVy/Dbk37X8gSVwRA5U6vrHdWQy8T2ej+riIVw==", "iv": "puQrzDX7gU1TcTTx" }
encryptedNonce
값은 OpenSSL을 사용하여 생성한 암호화 키로 랩핑된(또는 암호화된) 원래의 난스(nonce)를 표시합니다. 다음iv
값은 AES- 알고리즘에 의해 생성되는 초기화 벡터(IV)입니다 GCM 알고리즘에 의해 생성되며 나중에 필요한 값입니다 Key Protect에서 난스 값을 복호화할 수 있도록 나중에 필요합니다.
7단계. 키 암호화
다음으로, Key Protect에 의해 분배된 공용 키를 사용하여 OpenSSL로 생성한 대칭 키를 암호화하십시오.
-
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 update
와brew 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.
키를 가져오려면 다음을 수행하십시오.
-
암호화된 키, 암호화된 난스(nonce) 및 초기화 벡터(IV) 값을 수집하십시오.
ENCRYPTED_KEY=$(openssl enc -base64 -A -in EncryptedKey.bin)
ENCRYPTED_NONCE=$(jq -r '.encryptedNonce' EncryptedValues.json)
IV=$(jq -r '.iv' EncryptedValues.json)
-
암호화된 키를 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단계로 돌아가서 새 가져오기 토큰을 작성하십시오. 가져오기 토큰 및 연관된 공개 키는 작성 시 지정하는 정책에 따라 만료됩니다.
-
암호화 키에 대한 세부사항을 보십시오.
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 내에 상주하는 위치를 지정하는 키에 대한 전체 범위 경로를 제공합니다. 마지막으로extractable
및imported
값은 서비스에 가져온 루트 키로 이 리소스에 대해 설명합니다. -
선택사항: 다음 Key Protect 대시보드로 이동하여 암호화 키를 확인하고 관리할 수 있습니다.
애플리케이션 세부사항 페이지에서 키의 일반 특성을 찾아볼 수 있습니다. 키 관리 옵션(예: 키 순환 또는 키 삭제)에서 선택하십시오.
9단계. 정리
-
이전 단계에서 가져온 암호화 키의 ID를 수집하십시오.
ROOT_KEY_ID=$(jq -r '.resources[].id' createRootKeyResponse.json)
-
암호화 키를 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 .
-
이 튜토리얼과 연관된 모든 로컬 파일을 제거하십시오.
rm *.json *.bin *.pem
-
이 튜토리얼에 대해 작성한 테스트 디렉토리를 삭제하십시오.
cd .. && rm -r key-protect-test
-
선택사항: Key Protect 서비스 인스턴스를 제거하십시오.
ibmcloud resource service-instance-delete import-keys-demo
더 많은 테스트 키를 Key Protect 인스턴스에 작성한 경우 인스턴스를 삭제하거나 디프로비저닝하기 전에 인스턴스에서 모든 암호화 키를 제거해야 합니다.
다음 단계
이 학습서에서는 Key Protect API를 설정하고, 암호화 키를 작성하고, 암호화된 키를 Key Protect 인스턴스에 저장되는 루트 키를 사용하십시오.
-
저장 데이터 보호를 위한 루트 키 사용에 대해 자세히 알아보십시오.
-
지원되는 클라우드 서비스 전체에 루트 키를 배치하십시오.
-
자세히 알아보기 - Key Protect API