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 설정
- 관리 키 구성하기. PKCS#11 HSM은 Vault가 HSM과 통신하도록 구성하기 위한 공유 라이브러리가 필요합니다. 이 라이브러리를 선언하려면 Vault 서버 구성을 편집해
kms_library스탠자를 추가하세요.
kms_library "pkcs11" {
name = "myhsm"
library = "/usr/vault/lib/libCryptoki2_64.so"
}
- 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"
}
- SIGHUP으로 Vault 구성 다시 시작하거나 재로드하기.
$ kill -HUP $(pidof vault)
- 관리 키 구성하기. 각 관리 키는 유형별 구성이 필요합니다. 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
- 키를 다시 읽어 이름 있는 관리 키가 성공적으로 생성됐는지 확인하기.
$ 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 시크릿 엔진 구성하기
ssh-client-signer경로에 SSH 시크릿 엔진 활성화하기.
$ vault secrets enable -path=ssh-client-signer ssh
Success! Enabled the ssh secrets engine at: ssh-client-signer/
- 시크릿 엔진을 관리 키를 사용하도록 튜닝하기.
$ 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에 대한 접근 권한을 부여합니다.
- 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입니다.
- 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==
- 공개 키를 모든 대상 호스트의 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 서비스를 다시 시작하세요.
- 클라이언트 키 서명을 위한 이름 있는 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가 관리하는 머신에 인증하려는 클라이언트(사용자)가 수행합니다. 이러한 명령은 대개 클라이언트의 로컬 워크스테이션에서 실행합니다.
- SSH 공개 키를 찾거나 생성하기. 대개
~/.ssh/id_rsa.pub입니다. SSH 키 쌍이 없으면 생성합니다.
$ ssh-keygen -t rsa -C "[email protected]"
- 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)와 서명된 키가 포함됩니다. 이 서명된 키는 또 다른 공개 키입니다.
- 결과로 나온 서명된 공개 키를 디스크에 저장하기. 필요에 따라 권한을 제한하세요.
$ 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가 인증 중 자동으로 사용합니다.
- 서명된 키로 호스트 머신에 SSH 접속하기. Vault에서 받은 서명된 공개 키와 해당 개인 키를 모두 SSH 호출의 인증으로 제공해야 합니다.
$ ssh -i signed-cert.pub -i ~/.ssh/id_rsa [email protected]
참고 자료
- Signed SSH certificates
- SSH 시크릿 엔진 (API)
/sys/managed-keys엔드포인트