替换内部证书

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 pod 由于证书不匹配而无法相互通信,并可能导致数据丢失。

替换 SUSE® Security 的内部通信中使用的证书

按如下方式替换内部加密文件 ca.crttls.keytls.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.crttls.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。您还可以进入控制器/执行器/扫描器的 pod,以确认 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 之前创建的,您需要使用至少一个主题备用名称(简称 SAN)来更新证书。如果您仍然可以访问文件 ca.keyca.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 之前创建的,您需要使用至少一个主题备用名称(简称 SAN)来更新证书。如果您不再拥有文件 ca.keyca.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 文件

    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.keytls.crtca.crt,这意味着您一直在使用自动生成的证书,您可以跳过此部分。

    如果您可以看到 Kubernetes 密钥,但找不到这些 Kubernetes 密钥,请考虑在 helm charts 覆盖中启用 internal.autoRotateCert。此选项将自动生成和轮换您的内部证书。

    如果您不使用自动生成的内部证书且无法使用,请按照以下步骤操作:

  • 按照 New certificate 标签中的步骤使用 Kubernetes 密钥来管理内部证书。请使用以下检索到的证书 old-ca.crtold-tls.crtold-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 chart 2.4.1 开始,我们现在可以管理内部证书的安装。应审查 chart 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