NKS 연동
    • PDF

    NKS 연동

    • PDF

    기사 요약

    Ncloud Kubernetes Service(NKS) 의 Pod에서 HSM에 연결하는 방법을 설명합니다.

    참고

    NKS 연동은 Thales 공식 문서를 기반으로 작성했습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 Docker Container - Integration Guide를 참조해 주십시오.

    지원 환경

    HSM 과 NKS를 연동하기 위한 환경은 다음과 같습니다.

    전제 조건

    NKS 연동을 시작하기 전에 다음의 전제 조건을 준수해 주십시오.

    Node HSM 연결 설정

    InitScript 설정을 이용하여 Node에 HSM 연결을 설정합니다.

    1. 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 으로 접근 가능한 상태가 됩니다.

    2. 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
      
    참고

    위 설정은 참고용이며 사용 환경에 따라 다른 설정 값이 추가될 수 있습니다.

    1. 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
        
    2. 정상적으로 접근이 되기 위해서는 아래 사항 모두를 확인할 수 있어야합니다.

      • /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 파일이 있고 올바른 개인키, 인증서 내용

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.