
在云原生环境中Kubernetes已成为容器编排的事实标准,Ingress-Nginx作为最流行的入口控制器之一,承担着将外部流量路由到集群内部服务的重要职责。随着网络安全威胁日益增多,仅使用单向TLS已不能满足高安全要求的场景。mTLS(Mutual TLS,双向TLS)通过双向认证机制,为服务间通信提供了更高级别的安全保障。本文介绍如何在Kubernetes集群中为Ingress-Nginx配置mTLS,包括使用场景分析、详细配置步骤和实际代码示例。
mTLS是TLS/SSL协议的扩展,它不仅要求服务器向客户端证明其身份(标准TLS),还要求客户端向服务器证明其身份。这种双向认证机制通过交换和验证数字证书来确保通信双方都是可信的。
1、微服务间安全通信:在服务网格或微服务架构中,确保只有授权的服务可以相互通信。
2、API安全防护:保护敏感API接口,防止未经授权的访问。
3、金融和医疗行业:满足高安全合规要求的行业应用。
4、零信任架构:实现“永不信任,始终验证”的安全原则。
在开始配置前,请确保满足以下条件:
mTLS需要三组证书:CA根证书、服务器证书和客户端证书。以下是生成这些证书的命令:
# 创建CA证书
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout ca.key -out ca.crt -subj "/CN=My mTLS CA/O=My Organization"
# 生成服务器证书
openssl req -newkey rsa:4096 -nodes -keyout server.key \
-out server.csr -subj "/CN=secure-server.example.com/O=Server Organization"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365 -sha256 \
-extfile <(printf "subjectAltName=DNS:secure-server.example.com")
# 生成客户端证书
openssl req -newkey rsa:4096 -nodes -keyout client.key \
-out client.csr -subj "/CN=client-user/O=Client Organization"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out client.crt -days 365 -sha256首先,我们需要部署一个支持mTLS的后端服务:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mtls-backend
labels:
app: mtls-backend
spec:
replicas: 2
selector:
matchLabels:
app: mtls-backend
template:
metadata:
labels:
app: mtls-backend
spec:
containers:
- name: nginx
image: nginx:1.23
ports:
- containerPort: 443
volumeMounts:
- name: certs
mountPath: /etc/nginx/certs
readOnly: true
volumes:
- name: certs
secret:
secretName: mtls-certsapiVersion: v1
kind: Service
metadata:
name: mtls-backend
spec:
selector:
app: mtls-backend
ports:
- protocol: TCP
port: 443
targetPort: 443mTLS需要Ingress-Nginx启用SSL Passthrough功能,这样客户端证书可以直接传递给后端服务:
# 如果是Helm安装,添加以下配置
controller:
extraArgs:
enable-ssl-passthrough: "true"apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mtls-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- secure.example.com
secretName: mtls-certs
rules:
- host: secure.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mtls-backend
port:
number: 443使用curl命令验证mTLS配置是否生效:
# 不带客户端证书访问(应失败)
curl -v https://secure.example.com
# 带客户端证书访问(应成功)
curl -v --cert client.crt --key client.key --cacert ca.crt https://secure.example.com 为提高安全性,建议定期轮换证书:
# 重新生成证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-out server-new.crt -days 90 -sha256
# 更新Kubernetes Secret
kubectl create secret tls mtls-certs --cert=server-new.crt --key=server.key \
--dry-run=client -o yaml | kubectl apply -f -对于更严格的安全控制,可以配置证书吊销:
# 创建CRL
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
# 更新Nginx配置使用CRL
ssl_crl /etc/nginx/certs/crl.pem;在实际生产环境中,建议:
本文介绍了如何在Kubernetes环境中为Ingress-Nginx配置mTLS,实现了服务间通信的双向认证。mTLS虽然增加了配置复杂性,但为关键业务系统提供了更高级别的安全保障。随着零信任架构的普及,mTLS将成为云原生安全的重要组成部分。掌握这项技术将帮助构建更安全、更可靠的Kubernetes应用。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!