替换内部证书
|
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.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
|
有关 |
-
从以下选项中选择您的场景:
-
新证书
-
使用 SAN 更新当前证书
-
重新生成证书文件并添加 SAN
-
当使用内置证书时重新生成证书
如果您的证书即将过期并且您需要生成一个新的,请按照以下步骤操作:
-
删除旧的
ca.crt、tls.key、tls.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.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 之前创建的,您需要使用至少一个主题备用名称(简称 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文件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,这意味着您一直在使用自动生成的证书,您可以跳过此部分。如果您可以看到 Kubernetes 密钥,但找不到这些 Kubernetes 密钥,请考虑在 helm charts 覆盖中启用
internal.autoRotateCert。此选项将自动生成和轮换您的内部证书。如果您不使用自动生成的内部证书且无法使用,请按照以下步骤操作:
-
按照
New certificate标签中的步骤使用 Kubernetes 密钥来管理内部证书。请使用以下检索到的证书old-ca.crt、old-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 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