内部証明書の置き換え

NeuVectorのバージョン5.4.2以降では、NeuVectorを使用する前にユーザーが内部証明書を生成/置き換える必要があります。 2025年3月以降、NeuVectorのバージョン5.4.2以前では、NeuVectorを使用する前にユーザーが内部証明書を生成/置き換える必要があります。

内部通信と証明書

SUSE® Securityには、マネージャー(コンソール/UIアクセス)、コントローラー(REST API、内部)、エンフォーサー(内部)、スキャナー(内部)通信のためのデフォルトの自己署名証明書が含まれています。

これらの証明書は、通信をさらに強化するために独自のものに置き換えることができます。SUSE® Securityへの外部アクセスで使用される証明書を置き換えるには(つまり、マネージャーへのブラウザ、またはコントローラーへのREST API)、このセクションを参照してください。SUSE® Securityコンテナ間の内部通信で使用される証明書の置き換えについては、以下を参照してください。

証明書の置き換えは、SUSE® Securityの初期デプロイメント中にのみ行うことを推奨します。稼働中のクラスターでの置き換え(ローリングアップグレードを含む)は、証明書の不一致によりSUSE® Securityポッドが相互に通信できない不安定な状態を引き起こす可能性があり、データ損失が発生する可能性があります。

SUSE® Securityの内部通信で使用される証明書の置き換え

内部暗号化ファイル`ca.crt`、tls.key、`tls.crt`を以下のように置き換えます:

  • お気に入りのエディタで新しい`ca.cfg`ファイルを作成します:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = California
L = San Jose
O = {product-name} Inc.
OU = Neuvector
CN = Neuvector
[v3_req]
keyUsage = digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = Neuvector

`ca.cfg`に関する追加情報は、自己署名証明書の置き換えを参照してください。

  • 以下のオプションからシナリオを選択してください:

  • 新しい証明書

  • 現在の証明書をSANで更新する

  • 証明書ファイルを再生成し、SANを追加する

  • ビルトイン証明書が使用されている場合は、証明書を再生成する

証明書の有効期限が切れそうで新しいものを生成する必要がある場合は、以下の手順に従ってください:

  • 古い`ca.crt`、tls.keytls.crt、Kubernetesシークレットを削除し、新しいものを生成します:

    kubectl delete secret internal-cert -n neuvector
    openssl genrsa -out ca.key 2048
    openssl req -x509 -sha256 -new -nodes -key ca.key -days 3650 -out ca.crt
    openssl genrsa -out tls.key 2048
    openssl req -new -key tls.key -sha256 -out cert.csr -config ca.cfg
    openssl req -in cert.csr -noout -text
    openssl x509 -req -sha256 -in cert.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt -days 3650 -extensions 'v3_req' -extfile ca.cfg
    openssl x509 -in tls.crt -text
    kubectl create secret generic internal-cert -n neuvector --from-file=tls.key --from-file=tls.crt --from-file=ca.crt
  • 次に、コントローラー、エンフォーサー、スキャナーのデプロイメントYAMLを編集し、以下を追加します:

          containers:
            - name: neuvector-controller/enforcer/scanner-pod
              volumeMounts:
                - mountPath: /etc/neuvector/certs/internal/cert.key
                  name: internal-cert
                  readOnly: true
                  subPath: tls.key
                - mountPath: /etc/neuvector/certs/internal/cert.pem
                  name: internal-cert
                  readOnly: true
                  subPath: tls.crt
                - mountPath: /etc/neuvector/certs/internal/ca.cert
                  name: internal-cert
                  readOnly: true
                  subPath: ca.crt
          volumes:
            - name: internal-cert
              secret:
                defaultMode: 420
                secretName: internal-cert

    その後、SUSE® Securityを以前と同様にデプロイしてください。コントローラー/エンフォーサー/スキャナーポッドにシェルで入り、ca.crt、tls.key、tls.crtファイルがカスタマイズされたものであり、SUSE® Security通信が新しい証明書を使用して機能していることを確認できます。

    コントローラー用のパッチコマンドの例(必要に応じてネームスペースをcattle-neuvector-systemに変更し、エンフォーサーやスキャナーで使用するために修正してください)

    NAMESPACE=neuvector
    
    kubectl patch deployment -n $\{NAMESPACE} neuvector-controller-pod --type='json' -p='[{"op": "add", "path": "/spec/template/spec/volumes/-", "value": {"name": "internal-cert", "secret": {"defaultMode": 420, "secretName": "internal-cert"}} } ]'
    
    kubectl patch deployment -n $\{NAMESPACE} neuvector-controller-pod --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/volumeMounts", "value": [{"mountPath": "/etc/neuvector/certs/internal/cert.key", "name": "internal-cert", "readOnly": true, "subPath": "cert.key"}, {"mountPath": "/etc/neuvector/certs/internal/cert.pem", "name": "internal-cert", "readOnly": true, "subPath": "cert.pem"}, {"mountPath": "/etc/neuvector/certs/internal/ca.cert", "name": "internal-cert", "readOnly": true, "subPath": "ca.cert"} ] } ]'

証明書ファイルがSUSE® Securityバージョン5.3以前に作成された場合、少なくとも1つのサブジェクト代替名(SAN)で証明書を更新する必要があります。ファイル`ca.key`と`ca.crt`にまだアクセスできる場合、次のようにコマンドを実行してください:

kubectl delete secret internal-cert -n neuvector
openssl genrsa -out tls.key 2048
openssl req -new -key tls.key -sha256 -out cert.csr -config ca-new.cfg
openssl req -in cert.csr -noout -text
openssl x509 -req -sha256 -in cert.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt -days 3650 -extensions 'v3_req' -extfile ca-new.cfg
openssl x509 -in tls.crt -text
kubectl create secret generic internal-cert -n neuvector --from-file=tls.key --from-file=tls.crt --from-file=ca.crt

証明書ファイルが更新されたら、更新された証明書を使用するためにデプロイメントを再起動してください:

kubectl rollout restart deployment neuvector-controller-pod
kubectl rollout restart deployment neuvector-scanner-pod
kubectl rollout restart deployment neuvector-registry-adapter-pod
kubectl rollout restart ds neuvector-enforcer-pod

証明書ファイルがSUSE® Securityバージョン5.3以前に作成された場合、少なくとも1つのサブジェクト代替名(SAN)で証明書を更新する必要があります。ファイル`ca.key`と`ca.crt`がもうない場合は、以下の手順に従ってください:

  • 元の証明書をバックアップする

    kubectl get secret internal-cert -o yaml > internal-cert.yaml
  • 既存のinternal-certをエクスポートする

    kubectl get secret internal-cert -o json | jq -r '.data."ca.crt"' | base64 -d > old-ca.crt
    kubectl get secret internal-cert -o json | jq -r '.data."tls.crt"' | base64 -d > old-tls.crt
    kubectl get secret internal-cert -o json | jq -r '.data."tls.key"' | base64 -d > old-tls.key
  • 新しい証明書ファイルと内部証明書を作成する

    openssl genrsa -out ca.key 2048
    openssl req -x509 -sha256 -new -nodes -key ca.key -days 3650 -out ca.crt
    openssl genrsa -out tls.key 2048
    openssl req -new -key tls.key -sha256 -out cert.csr -config ca.cfg
    openssl req -in cert.csr -noout -text
    openssl x509 -req -sha256 -in cert.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt -days 3650 -extensions 'v3_req' -extfile ca.cfg
    openssl x509 -in tls.crt -text
  • 古い`ca.crt`ファイルと新しい`ca.crt`ファイルをマージする

    cat old-ca.crt > /tmp/ca.crt cat ca.crt >> /tmp/ca.crt
  • マージされた`ca.crt`でKubernetesシークレットを更新する

    kubectl delete secret internal-cert -n neuvector
    kubectl create secret generic internal-cert -n neuvector --from-file=tls.key=old-tls.key --from-file=tls.crt=old-tls.crt --from-file=ca.crt=/tmp/ca.crt
  • 更新された証明書を使用するためにデプロイメントを再起動する

    kubectl rollout restart deployment neuvector-controller-pod
    kubectl rollout restart deployment neuvector-scanner-pod
    kubectl rollout restart deployment neuvector-registry-adapter-pod
    kubectl rollout restart ds neuvector-enforcer-pod
  • 再起動が完了するまで待つ

    kubectl rollout status deployment neuvector-controller-pod
    kubectl rollout status deployment neuvector-scanner-pod
    kubectl rollout status deployment neuvector-registry-adapter-pod
    kubectl rollout status ds neuvector-enforcer-pod
  • コンソールにアクセスでき、すべてのコントローラーがオンラインであることを確認してください。* 新しい`tls.key`でKubernetesシークレットを更新する

    kubectl delete secret internal-cert -n neuvector
    kubectl create secret generic internal-cert -n neuvector --from-file=tls.key=tls.key --from-file=tls.crt=tls.crt --from-file=ca.crt=/tmp/ca.crt
  • 更新された証明書を使用するためにデプロイメントを再起動する

    kubectl rollout restart deployment neuvector-controller-pod
    kubectl rollout restart deployment neuvector-scanner-pod
    kubectl rollout restart deployment neuvector-registry-adapter-pod
    kubectl rollout restart ds neuvector-enforcer-pod
  • 再起動が完了するまで待つ

    kubectl rollout status deployment neuvector-controller-pod
    kubectl rollout status deployment neuvector-scanner-pod
    kubectl rollout status deployment neuvector-registry-adapter-pod
    kubectl rollout status ds neuvector-enforcer-pod
  • コンソールにアクセスでき、すべてのコントローラーがオンラインであることを確認してください。* 新しい`ca.crt`でKubernetesシークレットを更新する

    kubectl delete secret internal-cert -n neuvector
    kubectl create secret generic internal-cert -n neuvector --from-file=tls.key=tls.key --from-file=tls.crt=tls.crt --from-file=ca.crt=ca.crt
  • 更新された証明書を使用するためにデプロイメントを再起動する

    kubectl rollout restart deployment neuvector-controller-pod
    kubectl rollout restart deployment neuvector-scanner-pod
    kubectl rollout restart deployment neuvector-registry-adapter-pod
    kubectl rollout restart ds neuvector-enforcer-pod
  • 再起動が完了するまで待つ

    kubectl rollout status deployment neuvector-controller-pod
    kubectl rollout status deployment neuvector-scanner-pod
    kubectl rollout status deployment neuvector-registry-adapter-pod
    kubectl rollout status ds neuvector-enforcer-pod
  • コンソールにアクセスでき、すべてのコントローラーがオンラインであることを確認してください。

内部証明書を以前に置き換えず、新しい証明書セットに移行したい場合は、以下の手順に従ってください。

  • 自動的に生成された内部証明書がすでにあるか確認してください。

    kubectl get secret internal-cert -o yaml

    そこに`tls.key`、tls.crt、`ca.crt`が表示されている場合、自動生成された証明書を使用していることを意味し、このセクションをスキップできます。

    秘密が見えるが、これらの秘密が見つからない場合は、ヘルムチャートのオーバーライドで`internal.autoRotateCert`を有効にすることを検討してください。このオプションは、内部証明書を自動的に生成および回転させます。

    自動生成された内部証明書を使用せず、使用できない場合は、以下の手順に従ってください:

  • 内部証明書を管理するために、New certificate`タブの手順に従ってください。新しい証明書を生成する代わりに、以下から取得した証明書`old-ca.crtold-tls.crt、`old-tls.key`を使用してください:

    docker run -it --entrypoint=bash neuvector/scanner:3.654 -c "cat /etc/neuvector/certs/internal/ca.cert" > old-ca.crt
    docker run -it --entrypoint=bash neuvector/scanner:3.654 -c "cat /etc/neuvector/certs/internal/cert.pem" > old-tls.crt
    docker run -it --entrypoint=bash neuvector/scanner:3.654 -c "cat /etc/neuvector/certs/internal/cert.key" > old-tls.key
  • すべてのコンポーネントがエラーなしで実行されていることを確認してください。

  • その後、`Regenerate certificate files and add SANs`タブの手順に従って、自分の証明書に移行してください。

Helmでの更新およびデプロイ

Helmチャート`2.4.1`から、内部証明書のインストールを管理できるようになりました。チャート values.yamlは、すべての設定を確認する必要があります。以下の例は、RKE2、標準のIngress、およびインストーラー証明書を使用しています。

# add chart
helm repo add neuvector https://neuvector.github.io/neuvector-helm/

# update chart
helm repo update

# add domain for ingress
export domain=awesome.sauce

# run the helm
helm upgrade -i neuvector -n neuvector neuvector/core --create-namespace  --set imagePullSecrets=regsecret --set k3s.enabled=true --set k3s.runtimePath=/run/k3s/containerd/containerd.sock --set manager.ingress.enabled=true --set manager.ingress.host=neuvector.$domain --set manager.svc.type=ClusterIP --set controller.pvc.enabled=true --set controller.pvc.capacity=500Mi --set controller.internal.certificate.secret=internal-cert --set cve.scanner.internal.certificate.secret=internal-cert --set enforcer.internal.certificate.secret=internal-cert