Envoy Gateway 实战:配置后端服务 TLS 加密通信
前言
在现代微服务架构中,服务间的安全通信至关重要。本文将详细介绍如何在 Envoy Gateway 中为后端服务配置 TLS 加密通信,确保网关与后端服务之间的数据传输安全。
TLS 基础概念
TLS(Transport Layer Security)是一种加密协议,用于在网络通信中提供隐私和数据完整性。在 Envoy Gateway 中配置后端 TLS 可以实现:
- 数据加密传输
- 服务身份验证
- 防止中间人攻击
准备工作
在开始配置前,需要准备以下工具和环境:
- OpenSSL 工具链(用于创建证书)
- 已安装 Envoy Gateway 的 Kubernetes 集群
- 基本的 Kubernetes 管理权限
证书创建与配置
1. 创建 CA 根证书
首先需要创建自签名的 CA 根证书,用于后续签发服务证书:
openssl req -x509 -sha256 -nodes -days 365 \
-newkey rsa:2048 \
-subj '/O=example Inc./CN=example.com' \
-keyout ca.key -out ca.crt
2. 创建服务证书
为后端服务 www.example.com
创建证书:
# 创建 OpenSSL 配置文件
cat > openssl.conf <<EOF
[req]
req_extensions = v3_req
prompt = no
[v3_req]
keyUsage = keyEncipherment, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.example.com
EOF
# 生成证书签名请求和私钥
openssl req -out www.example.com.csr \
-newkey rsa:2048 -nodes \
-keyout www.example.com.key \
-subj "/CN=www.example.com/O=example organization"
# 使用 CA 签发证书
openssl x509 -req -days 365 \
-CA ca.crt -CAkey ca.key -set_serial 0 \
-in www.example.com.csr -out www.example.com.crt \
-extfile openssl.conf -extensions v3_req
3. 存储证书到 Kubernetes
将创建的证书存储为 Kubernetes Secret:
kubectl create secret tls example-cert \
--key=www.example.com.key \
--cert=www.example.com.crt
kubectl create configmap example-ca \
--from-file=ca.crt
配置后端服务 TLS
1. 更新后端部署
修改现有后端部署,挂载 TLS 证书:
kubectl patch deployment backend --type=json --patch '
[
{
"op": "add",
"path": "/spec/template/spec/containers/0/volumeMounts",
"value": [
{
"name": "secret-volume",
"mountPath": "/etc/secret-volume"
}
]
},
{
"op": "add",
"path": "/spec/template/spec/volumes",
"value": [
{
"name": "secret-volume",
"secret": {
"secretName": "example-cert",
"items": [
{
"key": "tls.crt",
"path": "crt"
},
{
"key": "tls.key",
"path": "key"
}
]
}
}
]
},
{
"op": "add",
"path": "/spec/template/spec/containers/0/env/-",
"value": {
"name": "TLS_SERVER_CERT",
"value": "/etc/secret-volume/crt"
}
},
{
"op": "add",
"path": "/spec/template/spec/containers/0/env/-",
"value": {
"name": "TLS_SERVER_PRIVKEY",
"value": "/etc/secret-volume/key"
}
}
]'
2. 创建 TLS 后端服务
暴露后端服务的 443 端口:
apiVersion: v1
kind: Service
metadata:
labels:
app: backend
service: backend
name: tls-backend
namespace: default
spec:
selector:
app: backend
ports:
- name: https
port: 443
protocol: TCP
targetPort: 8443
配置 BackendTLSPolicy
使用 BackendTLSPolicy 资源告诉 Envoy Gateway 如何与 TLS 后端建立安全连接:
apiVersion: gateway.networking.k8s.io/v1alpha3
kind: BackendTLSPolicy
metadata:
name: enable-backend-tls
namespace: default
spec:
targetRefs:
- group: ''
kind: Service
name: tls-backend
sectionName: "443"
validation:
caCertificateRefs:
- name: example-ca
group: ''
kind: ConfigMap
hostname: www.example.com
更新 HTTPRoute
修改现有 HTTPRoute,指向新的 TLS 后端服务:
kubectl patch HTTPRoute backend --type=json --patch '
[
{
"op": "replace",
"path": "/spec/rules/0/backendRefs/0/port",
"value": 443
},
{
"op": "replace",
"path": "/spec/rules/0/backendRefs/0/name",
"value": tls-backend
}
]'
验证配置
1. 检查 HTTPRoute 状态
kubectl get HTTPRoute backend -o yaml
2. 测试 TLS 连接
根据环境选择以下测试方式之一:
有外部负载均衡器的情况
export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')
curl -v -HHost:www.example.com \
--resolve "www.example.com:80:${GATEWAY_HOST}" \
http://www.example.com:80/get
无负载均衡器的情况
export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system \
--selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg \
-o jsonpath='{.items[0].metadata.name}')
kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 80:80 &
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"
}
}
高级配置:自定义 TLS 参数
Envoy Gateway 允许通过 EnvoyProxy 资源自定义 TLS 参数。例如,强制使用 TLS 1.3:
1. 更新 GatewayClass
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:
minVersion: "1.3"
3. 验证 TLS 1.3 配置
再次测试连接,应看到 TLS 版本已升级:
{
"tls": {
"version": "TLSv1.3",
"serverName": "www.example.com",
"negotiatedProtocol": "http/1.1",
"cipherSuite": "TLS_AES_128_GCM_SHA256"
}
}
安全建议
- 生产环境应使用正规 CA 签发的证书
- 定期轮换证书和密钥
- 监控证书过期时间
- 考虑使用服务网格提供的自动 mTLS 功能
总结
本文详细介绍了在 Envoy Gateway 中为后端服务配置 TLS 加密通信的全过程,包括证书创建、后端服务配置、BackendTLSPolicy 应用以及高级 TLS 参数定制。通过实施这些配置,可以显著提升服务间通信的安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考