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

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

SSH 시크릿 엔진을 Vault의 중앙 추상화 계층인 관리 키(managed keys) 에 연결하면 암호화 작업을 신뢰할 수 있는 외부 KMS 또는 HSM에 위임할 수 있습니다. 이를 통해 개인 키 자료의 처리·저장·상호작용에 Vault 외부의 키 관리 시스템을 활용할 수 있습니다. 서명된 인증서(signed certificates) 방식으로 생성된 SSH CA의 개인 키 쌍을 HSM에 저장하고, 서명 작업도 HSM에 위임할 수 있습니다.

출처: 문서

본문

요구사항

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

  • 실행 중인 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 토큰과 함께 pkcs11 사용하기. 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/ssh-CA-key \
    library=myhsm \
    slot=4 \
    pin=12345678 \
    key_label="hsm-CA-key" \
    allow_generate_key=true \
    mechanism=0x0001 \
    allow_store_key=true \
    key_bits=4096 \
    any_mount=false

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

Success! Data written to: sys/managed-keys/pkcs11/ssh-CA-key
  1. 키를 다시 읽어 이름 있는 관리 키가 성공적으로 생성됐는지 확인하기.
$ vault read sys/managed-keys/pkcs11/ssh-CA-key
Key                 Value
---                 -----
UUID                686d9bef-a13d-4d8a-edbe-293b22c6eec6
allow_generate_key  true
allow_replace_key   false
allow_store_key     true
any_mount           false
key_bits            4096
key_label           hsm-CA-key
library             myhsm
mechanism           1
name                ssh-CA-key
pin                 redacted
slot                4
type                pkcs11
usages              [3 4]

SSH 시크릿 엔진 구성하기

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

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

  1. SSH CA를 관리 키를 사용하도록 구성하기.
$ vault write ssh-client-signer/config/ca managed_key_name="ssh-CA-key"
Success! Data written to: ssh-client-signer/config/ca

이 단계에서 SSH CA를 관리 키로 구성하면서 RSA 4096 공개·개인 키 쌍이 생성되며, 키 라벨은 hsm-CA-key입니다.

  1. HSM 내부에 생성된 CA의 개인 키 읽기.
$ vault read ssh-client-signer/config/ca
Key          Value
---          -----
public_key   ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChGcB66LAVB9FEPS0tJSiV6r/jBS8rUls7CWelMnMfGn9tPJrl0rzBtAhrcjfiPhMd/bh7dYvAQhVvggo1M83owVsAljGoKbeHbL6qg73vO7mDJAWz1MpDetJwkC1QJKsXaE6WT6vjIFnRy2tnQ9mxP6mjRYCYSa0AMuyjMuh9L6ZRJ5Msrf8LJqkrklkr2QBuxyrMZhZqQHpar+rkTccXU2s3as8IQIWBEaYIGN7o3Og1zAH4r7OeyKAft58WhkCwU3y9gmBD4UTrz8Ohs3liAw3DuLTJ5JdWK0I4QPsx2+cB2sTz+2/Dsy+ip0CpjhzY8PpbIYXuLlTb5kxwsNrWXvtX86TVFqpnX5FadOeNnF3XWGJmECElFeaFQv4pH/0P+wg67Sx3cqq3vGKjxW4gKcn9B7cPp8rgCS9UKl/S8Vg3KTLCr/KFsyIrv/m4C0Yu2Yp88GiLz9Q4QuUOowsi/PoMpSH1W57sn8rM/zxMzjIWu2scqSNy29seAhJl0YOtuUhbep4+3/lChvVdqTPpfi5UzWsaawTF5S3AB0DD2ehEw6P7ZU78vGo5I+Pod+As6qEDdmcIXDR0IHcnXII2MqoTEjoHU6NiHR2RpHkRmRlGHy7HAQ/vqdEPuF1X0WjfH/l8fMRyq0v75GFiYcfbNWCGRlZFjyt3Tk3nEH7cZw==
  1. 공개 키를 모든 대상 호스트의 SSH 구성에 추가하기. 이 과정은 수동이거나 구성 관리 도구로 자동화할 수 있습니다. 공개 키는 API로 접근할 수 있으며 인증이 필요하지 않습니다.
$ curl -o /etc/ssh/trusted-user-ca-keys.pem http://127.0.0.1:8200/v1/ssh-client-signer/public_key
$ vault read -field=public_key ssh-client-signer/config/ca > /etc/ssh/trusted-user-ca-keys.pem

공개 키 내용이 저장된 경로를 SSH 구성 파일에 TrustedUserCAKeys 옵션으로 추가하세요.

# /etc/ssh/sshd_config
# ...
TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem

변경 사항을 반영하려면 SSH 서비스를 다시 시작하세요.

  1. 클라이언트 키 서명을 위한 이름 있는 Vault 역할 생성하기.
$ vault write ssh-client-signer/roles/sshrole -<<EOH
{
  "algorithm_signer": "rsa-sha2-256",
  "allow_user_certificates": true,
  "allowed_users": "*",
  "allowed_extensions": "permit-pty,permit-port-forwarding",
  "default_extensions": {
    "permit-pty": ""
  },
  "key_type": "ca",
  "ttl": "30m0s"
}
EOH

클라이언트 SSH 인증

다음 단계는 Vault가 관리하는 머신에 인증하려는 클라이언트(사용자)가 수행합니다. 이러한 명령은 대개 클라이언트의 로컬 워크스테이션에서 실행합니다.

  1. SSH 공개 키를 찾거나 생성하기. 대개 ~/.ssh/id_rsa.pub입니다. SSH 키 쌍이 없으면 생성합니다.
$ ssh-keygen -t rsa -C "[email protected]"
  1. Vault에 공개 키 서명을 요청하기. 이 파일은 대개 .pub으로 끝나고 내용은 ssh-rsa ...로 시작합니다.
$ vault write ssh-client-signer/sign/sshrole -<<EOH
{
  public_key=@$HOME/.ssh/id_rsa.pub,
  "valid_principals": "root"
}
EOH
Key            Value
---            -----
serial_number  c73f26d2340276aa
signed_key     [email protected] AAAAHHNzaC1...

결과에는 일련 번호(serial)와 서명된 키가 포함됩니다. 이 서명된 키는 또 다른 공개 키입니다.

  1. 결과로 나온 서명된 공개 키를 디스크에 저장하기. 필요에 따라 권한을 제한하세요.
$ vault write -field=signed_key ssh-client-signer/sign/my-role \
    public_key=@$HOME/.ssh/id_rsa.pub > signed-cert.pub

인증서를 SSH 키 쌍 바로 옆에 저장한다면 이름을 -cert.pub 접미사로 붙이세요(~/.ssh/id_rsa-cert.pub). 이 명명 규칙을 사용하면 OpenSSH가 인증 중 자동으로 사용합니다.

  1. 서명된 키로 호스트 머신에 SSH 접속하기. Vault에서 받은 서명된 공개 키와 해당 개인 키를 모두 SSH 호출의 인증으로 제공해야 합니다.
$ ssh -i signed-cert.pub -i ~/.ssh/id_rsa [email protected]

참고 자료

  • Signed SSH certificates
  • SSH 시크릿 엔진 (API)
  • /sys/managed-keys 엔드포인트

더 알아보기 (Learn more)