跳到主要内容

XDP 中的 TCP 授权

XDP 中的授权

之前,我们推出了用户空间授权功能,其中授权结果在用户空间进行验证。本文档解释了如何直接在 XDP 程序中启用授权。目前,基于 XDP 的授权仅支持基于端口和 IP 地址的验证。

如何启用基于 XDP 的授权

我们可以使用 kmeshctl 来启用基于 XDP 的授权:

./kmeshctl authz enable

修改 BPF 日志级别:

./kmeshctl log <$kmeshnode1> --set bpf:debug

配置拒绝授权策略

配置目标端口拒绝授权策略

为 Fortio 工作负载创建一个“deny-by-dstport”授权策略,拒绝发送到指定端口地址的请求。在此示例中,发送到端口 8080 的流量被拒绝:

# deny-by-dstport.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-by-dstport
spec:
selector:
matchLabels:
app: fortio-server
action: DENY
rules:
- to:
- operation:
ports:
- "8080"

应用策略:

kubectl apply -f deny-by-dstport.yaml

测试策略

Fortio 流量返回的状态码确认发送到端口 8080 的流量已被拒绝:

kubectl exec -it fortio-client-deployment-6966bf9488-tpwpj -- fortio load -c 1 -n 1 -qps 0 -jitter=true 10.244.0.7:8080

预期输出:

...
IP addresses distribution:
10.244.0.7:8080: 1
Code -1 : 1 (100.0 %)
Response Header Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
Response Body/Total Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
All done 1 calls (plus 0 warmup) 3005.022 ms avg, 0.3 qps

Kmesh 记录的日志中也会打印特定信息:

kubectl logs -f kmesh-vlxhd -n kmesh-system

预期输出:

...
time="2024-12-25T15:23:12+08:00" level=info msg="[AUTH] DEBUG: port 8080 in destination_ports, matched" subsys=ebpf
time="2024-12-25T15:23:12+08:00" level=info msg="[AUTH] DEBUG: rule matched, action: DENY" subsys=ebpf

配置源 IP 拒绝授权策略

创建策略以拒绝来自特定源 IP 的流量:

# deny-by-srcip.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-by-srcip1
namespace: default
spec:
selector:
matchLabels:
app: fortio-server
action: DENY
rules:
- from:
- source:
ipBlocks:
- 10.244.1.36

应用策略:

kubectl apply -f deny-by-srcip.yaml

测试策略

Fortio 流量返回的状态码确认从 IP 10.244.1.36 发送的流量已被拒绝:

# fortio-client-deployment-6966bf9488-m96qp 的 IP 地址是 10.244.1.36
kubectl exec -it fortio-client-deployment-6966bf9488-m96qp -- fortio load -c 1 -n 1 -qps 0 -jitter=true 10.244.0.36:8080

预期输出:

...
IP addresses distribution:
10.244.0.36:8080: 1
Code -1 : 1 (100.0 %)
Response Header Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
Response Body/Total Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
All done 1 calls (plus 0 warmup) 3005.563 ms avg, 0.3 qps

Kmesh 记录的日志中也会打印特定信息:

kubectl logs -f kmesh-vlxhd -n kmesh-system

预期输出:

...
time="2024-12-26T15:05:26+08:00" level=info msg="[AUTH] DEBUG: rule matched, action: DENY" subsys=ebpf
time="2024-12-26T15:06:14+08:00" level=info msg="[AUTH] DEBUG: no ports configured, matching by default" subsys=ebpf
time="2024-12-26T15:06:14+08:00" level=info msg="[AUTH] DEBUG: IPv4 match srcip: Rule IP: af40124, Prefix Length: 32, Target IP: af40124\n" subsys=ebpf

配置目标 IP 拒绝授权策略

创建策略以拒绝发送到特定目标 IP 的流量:

# deny-by-dstip.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-dstip
spec:
selector:
matchLabels:
app: fortio-server
action: DENY
rules:
- when:
- key: destination.ip
values: ["10.244.0.36"]

应用策略:

kubectl apply -f deny-by-dstip.yaml

测试策略

Fortio 流量返回的状态码确认发送到 IP 10.244.0.36 的流量已被拒绝:

kubectl exec -it fortio-client-deployment-6966bf9488-m96qp -- fortio load -c 1 -n 1 -qps 0 -jitter=true 10.244.0.36:8080

预期输出:

...
10.244.0.36:8080: 1
Code -1 : 1 (100.0 %)
Response Header Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
Response Body/Total Sizes : count 1 avg 0 +/- 0 min 0 max 0 sum 0
All done 1 calls (plus 0 warmup) 3004.974 ms avg, 0.3 qps

Kmesh 记录的日志中也会打印特定信息:

kubectl logs -f kmesh-vlxhd -n kmesh-system

预期输出:

...
time="2024-12-26T15:05:22+08:00" level=info msg="[AUTH] DEBUG: rule matched, action: DENY" subsys=ebpf
time="2024-12-26T15:05:26+08:00" level=info msg="[AUTH] DEBUG: no ports configured, matching by default" subsys=ebpf
time="2024-12-26T15:05:26+08:00" level=info msg="[AUTH] DEBUG: IPv4 match dstip: Rule IP: af40024, Prefix Length: 32, Target IP: af40024\n" subsys=ebpf