解决Azure AKS自定义CA证书导致Defender容器组件报错的完整方案
【免费下载链接】AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
问题背景与现象描述
在基于Azure Kubernetes Service(AKS)部署的OpenShift集群中,管理员为满足企业安全合规要求配置了自定义CA(Certificate Authority,证书颁发机构)证书后,发现Microsoft Defender for Containers组件持续报出x509证书验证错误:x509: certificate signed by unknown authority。该错误导致Defender无法正常采集容器镜像漏洞信息、运行时行为数据及安全事件,严重影响集群安全监控能力。
典型错误日志示例
E0907 18:19:18.234567 1 main.go:123] Failed to connect to Azure Log Analytics: x509: certificate signed by unknown authority
W0907 18:19:19.345678 1 client_config.go:615] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
问题根源深度分析
证书信任链断裂原理
Kubernetes集群中运行的容器默认仅信任系统级CA证书,当集群环境使用自定义CA签发内部服务证书时,未配置信任机制的组件会因无法验证证书合法性而拒绝通信。Defender容器组件(如azure-defender-node-agent和azure-defender-controller-manager)作为部署在AKS节点上的DaemonSet,其默认配置未包含对自定义CA的信任机制。
AKS与OpenShift证书管理差异
| 特性 | Azure AKS默认配置 | OpenShift自定义CA配置 |
|---|---|---|
| CA证书存储位置 | /etc/ssl/certs/ca-certificates.crt | /etc/pki/ca-trust/source/anchors/ |
| 证书同步机制 | 自动挂载系统CA | 需要手动更新信任存储 |
| 容器继承方式 | 只读挂载系统CA目录 | 需显式配置证书路径 |
| Defender兼容性 | 原生支持 | 需额外配置 |
解决方案设计与实施
方案架构
实施步骤
1. 创建CA证书ConfigMap
将自定义CA证书(通常为ca.crt)创建为集群级ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-ca-certificates
namespace: kube-system
data:
ca.crt: |
-----BEGIN CERTIFICATE-----
MIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL
MAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC
VU4xCzAJBgNVBAMTAkRLMA0GCSqGSIb3DQEBBQUAA4GBADsw5rM5JqX2DqZ1q3uJ
...
-----END CERTIFICATE-----
2. 修改Defender DaemonSet配置
编辑Defender节点代理的DaemonSet,添加CA证书挂载:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: azure-defender-node-agent
namespace: kube-system
spec:
template:
spec:
containers:
- name: azure-defender-node-agent
volumeMounts:
- name: custom-ca
mountPath: /usr/local/share/ca-certificates/
readOnly: true
command: ["/bin/sh", "-c"]
args: ["update-ca-certificates && /opt/azure-defender/defender"]
volumes:
- name: custom-ca
configMap:
name: custom-ca-certificates
3. 验证证书配置
在Defender Pod中执行以下命令验证证书是否被正确加载:
# 检查证书是否存在
ls -l /usr/local/share/ca-certificates/ca.crt
# 验证证书信任状态
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
常见问题与排错指南
证书未被正确加载
症状:日志中仍出现x509错误
解决步骤:
- 检查ConfigMap是否正确创建:
kubectl get configmap -n kube-system custom-ca-certificates - 验证Pod挂载状态:
kubectl exec -n kube-system <defender-pod-name> -- mount | grep custom-ca - 检查证书权限:确保文件权限为644,所有者为root
Defender进程启动失败
症状:Pod状态显示CrashLoopBackOff
解决步骤:
- 查看容器日志:
kubectl logs -n kube-system <defender-pod-name> - 检查update-ca-certificates输出:
kubectl exec -n kube-system <defender-pod-name> -- update-ca-certificates - 验证命令执行顺序:确保证书更新命令在启动命令之前执行
最佳实践与预防措施
长期维护策略
- 证书自动更新:使用Cert-Manager管理自定义CA证书生命周期,配置自动轮换
- 配置版本控制:将CA证书配置纳入GitOps流程,通过Flux或ArgoCD进行版本管理
- 监控告警:设置Prometheus监控规则,当证书即将过期时触发告警
多集群一致性保障
对于企业级多集群环境,建议通过Azure Policy或Gatekeeper实施以下策略:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredCustomCA
metadata:
name: defender-must-have-custom-ca
spec:
match:
kinds:
- apiGroups: ["apps"]
kinds: ["DaemonSet"]
- namespaces: ["kube-system"]
names: ["azure-defender-node-agent"]
parameters:
requiredVolume: "custom-ca"
requiredMountPath: "/usr/local/share/ca-certificates/"
总结与展望
本文详细分析了Azure AKS集群中自定义CA证书导致Defender容器组件证书验证失败的根本原因,提供了基于ConfigMap挂载和证书信任链更新的完整解决方案。通过实施本文所述步骤,管理员可在满足企业安全合规要求的同时,确保安全监控组件的正常运行。
随着云原生环境安全要求的不断提升,建议关注Azure Defender for Containers的官方更新,未来版本可能会提供更原生的自定义CA配置支持。同时,企业应建立完善的证书管理体系,将证书配置纳入基础设施即代码(IaC)流程,实现自动化运维和一致性管理。
读完本文你将获得:
- 理解自定义CA证书在AKS集群中的工作原理
- 掌握Defender组件证书信任配置的完整流程
- 学会排查x509证书验证错误的实用技巧
- 建立企业级证书管理的最佳实践体系
【免费下载链接】AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



