transit 시크릿 엔진을 관리 키로 PKCS 11 HSM 구성하기

transit 시크릿 엔진을 관리 키로 PKCS 11 HSM 구성하기

transit 시크릿 엔진을 Vault의 중앙 추상화 계층인 관리 키(managed keys) 에 연결하면 암호화 작업을 신뢰할 수 있는 외부 KMS 또는 HSM에 위임할 수 있습니다. 이를 통해 개인 키 자료의 처리·저장·상호작용에 Vault 외부의 키 관리 시스템을 활용할 수 있습니다.

출처: 문서

본문

요구사항

PKCS 11 기반 HSM으로 transit 시크릿 엔진을 구성하려면 다음이 필요합니다.

  • 실행 중인 Vault Enterprise 서버
  • PKCS 11 기반 HSM

Vault 설정

  1. 관리 키 구성하기. PKCS#11 HSM은 Vault가 HSM과 통신하도록 구성하기 위한 공유 라이브러리가 필요합니다. 이 라이브러리를 선언하려면 Vault 서버 구성을 편집해 kms_library 스탠자를 추가하세요.
kms_library "pkcs11" {
  name = "myhsm"
  library = "/usr/vault/lib/libCryptoki2_64.so"
}
  1. IBM EP11 토큰과 함께 PKCS 11 사용하기. LinuxOne 및 Linux on IBM Z 인스턴스에서 Crypto Express 어댑터를 활성화하고 EP11 토큰을 사용하도록 구성해야 하며, EP11 토큰과 통신할 수 있는 opencryptoki도 설치해야 합니다. 자세한 내용은 IBM EP11 Token 페이지를 참고하세요.
kms_library "pkcs11" {
  name = "myhsm"
  library = "/usr/local/lib/opencryptoki/libopencryptoki.so"
}
  1. SIGHUP으로 Vault 구성 다시 시작하거나 재로드하기.
$ kill -HUP $(pidof vault)
  1. 관리 키 구성하기. 각 관리 키는 유형별 구성이 필요합니다. HSM에 접근하기 위한 키의 위치와 PIN을 지정해야 합니다. 이는 Vault의 PKCS#11 자동 봉인 해제 메커니즘과 매우 유사합니다.
$ vault write sys/managed-keys/pkcs11/transit-rsa-key \
    library=myhsm \
    slot=4 \
    pin=12345678 \
    key_label="vault-rsa-key" \
    allow_generate_key=true \
    mechanism=0x0001 \
    allow_store_key=true \
    key_bits=2048 \
    any_mount=false

PKCS#11 전용 매개변수는 이전에 구성한 kms_library 스탠자를 가리키는 library, slot, pin, key_label, 그리고 키를 보유할 HSM의 개체를 식별하는 mechanism입니다. 그 메커니즘은 CKM_RSA_PKCS(PKCS#11 v1.5 서명이 있는 RSA)이며 2048비트 키가 필요합니다. allow_generate_key 플래그는 Vault가 HSM에 키 생성을 요청할 수 있음을 나타냅니다. allow_store_key 매개변수는 새 키를 백엔드에 저장할 수 있음을 나타냅니다. 이 플래그가 없으면 HSM에서 키를 직접 구성하고 Vault가 그 결과를 가리키도록 할 수 있습니다. any_mount는 네임스페이스의 모든 마운트가 관리 키에 접근할 수 있음을 의미합니다. 이 예시에서는 false로 설정해 관리 키 접근을 특정 마운트로 잠그는 방법을 보여줍니다.

Success! Data written to: sys/managed-keys/pkcs11/transit-rsa-key
  1. 키를 다시 읽어 이름 있는 관리 키가 성공적으로 생성됐는지 확인하기.
$ vault read sys/managed-keys/pkcs11/transit-rsa-key
Key                 Value
---                 -----
UUID                fe8f3c8c-8f11-571d-b4ce-411314fcaf98
allow_generate_key  true
allow_replace_key   false
allow_store_key     true
any_mount           false
key_bits            2048
key_label           vault-rsa-key
library             myhsm
mechanism           1
name                transit-rsa-key
pin                 redacted
slot                4
type                pkcs11
usages              [3 4]

transit 시크릿 엔진 구성하기

  1. transit 경로에 transit 시크릿 엔진 활성화하기.
$ vault secrets enable transit
Success! Enabled the transit secrets engine at: transit/
  1. 시크릿 엔진을 관리 키를 사용하도록 튜닝하기.
$ vault secrets tune --allowed-managed-keys=transit-rsa-key transit
Success! Tuned the secrets engine at: transit/

이전 단계에서 관리 키를 any_mount=false로 구성했습니다. 이 명령은 Transit 시크릿 엔진의 마운트에 transit-rsa-key에 대한 접근 권한을 부여합니다.

  1. transit 키 생성하기.
$ vault write transit/keys/hsm-transit-key \
    type=managed_key \
    managed_key_name=transit-rsa-key \
    allow_plaintext_backup=false \
    exportable=false
Key                    Value
---                    -----
allow_plaintext_backup false
auto_rotate_period     0s
deletion_allowed       false
derived                false
exportable             false
imported_key           false
latest_version         1
min_available_version  0
min_decryption_version 1
min_encryption_version 0
name                   hsm-transit-key
supports_decryption    true
supports_derivation    false
supports_encryption    true
supports_signing       true
type                   managed_key

이 단계에서 transit 키를 만들면서 HSM에 RSA 2048 공개·개인 키 쌍도 생성됩니다. 키 라벨은 vault-rsa-key입니다.

암호화 작업 수행하기

  1. 데이터 서명 작업 수행하기.
$ vault write transit/sign/hsm-transit-key \
    input=$(echo -n "data to sign" | base64) \
    hash_algorithm=sha2-256
Key          Value
---          -----
key_version  1
signature    vault:v1:bqLeknlTuvrPt99ubS0CZyDs5iG8q9n+7kLG+2qHmg1xcHxUdKYCvtIUO5ZpCjJ6SUA/cTJgeFqdhK5rOcSfTzhU5B+HABEYeVb+H7yQ4+sLWrJQ5fNAQZCly+AiXM4q2lAvMW651oq0D4R86f0tOUHVjsaQyqhrrtaA1GQoIcNikx4llTXiGRmc3A1dZmpFCpG7ejQuUF8mGj1tFmY/dyrV0V9o58rmqGe/ddfg+bAfpewNcqWPoWtB+o9QuFhw3L8eqxVCbF8lGfZlqJmudep13So4bC03bWdlZBET8nYpX51Bi5yz0C9wth666IiqE61JnPBlmcJFEyd3FCJ4yQ==
  1. 서명된 데이터 검증하기.
$ vault write transit/verify/hsm-transit-key \
    input=$(echo -n "data to sign" | base64) \
    hash_algorithm=sha2-256 \
    signature="vault:v1:..."

signature는 서명 명령의 출력입니다.

Key     Value
---     -----
valid   true

참고 자료

  • Encrypt data in transit with Vault
  • Transit 시크릿 엔진
  • Transit 시크릿 엔진 (API)
  • /sys/managed-keys 엔드포인트

더 알아보기 (Learn more)