快速开始:允许与拒绝 HTTP 请求
本教程在 varmor-networkproxy-demo 中创建自有 HTTP 后端和注入代理的客户端,仅允许向该后端发送 GET /allow/…。后端本身对所有 GET 路径返回 200,因此访问日志可区分代理拒绝和后端错误。
前提
- 安装 vArmor v0.10.5 和配套自定义 Envoy/proxyinit 镜像,见安装。
- 使用独立网络命名空间的 Linux Pod,集群准入策略允许注入 root 容器及 NET_ADMIN,见安全与兼容性。
- 示例假定 DNS 后缀为 cluster.local,如不同,需要同时修改策略和请求 URL。
- 确认 namespace 名称尚未使用,清理会删除整个专属 namespace,不要复用业务 namespace。
业务 UID1000 与默认代理 UID1337 不同。无需真实 API 凭据或 MITM 证书。
1. 创建后端
保存为 backend.yaml 并执行:
backend.yaml
apiVersion: v1
kind: Namespace
metadata:
name: varmor-networkproxy-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: varmor-networkproxy-demo
spec:
replicas: 1
selector:
matchLabels: {app: np-guide-backend}
template:
metadata:
labels: {app: np-guide-backend}
spec:
automountServiceAccountToken: false
securityContext:
runAsUser: 1000
runAsNonRoot: true
containers:
- name: backend
image: python:3.12-alpine
command: [python3, -u, -c]
args:
- |
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b"backend reached\n")
HTTPServer(("0.0.0.0", 8000), Handler).serve_forever()
ports:
- containerPort: 8000
readinessProbe:
tcpSocket: {port: 8000}
---
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: varmor-networkproxy-demo
spec:
selector: {app: np-guide-backend}
ports:
- port: 8000
targetPort: 8000
kubectl apply -f backend.yaml
kubectl rollout status deployment/backend -n varmor-networkproxy-demo --timeout=120s
后端未设置 vArmor 注入标签,其就绪探针使用 TCP 检查,不会向访问日志添加 HTTP 请求。
2. 先创建策略
保存为 policy.yaml:
policy.yaml
apiVersion: crd.varmor.org/v1beta1
kind: VarmorPolicy
metadata:
name: http-guide
namespace: varmor-networkproxy-demo
spec:
target:
kind: Pod
name: client
policy:
enforcer: NetworkProxy
mode: EnhanceProtect
enhanceProtect:
networkProxyRawRules:
egress:
defaultAction: deny
httpRules:
- qualifiers: [allow, audit]
match:
hosts: [backend.varmor-networkproxy-demo.svc.cluster.local]
ports: [{port: 8000}]
paths: [{prefix: /allow/}]
methods: [GET]
kubectl apply -f policy.yaml
kubectl wait -n varmor-networkproxy-demo --for=jsonpath='{.status.ready}'=true varmorpolicy/http-guide --timeout=120s
超时应先检查 policy status/conditions。接下来创建客户端并验证请求结果。
3. 创建并检查客户端
保存为 client.yaml:
client.yaml
apiVersion: v1
kind: Pod
metadata:
name: client
namespace: varmor-networkproxy-demo
labels:
sandbox.varmor.org/enable: "true"
spec:
automountServiceAccountToken: false
securityContext:
runAsUser: 1000
runAsNonRoot: true
containers:
- name: client
image: curlimages/curl:8.12.1
command: [sh, -c, "sleep 3600"]
kubectl apply -f client.yaml
kubectl wait -n varmor-networkproxy-demo --for=condition=Ready pod/client --timeout=120s
kubectl get pod client -n varmor-networkproxy-demo -o jsonpath='{.spec.initContainers[*].name}{"\n"}{.spec.containers[*].name}{"\n"}'
应看到 init varmor-network-proxy-init、业务容器 client 和 sidecar varmor-network-proxy。如果缺少注入容器,请先检查策略目标和 Pod 事件。
4. 验证允许与拒绝
每条请求执行一次,保留状态码和响应:
kubectl exec -n varmor-networkproxy-demo client -c client -- \
curl --noproxy '*' --max-time 10 -sS -w '\nHTTP %{http_code}\n' \
'http://backend.varmor-networkproxy-demo.svc.cluster.local:8000/allow/?case=allow-1'
kubectl exec -n varmor-networkproxy-demo client -c client -- \
curl --noproxy '*' --max-time 10 -sS -w '\nHTTP %{http_code}\n' \
'http://backend.varmor-networkproxy-demo.svc.cluster.local:8000/deny/?case=deny-1'
kubectl logs -n varmor-networkproxy-demo deployment/backend -c backend
| 请求 | 客户端 | 后端访问日志 | 审计 |
|---|---|---|---|
/allow/?case=allow-1 | 200,backend reached | 一条对应 GET | AUDIT |
/deny/?case=deny-1 | 代理返回 403 | 无对应 GET | DENIED |
curl 对 403 也可能退出成功,应检查 HTTP 状态码。超时/拒绝连接不是本例预期的拒绝结果。初始配置不可用时参照排障。
按可观测性在节点或 sidecar 中查找审计,限定 namespace/Pod。
5. 修改规则并再次验证
把 policy.yaml 的路径前缀从 /allow/ 改为 /deny/ 后 apply。检查策略状态和代理 reload 日志,等待配置文件更新并被代理加载,再使用新的 case 值重复两条请求:此时 /allow/ 应拒绝,/deny/ 应允许。
该规则变化不需要重建客户端 Pod。其他类型的变更请参阅生命周期与升级。
6. 清理
kubectl delete namespace varmor-networkproxy-demo