本任务使用支持 gRPC xDS server security 的应用验证 Dubbo mTLS。mTLS 是 Mutual TLS,表示客户端和服务端使用证书互相校验身份。Inherent 模式不注入 grpc-inbound sidecar;应用运行时直接加载 LDS/CDS 和挂载证书。
前提条件¶
kubectl create ns app
kubectl label namespace app dubbo-injection=enabled
kubectl apply -f samples/app/deployment.yaml
kubectl apply -f samples/app/httproute.yaml
启用宽容模式¶
PERMISSIVE 同时接受明文和 mTLS 流量,适合先接入网格再逐步收紧。
cat <<EOF | kubectl apply -f -
apiVersion: security.dubbo.apache.org/v1alpha3
kind: PeerAuthentication
metadata:
name: app-permissive-mtls
namespace: app
spec:
mtls:
mode: PERMISSIVE
EOF
验证宽容模式¶
确认 mTLS 请求可以进入服务:
kubectl -n app exec deploy/nginx-consumer -- \
dubbod grpc-outbound --print-route --expect nginx-v1=50,nginx-v2=50
关键字段:
services[].ports[].mtlsMode: PERMISSIVE
确认明文请求也可以进入服务:
kubectl -n app run plain-curl --rm -i --restart=Never \
--image=curlimages/curl:8.5.0 -- \
curl -s http://nginx.app.svc.cluster.local/
预期返回:
或:
收紧为严格模式¶
STRICT 只接受 mTLS 流量。未接入网格的明文请求会被拒绝。
kubectl -n app patch peerauthentication app-permissive-mtls --type='merge' \
-p='{"spec":{"mtls":{"mode":"STRICT"}}}'
确认 mTLS 请求仍然成功:
kubectl -n app exec deploy/nginx-consumer -- \
dubbod grpc-outbound --expect nginx-v1=50,nginx-v2=50 20 | sort | uniq -c
确认明文请求不能绕过 mTLS:
kubectl -n app run plain-curl --rm -i --restart=Never \
--image=curlimages/curl:8.5.0 -- \
curl -sv --max-time 5 http://nginx.app.svc.cluster.local/
预期不是正常 200 OK。
限制调用方身份¶
STRICT 证明连接持有网格证书;AuthorizationPolicy 继续限制允许访问的 SPIFFE 身份。示例中的 consumer 使用 app/nginx ServiceAccount:
cat <<EOF | kubectl apply -f -
apiVersion: security.dubbo.apache.org/v1alpha3
kind: AuthorizationPolicy
metadata:
name: nginx-allow-client
namespace: app
spec:
selector:
matchLabels:
app: nginx
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/app/sa/nginx
EOF
确认允许的 mTLS 身份仍能访问:
kubectl -n app exec deploy/nginx-consumer -- \
dubbod grpc-outbound --expect nginx-v1=50,nginx-v2=50 20 | sort | uniq -c
原生 gRPC xDS server 从经过 CA 验证的客户端证书 URI SAN 提取身份,不信任调用方自行设置的 HTTP 头。
启用全局自动 mTLS¶
把 PeerAuthentication 放在 root namespace dubbo-system 且不设置 selector,会作为全局策略应用到整个网格。
cat <<EOF | kubectl apply -f -
apiVersion: security.dubbo.apache.org/v1alpha3
kind: PeerAuthentication
metadata:
name: default
namespace: dubbo-system
spec:
mtls:
mode: STRICT
EOF
namespace 级别策略优先于全局策略,适合按 namespace 分阶段迁移。