Envoy Gateway 实战:配置后端服务 TLS 加密通信

Envoy Gateway 实战:配置后端服务 TLS 加密通信

前言

在现代微服务架构中,服务间的安全通信至关重要。本文将详细介绍如何在 Envoy Gateway 中为后端服务配置 TLS 加密通信,确保网关与后端服务之间的数据传输安全。

TLS 基础概念

TLS(Transport Layer Security)是一种加密协议,用于在网络通信中提供隐私和数据完整性。在 Envoy Gateway 中配置后端 TLS 可以实现:

  1. 数据加密传输
  2. 服务身份验证
  3. 防止中间人攻击

准备工作

在开始配置前,需要准备以下工具和环境:

  1. OpenSSL 工具链(用于创建证书)
  2. 已安装 Envoy Gateway 的 Kubernetes 集群
  3. 基本的 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"
  }
}

安全建议

  1. 生产环境应使用正规 CA 签发的证书
  2. 定期轮换证书和密钥
  3. 监控证书过期时间
  4. 考虑使用服务网格提供的自动 mTLS 功能

总结

本文详细介绍了在 Envoy Gateway 中为后端服务配置 TLS 加密通信的全过程,包括证书创建、后端服务配置、BackendTLSPolicy 应用以及高级 TLS 参数定制。通过实施这些配置,可以显著提升服务间通信的安全性。

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

内容概要:本文档定义了一个名为 `xxx_SCustSuplier_info` 的视图,用于整合和展示客户(Customer)和供应商(Supplier)的相关信息。视图通过连接多个表来获取组织单位、客户账户、站点使用、位置、财务代码组合等数据。对于客户部分,视图选择了与账单相关的记录,并提取了账单客户ID、账单站点ID、客户名称、账户名称、站点代码、状态、付款条款等信息;对于供应商部分,视图选择了有效的供应商及其站点信息,包括供应商ID、供应商名称、供应商编号、状态、付款条款、财务代码组合等。视图还通过外连接确保即使某些字段为空也能显示相关信息。 适合人群:熟悉Oracle ERP系统,尤其是应付账款(AP)和应收账款(AR)模块的数据库管理员或开发人员;需要查询和管理客户及供应商信息的业务分析师。 使用场景及目标:① 数据库管理员可以通过此视图快速查询客户和供应商的基本信息,包括账单信息、财务代码组合等;② 开发人员可以利用此视图进行报表开发或数据迁移;③ 业务分析师可以使用此视图进行数据分析,如信用评估、付款周期分析等。 阅读建议:由于该视图涉及多个表的复杂连接,建议读者先熟悉各个表的结构和关系,特别是 `hz_parties`、`hz_cust_accounts`、`ap_suppliers` 等核心表。此外,注意视图中使用的外连接(如 `gl_code_combinations_kfv` 表的连接),这可能会影响查询结果的完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汤中岱Wonderful

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

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

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

打赏作者

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

抵扣说明:

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

余额充值