- 인쇄
- PDF
NKS 연동
- 인쇄
- PDF
Ncloud Kubernetes Service(NKS) 의 Pod에서 HSM에 연결하는 방법을 설명합니다.
NKS 연동은 Thales 공식 문서를 기반으로 작성했습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 Docker Container - Integration Guide를 참조해 주십시오.
지원 환경
HSM 과 NKS를 연동하기 위한 환경은 다음과 같습니다.
전제 조건
NKS 연동을 시작하기 전에 다음의 전제 조건을 준수해 주십시오.
- HSM 파티션의 초기설정 모두 완료
- NKS 구성이 모두 완료
Node HSM 연결 설정
InitScript 설정을 이용하여 Node에 HSM 연결을 설정합니다.
lunaclient, HSM 연결 설정 스크립트 실행
install_lunaclient_certs.sh
작성#!/bin/bash sudo apt update sudo apt install -y alien set -e ### [1] Luna Client 설치 및 설정 ### result=$(curl --silent --location --request GET 'https://fin-hardwaresecuritymodule.apigw.fin-ntruss.com/api/v1/client/configs?version=10.7.1') IFS=',' read -ra ADDR <<< "$result" DOWNLOAD_URL=${ADDR[0]} HSM1_URL=${ADDR[2]} HSM2_URL=${ADDR[3]} HSM3_URL=${ADDR[4]} WORK_DIR="$HOME" INSTALL_DIR="LunaClient_10.7.1-125_Linux" ARCHIVE_NAME="610-000397-010_SW_Linux_Luna_Client_V10.7.1_RevA.tar" cd "$WORK_DIR" || { echo "Error: Could not change to $WORK_DIR"; exit 1; } echo "Downloading Luna Client from $DOWNLOAD_URL..." wget -q "$DOWNLOAD_URL" -O "$ARCHIVE_NAME" || { echo "Error: Failed to download Luna Client"; exit 1; } echo "Extracting archive $ARCHIVE_NAME..." tar -xf "$ARCHIVE_NAME" || { echo "Error: Failed to extract archive"; exit 1; } rm -f "$ARCHIVE_NAME" cd "$INSTALL_DIR/64" || { echo "Error: Installation directory not found"; exit 1; } echo "Running installation script..." (echo y) | sudo sh install.sh -p network -c all || { echo "Error: Installation failed"; exit 1; } EULA_FILE="$WORK_DIR/$INSTALL_DIR/008-010068-001_EULA_HSM7_SW_revC.txt" if [[ -f "$EULA_FILE" ]]; then echo "Moving EULA file..." sudo mv "$EULA_FILE" /usr/safenet/lunaclient/ || { echo "Error: Failed to move EULA file"; exit 1; } else echo "Error: EULA file not found" exit 1 fi CERT_DIR="$WORK_DIR/$INSTALL_DIR/cert" for i in 1 2 3; do HSM_URL_VAR="HSM${i}_URL" CERT_FILE="$CERT_DIR/fin-hsm00${i}.pem" if [[ -f "$CERT_FILE" ]]; then echo "Adding VTL server for ${!HSM_URL_VAR}..." /usr/safenet/lunaclient/bin/vtl addServer -n "${!HSM_URL_VAR}" -c "$CERT_FILE" || { echo "Error: Failed to add server ${!HSM_URL_VAR}"; exit 1; } else echo "Error: Certificate file $CERT_FILE not found" exit 1 fi done cd "$WORK_DIR" || { echo "Error: Could not return to $WORK_DIR"; exit 1; } rm -rf "$INSTALL_DIR" ### [2] 클라이언트 인증서 및 개인키 직접 생성 ### CLIENT_CERT_DIR="/usr/safenet/lunaclient/cert/client" mkdir -p "$CLIENT_CERT_DIR" # 개인 키 생성 cat <<'EOF' > "$CLIENT_CERT_DIR/{privateKey}.pem" -----BEGIN RSA PRIVATE KEY----- ..... -----END RSA PRIVATE KEY----- EOF # 인증서 생성 cat <<'EOF' > "$CLIENT_CERT_DIR/{certificate}.pem" -----BEGIN CERTIFICATE----- ..... -----END CERTIFICATE----- EOF chmod 600 "$CLIENT_CERT_DIR/{privateKey}.pem" chmod 644 "$CLIENT_CERT_DIR/{certificate}.pem" ### [3] /etc/Chrystoki.conf 수정 ### CHRYSTOKI_CONF="/etc/Chrystoki.conf" if grep -q "ClientPrivKeyFile" "$CHRYSTOKI_CONF"; then sed -i "s|ClientPrivKeyFile *= *.*|ClientPrivKeyFile = $CLIENT_CERT_DIR/{privateKey}.pem;|" "$CHRYSTOKI_CONF" else sed -i "/LunaSA Client = {/a\ ClientPrivKeyFile = $CLIENT_CERT_DIR/{privateKey}.pem;" "$CHRYSTOKI_CONF" fi if grep -q "ClientCertFile" "$CHRYSTOKI_CONF"; then sed -i "s|ClientCertFile *= *.*|ClientCertFile = $CLIENT_CERT_DIR/{certificate}.pem;|" "$CHRYSTOKI_CONF" else sed -i "/LunaSA Client = {/a\ ClientCertFile = $CLIENT_CERT_DIR/{certificate}.pem;" "$CHRYSTOKI_CONF" fi echo "[SUCCESS] Luna Client 설치 및 인증서 설정 완료."
- initScript 등록
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-examples/main/examples/initscript/fin/fkr.yml
- daemonSet env 수정
kubectl --kubeconfig=$KUBE_CONFIG set env daemonset/init-script -n kube-system STARTUP_SCRIPT=$(base64 -i install_lunaclient_certs.sh -w 0)
스크립트 내에
{privateKey}.pem
,{certificate}.pem
은 HSM 연결에 사용된 값으로 대체해야 합니다.
스크립트가 성공적으로 수행되면 node 에서 HSM 으로 접근 가능한 상태가 됩니다.node 의 lunaclient 를 이용하여 HSM에 접근하는 pod
pod-with-lunaclient
을 생성합니다.lunaclient.yaml
작성apiVersion: v1 kind: Pod metadata: name: pod-with-lunaclient spec: containers: - name: pod-with-lunaclient image: registry.access.redhat.com/ubi8/ubi:latest # RHEL UBI 이미지 command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ] volumeMounts: - name: lunaclient-config mountPath: /etc/Chrystoki.conf readOnly: true - name: lunaclient mountPath: /usr/safenet/lunaclient env: - name: LC_ALL value: C volumes: - name: lunaclient-config hostPath: path: /etc/Chrystoki.conf type: File - name: lunaclient hostPath: path: /usr/safenet/lunaclient type: Directory
pod-with-lunaclient
생성kubectl --kubeconfig=$KUBE_CONFIG create -f lunaclient.yaml
위 설정은 참고용이며 사용 환경에 따라 다른 설정 값이 추가될 수 있습니다.
pod 의 동작을 확인하고 pod 에 접근하여 HSM 연결을 확인합니다.
- pod 동작 확인
kubectl --kubeconfig=$KUBE_CONFIG get pods NAME READY STATUS RESTARTS AGE pod-with-lunaclient 1/1 Running 0 58s
- pod 접속
kubectl --kubeconfig=$KUBE_CONFIG exec -it pod-with-lunaclient -- /bin/bash
- HSM 연결 확인
[root@pod-with-lunaclient /]# cd /usr/safenet/lunaclient/ [root@pod-with-lunaclient bin]# ./vtl verify vtl (64-bit) v10.7.1-125. Copyright (c) 2024 Thales Group. All rights reserved. The following Luna SA Slots/Partitions were found: Slot Serial # Label ==== ================ ===== 0 146*******711 n*****l
- pod 동작 확인
정상적으로 접근이 되기 위해서는 아래 사항 모두를 확인할 수 있어야합니다.
/etc/Chrystoki.conf
파일 존재/etc/Chrystoki.conf
파일 내ClientPrivKeyFile
,ClientCertFile
값의 파일명이 스크립트에 작성한 파일명과 동일
참고LunaSA Client = {
...
ClientPrivKeyFile = /usr/safenet/lunaclient/cert/client/testHsmKey.pem;
ClientCertFile = /usr/safenet/lunaclient/cert/client/testHsm.pem;
...
}/usr/safenet/lunaclient/
경로 존재/usr/safenet/lunaclient/cert/client
경로에{privateKey}.pem
,{certificate}.pem
파일이 있고 올바른 개인키, 인증서 내용