Envoy Proxy Gateway 后端 mTLS 配置实战指南

Envoy Proxy Gateway 后端 mTLS 配置实战指南

前言

在现代微服务架构中,服务间的安全通信至关重要。双向 TLS(mTLS)作为一种强大的安全机制,不仅能够加密通信内容,还能确保通信双方的身份真实性。本文将详细介绍如何在 Envoy Proxy Gateway 中配置后端服务的 mTLS 认证。

基础概念

什么是 mTLS?

mTLS(Mutual TLS)是标准 TLS 协议的扩展,它要求通信双方都提供并验证对方的证书。与普通 TLS 仅客户端验证服务器身份不同,mTLS 实现了双向认证:

  1. 客户端验证服务器证书
  2. 服务器验证客户端证书
  3. 建立加密通信通道

为什么需要 mTLS?

  • 增强安全性:防止中间人攻击
  • 服务身份认证:确保只有授权服务可以相互通信
  • 零信任架构:实现最小权限原则的基础

准备工作

环境要求

  1. 已安装 OpenSSL 工具链
  2. 已部署 Envoy Proxy Gateway
  3. 已配置基本的后端 TLS(单向认证)

证书体系设计

我们将创建以下证书:

  1. CA 根证书:用于签发其他证书
  2. 客户端证书:由 Gateway 使用,用于向后端证明身份
  3. 服务器证书:后端服务使用(已在基础 TLS 配置中创建)

证书创建实战

1. 创建 CA 证书

openssl req -x509 -sha256 -nodes -days 365 \
  -newkey rsa:2048 \
  -subj '/O=example Inc./CN=example.com' \
  -keyout clientca.key \
  -out clientca.crt

参数说明:

  • -x509:生成自签名证书
  • -sha256:使用 SHA-256 哈希算法
  • -nodes:不加密私钥
  • -days 365:有效期1年
  • -newkey rsa:2048:生成2048位RSA密钥

2. 创建客户端证书

生成私钥和证书签名请求(CSR):

openssl req -new -newkey rsa:2048 -nodes \
  -keyout client.key \
  -out client.csr \
  -subj "/CN=example-client/O=example organization"

使用 CA 签发证书:

openssl x509 -req -days 365 \
  -CA clientca.crt \
  -CAkey clientca.key \
  -set_serial 0 \
  -in client.csr \
  -out client.crt

Kubernetes 资源配置

1. 存储客户端证书

kubectl -n envoy-gateway-system create secret tls example-client-cert \
  --key=client.key \
  --cert=client.crt

2. 存储 CA 证书

kubectl create configmap example-client-ca \
  --from-file=clientca.crt

后端服务配置

我们需要修改后端部署以启用客户端证书验证:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  template:
    spec:
      containers:
      - name: backend
        volumeMounts:
        - name: client-certs-volume
          mountPath: /etc/client-certs
        - name: secret-volume
          mountPath: /etc/secret-volume
        env:
        - name: TLS_CLIENT_CACERTS
          value: /etc/client-certs/crt
      volumes:
      - name: client-certs-volume
        configMap:
          name: example-client-ca
          items:
          - key: clientca.crt
            path: crt
      - name: secret-volume
        secret:
          secretName: example-cert
          items:
          - key: tls.crt
            path: crt
          - key: tls.key
            path: key

关键配置说明:

  • TLS_CLIENT_CACERTS:指定用于验证客户端证书的 CA
  • 挂载服务器证书和私钥用于 TLS
  • 挂载 CA 证书用于客户端验证

Envoy Proxy 配置

1. 配置 GatewayClass 引用 EnvoyProxy

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: eg
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
  parametersRef:
    group: gateway.envoyproxy.io
    kind: EnvoyProxy
    name: custom-proxy-config
    namespace: envoy-gateway-system

2. 配置 EnvoyProxy 资源

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: custom-proxy-config
  namespace: envoy-gateway-system
spec:
  backendTLS:
    clientCertificateRef:
      kind: Secret
      name: example-client-cert
      namespace: envoy-gateway-system

关键配置说明:

  • backendTLS:指定后端 TLS 配置
  • clientCertificateRef:引用包含客户端证书的 Secret

验证配置

发送测试请求并检查响应:

curl -v -HHost:www.example.com \
  --resolve "www.example.com:80:127.0.0.1" \
  http://www.example.com:80/get

预期响应中应包含 TLS 握手详情:

{
  "tls": {
    "version": "TLSv1.2",
    "serverName": "www.example.com",
    "negotiatedProtocol": "http/1.1",
    "cipherSuite": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    "peerCertificates": ["-----BEGIN CERTIFICATE-----\n...-----END CERTIFICATE-----\n"]
  }
}

安全最佳实践

  1. 生产环境建议

    • 使用企业级 CA 而非自签名证书
    • 定期轮换证书
    • 实施证书吊销检查(CRL/OCSP)
  2. 性能考虑

    • 启用会话恢复以减少握手开销
    • 考虑使用 ECDSA 证书而非 RSA 以提高性能
  3. 监控告警

    • 监控证书过期时间
    • 设置 TLS 握手失败告警

常见问题排查

  1. 握手失败

    • 检查证书链是否完整
    • 验证证书中的 SAN/CN 是否符合预期
    • 检查时间同步(NTP)
  2. 连接被拒绝

    • 确认后端服务监听端口正确
    • 检查网络策略是否允许流量
  3. 证书验证错误

    • 确保证书未过期
    • 验证 CA 证书是否正确加载

总结

通过本文,我们详细介绍了在 Envoy Proxy Gateway 中配置后端 mTLS 的全过程。从证书创建到 Kubernetes 资源配置,再到 Envoy 特定配置,我们展示了如何构建一个安全的服务间通信通道。mTLS 作为现代云原生架构的关键安全组件,能够有效提升系统的整体安全性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邬祺芯Juliet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值