Posted in

Go零信任安全从入门到生产:手把手实现mTLS双向认证与SPIFFE身份体系

第一章:零信任安全模型与Go语言生态适配

零信任并非单一产品,而是一种以“永不信任,始终验证”为原则的安全范式。其核心在于剥离网络边界假设,将每个请求视为潜在威胁,强制实施设备身份认证、用户最小权限授权、服务间双向TLS、动态策略评估与细粒度访问控制。Go语言凭借其原生并发支持、静态编译、内存安全性(无GC导致的敏感数据残留风险)、丰富的标准库(如 crypto/tlsnet/http)以及轻量级可执行文件特性,天然契合零信任架构中对可信执行环境、低延迟策略决策和跨平台代理部署的需求。

零信任关键能力与Go生态映射

  • 设备身份认证:使用 github.com/smallstep/certificatescfssl 生成并管理基于X.509证书的设备身份,Go标准库 crypto/x509 可直接解析与校验;
  • 服务间mTLS通信:通过 http.Server.TLSConfig 配置双向证书验证,强制客户端提供有效证书;
  • 策略即代码集成:借助 Open Policy Agent(OPA) 的 Go SDK(github.com/open-policy-agent/opa/sdk),在Go服务中嵌入策略引擎,实现运行时动态授权决策;
  • 透明代理与Sidecar轻量化:利用 golang.org/x/net/proxynet/http/httputil 快速构建符合SPIFFE/SPIRE规范的身份感知反向代理。

实现一个基础mTLS服务端示例

package main

import (
    "log"
    "net/http"
    "crypto/tls"
)

func main() {
    // 强制要求客户端提供并验证证书
    tlsConfig := &tls.Config{
        ClientAuth: tls.RequireAndVerifyClientCert,
        ClientCAs:  loadCACertPool("ca.crt"), // 加载根CA证书池
    }
    server := &http.Server{
        Addr:      ":8443",
        TLSConfig: tlsConfig,
        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // 从TLS连接中提取客户端证书信息
            if len(r.TLS.PeerCertificates) > 0 {
                w.Header().Set("X-Client-Spiffe-ID", spiffeIDFromCert(r.TLS.PeerCertificates[0]))
            }
            w.Write([]byte("Authenticated via mTLS"))
        }),
    }
    log.Println("mTLS server listening on :8443")
    log.Fatal(server.ListenAndServeTLS("server.crt", "server.key"))
}

该服务启动后,仅接受携带由指定CA签发的有效证书的HTTPS请求,并在响应头中透传SPIFFE标识符,为后续基于身份的策略路由奠定基础。

第二章:mTLS双向认证的Go原生实现

2.1 TLS协议核心机制与Go标准库深度解析

TLS协议通过握手协商密钥、验证身份、加密传输三阶段保障通信安全。Go标准库 crypto/tls 将其抽象为可配置的 Config 结构体与状态机驱动的 Conn 实现。

核心配置解析

cfg := &tls.Config{
    MinVersion:         tls.VersionTLS12, // 强制最低TLS版本,禁用不安全旧协议
    CurvePreferences:   []tls.CurveID{tls.CurveP256}, // 优先使用P-256椭圆曲线
    NextProtos:         []string{"h2", "http/1.1"},     // ALPN协议协商列表
}

MinVersion 防止降级攻击;CurvePreferences 影响ECDHE密钥交换效率与兼容性;NextProtos 决定HTTP/2等上层协议启用条件。

Go TLS握手关键流程

graph TD
    A[ClientHello] --> B[ServerHello + Certificate]
    B --> C[CertificateVerify + Finished]
    C --> D[Application Data 加密传输]
组件 Go类型 安全作用
tls.Conn 包装底层net.Conn 提供透明加解密I/O接口
tls.Certificate X.509证书+私钥对 服务端身份认证与密钥交换基础
tls.ClientAuth 客户端证书验证策略 支持双向mTLS强身份校验

2.2 自签名CA构建与证书生命周期管理(Go CLI工具链实战)

构建根CA密钥与证书

使用 cfssl 工具链快速生成自签名根证书:

# 生成根CA私钥与证书(有效期10年)
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

ca-csr.json 定义了 CNnamesca.expirycfssljson -bare ca 将输出 ca-key.pem(PEM格式RSA私钥)和 ca.pem(X.509 v3证书)。该证书的 Basic Constraints 扩展被设为 CA:TRUE,是后续签发所有证书的信任锚。

证书签发与轮换流程

典型生命周期操作如下:

  • ✅ 生成服务端 CSR(如 server-csr.json
  • ✅ 用 ca-key.pem 签发:cfssl sign -ca ca.pem -ca-key ca-key.pem server-csr.json
  • ⚠️ 过期前30天触发自动轮换(通过 cfssl-certinfo -cert server.pem 提取 Not After 字段判断)

证书状态概览

证书类型 有效期 是否可吊销 用途
根CA 10年 签发下级证书
中间CA 3年 是(CRL) 隔离根密钥
终端证书 1年 是(OCSP) gRPC/mTLS服务
graph TD
    A[ca.pem + ca-key.pem] -->|sign| B[intermediate-csr.json]
    B --> C[intermediate.pem]
    C -->|sign| D[server.pem]
    D --> E[API服务双向TLS]

2.3 HTTP/GRPC服务端mTLS强制校验与客户端双向握手(net/http & google.golang.org/grpc)

mTLS 核心机制

双向 TLS 要求服务端验证客户端证书,且客户端必须提供有效 CA 签发的证书。关键在于 tls.ConfigClientAuth 设为 tls.RequireAndVerifyClientCert,并加载可信客户端 CA 池。

HTTP 服务端配置示例

cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
    log.Fatal(err)
}
caCert, _ := os.ReadFile("client-ca.crt")
caPool := x509.NewCertPool()
caPool.AppendCertsFromPEM(caCert)

srv := &http.Server{
    Addr: ":8443",
    TLSConfig: &tls.Config{
        Certificates: []tls.Certificate{cert},
        ClientAuth:   tls.RequireAndVerifyClientCert, // 强制双向校验
        ClientCAs:    caPool,
    },
}

ClientAuth 启用后,任何未携带有效证书的请求将被 TLS 层直接拒绝(HTTP 400 或连接中断),无需应用层干预;ClientCAs 定义信任锚,缺失则校验失败。

gRPC 服务端配置要点

需通过 credentials.TransportCredentials 封装相同 tls.Config,gRPC 自动继承底层 TLS 行为。

组件 HTTP 服务端 gRPC 服务端
证书加载 tls.LoadX509KeyPair 同左,传入 credentials.NewTLS
CA 池设置 ClientCAs 字段 tls.Config.ClientCAs 相同
握手失败响应 TLS 连接终止 UNAVAILABLE 状态码

客户端握手流程

graph TD
    A[客户端发起连接] --> B[发送 ClientHello + 证书]
    B --> C[服务端校验证书签名/CN/有效期/吊销状态]
    C --> D{校验通过?}
    D -->|是| E[完成握手,建立加密通道]
    D -->|否| F[立即关闭连接]

2.4 基于crypto/tls的动态证书加载与热更新机制(支持Kubernetes Secret轮转)

传统 TLS 服务启动后证书即固化,无法响应 Secret 轮转。需绕过 tls.Config{Certificates: []tls.Certificate} 的静态初始化限制,改用 GetCertificate 回调实现运行时证书解析。

核心实现模式

  • 监听 Kubernetes API Server 的 Secret 变更事件(via Informer)
  • 将 PEM 内容缓存为内存证书池(sync.Map[string]*tls.Certificate
  • 每次 TLS 握手时按 SNI 动态返回最新证书
cfg := &tls.Config{
    GetCertificate: func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) {
        cert, ok := certCache.Load(hello.ServerName) // key: SNI host
        if !ok {
            return nil, errors.New("no cert for " + hello.ServerName)
        }
        return cert.(*tls.Certificate), nil
    },
}

GetCertificate 在每次握手前触发,避免锁竞争;certCache 由 Informer 更新线程安全写入,无需全局锁。

Secret 同步关键字段映射

Secret Key 用途 必填
tls.crt PEM 编码证书链 ✔️
tls.key PKCS#8 私钥 ✔️
ca.crt 可选根 CA 用于验证客户端
graph TD
    A[Informer Watch Secret] --> B[Parse tls.crt/tls.key]
    B --> C{Valid PEM?}
    C -->|Yes| D[Parse X509 & Signer]
    C -->|No| E[Log Warning, Skip]
    D --> F[Store in sync.Map]

2.5 mTLS性能压测与连接复用优化(benchmark对比与conn pool调优)

在高并发微服务场景下,mTLS握手开销显著影响吞吐量。我们使用 wrk 对 Envoy 代理的 mTLS endpoint 进行压测,对比启用/禁用连接池的 QPS 与 p99 延迟:

配置项 QPS p99延迟(ms) TLS握手耗时占比
无连接池(每请求新建) 1,240 328 67%
连接池(max 100) 8,960 42 9%

连接池关键参数调优

# envoy.yaml 片段:HTTP连接池配置
http_protocol_options:
  idle_timeout: 30s      # 防止空闲连接过早断连
  max_connection_duration: 300s  # 强制轮换,避免证书过期风险
  initial_stream_window_size: 65536

该配置平衡了证书有效期、内存占用与复用率;idle_timeout 需略小于下游服务的 keepalive timeout,避免 RST。

握手路径优化示意

graph TD
  A[Client Request] --> B{Conn Pool Hit?}
  B -->|Yes| C[Reuse TLS session + 0-RTT resumption]
  B -->|No| D[Full mTLS handshake: 2-RTT]
  C --> E[Forward to upstream]
  D --> E

第三章:SPIFFE身份体系在Go微服务中的落地

3.1 SPIFFE标准栈(SVID、Workload API、Trust Domain)原理与Go SDK设计哲学

SPIFFE 栈以零信任为根基,通过三个核心抽象解耦身份生命周期:SVID(SPIFFE Verifiable Identity Document)是 X.509 或 JWT 格式的可验证身份凭证;Workload API 是本地 UNIX socket 接口,供工作负载安全拉取/轮换 SVID;Trust Domain 则定义了身份命名空间与根 CA 边界(如 example.org)。

SVID 结构本质

SVID 不是静态证书,而是含 SPIFFE ID(spiffe://example.org/workload-abc)、短时效(默认1h)、由 Trust Domain 根 CA 签发的证书链,支持 OCSP Stapling 与在线吊销验证。

Go SDK 设计哲学

  • 接口即契约workloadapi.Fetcher 抽象网络细节,屏蔽 socket 连接、TLS 双向认证、重试逻辑;
  • 不可变性优先*x509.Certificate[]byte{key} 均封装为只读结构体,避免意外篡改;
  • 上下文驱动生命周期:所有 API 调用强制接收 context.Context,天然支持超时与取消。
// 使用 Go SDK 获取当前工作负载 SVID
client, err := workloadapi.NewClient(context.Background())
if err != nil {
    log.Fatal(err) // 处理 Workload API socket 连接失败(如路径错误、权限不足)
}
svid, err := client.FetchX509SVID(context.Background())
if err != nil {
    log.Fatal(err) // 可能因证书过期、CA 根不匹配或 API 服务不可用
}
// svid.Bundle() 返回 *spiffebundle.Bundle(含 Trust Domain 根 CA)
// svid.SVID() 返回 []*x509.Certificate(完整证书链)

上述调用隐式完成:连接 /run/spire/sockets/agent.sock → TLS 握手(Agent 自签客户端证书)→ 请求序列化 → 响应解析 → 证书链校验(验证 SPIFFE ID 格式、签名、有效期)。SDK 将复杂性封装在 workloadapi.Client 内部状态机中。

组件 职责 安全约束
Trust Domain 唯一标识身份域,绑定根 CA 必须全局唯一,不可跨域复用
SVID 工作负载运行时身份载体 有效期 ≤ 24h,禁止硬编码存储
Workload API 提供身份供给通道 仅限 localhost + Unix socket,强制双向 TLS
graph TD
    A[Workload] -->|1. context.WithTimeout| B[workloadapi.Client]
    B -->|2. dial unix:/run/spire/sockets/agent.sock| C[SPIRE Agent]
    C -->|3. 签发短时效 SVID + 根 CA Bundle| B
    B -->|4. 解析并校验 X.509 链| A

3.2 使用spiffe-go SDK集成Workload API获取短时效SVID并自动续期

SPIFFE Workload API 是工作负载获取和刷新 SVID(SPIFFE Verifiable Identity Document)的核心通道。spiffe-go SDK 提供了开箱即用的 workloadapi.NewX509Source,可自动处理证书轮换与续期。

自动续期机制原理

SDK 启动后台 goroutine 监听 Unix 域套接字,当 SVID 将在 1/3 TTL 内过期时主动触发刷新,确保服务始终持有有效凭证。

初始化 X509 证书源

source, err := workloadapi.NewX509Source(
    context.Background(),
    workloadapi.WithAddr("/run/spire/sockets/agent.sock"),
    workloadapi.WithClientOptions(workloadapi.WithLogger(log)),
)
if err != nil {
    log.Fatal(err)
}
defer source.Close()
  • WithAddr: 指定 SPIRE Agent Workload API 地址(默认 Unix socket)
  • WithClientOptions: 可注入日志、TLS 配置等扩展能力
  • source.Close():释放监听资源,避免 goroutine 泄漏

证书生命周期管理对比

行为 手动轮换 spiffe-go 自动续期
过期前干预 需定时检查 + 显式调用 自动触发,无业务侵入
错误容忍度 低(易因延迟导致中断) 高(内置重试 + 退避)
graph TD
    A[启动 X509Source] --> B[连接 Workload API]
    B --> C[获取初始 SVID]
    C --> D{是否临近过期?}
    D -- 是 --> E[异步请求新 SVID]
    D -- 否 --> F[继续提供当前证书]
    E --> F

3.3 Go服务间基于X.509-SVID的零信任授权决策(结合Open Policy Agent策略引擎)

在SPIFFE架构下,每个Go微服务通过Workload API获取X.509-SVID证书,该证书内嵌SPIFFE ID(如 spiffe://example.org/service/auth)及签发链,构成强身份凭证。

策略执行流程

// 验证SVID并提取主体信息后交由OPA评估
input := map[string]interface{}{
    "subject":  svid.URISANs[0].String(), // spiffe://...
    "method":   "POST",
    "resource": "/api/v1/users",
    "tls":      map[string]bool{"mutual": true},
}

→ 此结构将运行时上下文映射为OPA可理解的inputtls.mutual=true显式声明已通过mTLS双向认证,避免策略误判。

OPA策略示例(authz.rego

package authz

default allow := false

allow {
    input.tls.mutual
    input.subject == "spiffe://example.org/service/auth"
    input.method == "POST"
    input.resource == "/api/v1/users"
}

→ 策略强制要求:仅当SVID身份匹配且TLS已验证时才放行,消除隐式信任。

字段 来源 作用
subject SVID中URI SAN 唯一标识工作负载身份
tls.mutual Go TLS连接状态 证明客户端证书已成功校验

graph TD A[Go服务发起请求] –> B[加载本地SVID证书] B –> C[建立mTLS连接] C –> D[提取SVID与请求元数据] D –> E[调用OPA REST API /v1/data/authz/allow] E –> F[返回允许/拒绝决策]

第四章:生产级零信任架构工程化实践

4.1 Kubernetes环境下的SPIRE Agent部署与Go工作负载身份注入(Init Container + Volume Mount方案)

SPIRE Agent 以 DaemonSet 形式部署,确保每个节点运行一个实例,通过 Unix Domain Socket /run/spire/sockets/agent.sock 暴露 gRPC 接口。

初始化流程

  • Init Container 调用 spire-agent api fetch -socketPath /run/spire/sockets/agent.sock 获取 SVID;
  • 将证书、密钥及 bundle 挂载为 emptyDir 卷,供主容器读取;
  • Go 应用通过 spiffe:// URI 解析身份,无需硬编码凭证。

证书挂载结构

挂载路径 内容类型 用途
/run/spire/sockets Socket 文件 Agent gRPC 通信通道
/run/spire/workload TLS 证书目录 bundle.crt, svid.crt, svid.key
volumeMounts:
- name: spire-socket
  mountPath: /run/spire/sockets
  readOnly: true
- name: workload-identity
  mountPath: /run/spire/workload

该配置使 Go 工作负载通过 github.com/spiffe/go-spiffe/v2 包自动加载 SVID,WorkloadAPIClient 基于挂载路径构造安全信道,实现零信任身份上下文透传。

4.2 基于Go的轻量级Identity-aware Proxy实现(拦截HTTP/gRPC请求并验证SVID)

Identity-aware Proxy 作为零信任网关核心组件,需在协议层透明拦截并校验SPIFFE身份凭证(SVID)。

核心职责

  • 拦截入站 HTTP/gRPC 请求
  • 提取 x-spiffe-id 或 TLS 客户端证书
  • 调用 SPIRE Agent API 验证 SVID 有效性与绑定关系
  • 注入认证上下文至后端服务

SVID 验证流程

// 使用 SPIRE Agent Workload API 同步验证
resp, err := client.FetchX509SVID(ctx, &workload.FetchX509SVIDRequest{
    Hint: "proxy", // 可选标识
})
if err != nil {
    return nil, fmt.Errorf("failed to fetch SVID: %w", err)
}
// 验证证书链、SPIFFE ID 格式、过期时间及 URI SAN 绑定

该调用触发本地 Agent 与 SPIRE Server 的双向 TLS 协商;Hint 字段用于审计追踪;返回的 X509SVID 包含证书链、私钥和 JWT-SVID 备份。

请求处理决策矩阵

条件 动作
SVID 有效且 SPIFFE ID 匹配策略 允许 + 注入 spiffe_id header
证书过期或签名无效 拒绝(401)
无客户端证书(gRPC TLS) 拒绝(403)
graph TD
    A[HTTP/gRPC Request] --> B{Has Client Cert?}
    B -->|Yes| C[Extract SPIFFE ID]
    B -->|No| D[Reject 403]
    C --> E[Validate via SPIRE Agent]
    E -->|Valid| F[Forward + Inject Identity]
    E -->|Invalid| G[Reject 401]

4.3 零信任可观测性建设:mTLS连接指标采集(Prometheus)、SVID审计日志(structured logging)与证书过期告警

零信任架构下,可观测性需穿透加密信道,直抵身份与证书生命周期核心。

mTLS连接指标采集(Prometheus)

# prometheus.yml 片段:抓取SPIRE Agent的mTLS指标
scrape_configs:
- job_name: 'spire-agent'
  static_configs:
  - targets: ['localhost:8085']  # SPIRE Agent默认metrics端口
  metrics_path: '/metrics'
  scheme: https
  tls_config:
    ca_file: /run/spire/sockets/agent.sock.ca.pem
    cert_file: /run/spire/sockets/agent.sock.crt.pem
    key_file: /run/spire/sockets/agent.sock.key.pem

该配置启用双向TLS认证抓取,确保指标传输本身受零信任策略保护;ca_file验证Agent服务端身份,cert_file+key_file提供客户端SVID凭证,实现mTLS链路级可观测性闭环。

SVID审计日志结构化输出

字段 类型 示例值 说明
event_type string "svid_issued" 事件类型(issued/rotated/revoked)
spiffe_id string "spiffe://example.org/web" 主体唯一身份标识
expiry_ts int64 1735689200 Unix时间戳,用于驱动告警

证书过期告警逻辑

graph TD
  A[Prometheus定时拉取] --> B[expr: spire_agent_svid_ttl_seconds < 86400]
  B --> C{触发阈值?}
  C -->|是| D[AlertManager推送至PagerDuty/Slack]
  C -->|否| E[静默]

告警基于spire_agent_svid_ttl_seconds指标动态计算剩余有效期,避免硬编码过期时间,适配不同SVID TTL策略。

4.4 安全加固:Go二进制静态链接、seccomp profile配置与最小权限容器运行时策略

静态链接消除动态依赖风险

编译时启用 -ldflags '-extldflags "-static"' 可强制 Go 生成完全静态二进制:

CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o myapp .

CGO_ENABLED=0 禁用 cgo,避免引入 glibc 依赖;-extldflags "-static" 指示底层链接器静态链接所有系统库。结果二进制无 .dynamic 段,杜绝 LD_PRELOAD 类劫持。

seccomp 白名单精简系统调用

典型 default-restrictive.json 仅允许 53 个必要 syscalls(如 read, write, mmap, exit_group),禁用 open_by_handle_at, pivot_root 等高危调用。

最小权限运行时策略

策略项 推荐值 安全收益
--user 1001:1001 非 root UID/GID 运行
--cap-drop ALL + CAP_NET_BIND_SERVICE 仅保留端口绑定能力
--security-opt no-new-privileges 阻止进程通过 execve 提权
graph TD
    A[Go源码] --> B[CGO_ENABLED=0 静态编译]
    B --> C[无依赖二进制]
    C --> D[容器内加载seccomp profile]
    D --> E[受限syscalls执行]
    E --> F[非root用户+降权cap运行]

第五章:演进路径与前沿方向

从单体到服务网格的渐进式迁移实践

某省级政务云平台在2021年启动架构现代化改造,未采用“推倒重来”策略,而是以“流量染色+双注册中心”方式分阶段演进:第一阶段将核心审批服务拆分为独立模块,通过 Spring Cloud Alibaba Nacos 实现灰度路由;第二阶段引入 Istio 1.12,将 Envoy 代理以 sidecar 方式注入存量 Java 应用容器,复用原有 Dubbo 接口契约,仅修改 deployment.yaml 中的 annotation:sidecar.istio.io/inject: "true";第三阶段完成 mTLS 全链路加密与基于 SMI(Service Mesh Interface)标准的流量分割。整个过程历时14个月,系统可用性从99.5%提升至99.99%,故障平均定位时间缩短67%。

大模型驱动的运维知识图谱构建

深圳某金融科技公司基于 Llama 3-70B 微调专属运维大模型(FinOps-LM),接入 200+ 类日志源(包括 Prometheus metrics、ELK 日志、Zabbix 告警、Jenkins 构建记录),构建动态知识图谱。关键实现包括:使用 Neo4j 存储实体关系(如 :Service-[:DEPENDS_ON]->:Database),通过 LangChain 的 GraphCypherQAChain 自动生成 Cypher 查询;当 APM 系统检测到 payment-service RT 突增时,模型自动关联出 redis-cluster-03 内存使用率超阈值、k8s-node-17 CPU steal 时间异常两个根因节点,并生成修复建议:“执行 redis-cli --cluster rebalance redis://10.244.3.12:6379 --threshold 15 并扩容 node-17 的 kubelet cgroup memory limit”。

边缘AI推理的轻量化部署框架

在工业质检场景中,某汽车零部件厂商需在 NVIDIA Jetson Orin NX(8GB RAM)上部署 YOLOv8m 模型,原始 ONNX 模型体积达127MB,推理延迟>280ms。团队采用三阶段压缩:① 使用 TensorRT 8.6 进行 FP16 量化与层融合;② 基于 ONNX Runtime 的 GraphOptimizer 移除冗余 Reshape 节点;③ 自定义算子替换:将 Softmax + CrossEntropyLoss 替换为 FusedSoftmaxCE。最终模型体积压缩至23.4MB,端到端延迟降至89ms,满足产线每秒3帧的实时检测要求。部署流程通过 Ansible Playbook 自动化:

- name: Deploy optimized model to edge device
  hosts: jetson_nodes
  tasks:
    - copy:
        src: ./models/yolov8m_trt_fp16.engine
        dest: /opt/edgeai/models/
    - shell: trtexec --loadEngine=/opt/edgeai/models/yolov8m_trt_fp16.engine --warmUp=50 --duration=60

开源项目协同演进路线图

时间窗口 核心目标 关键技术选型 社区贡献成果
2024 Q3 支持 WebAssembly 插件沙箱 WasmEdge + WASI-NN 向 Envoy 提交 wasm-filter PR #12891
2025 Q1 实现跨集群策略一致性同步 KubeFed v0.12 + PolicyGen CRD 主导 CNCF SIG-Multicluster 白皮书草案
2025 Q3 构建可观测性数据联邦查询引擎 ClickHouse + PromQL Federation 开源 promql-federator v2.3

面向合规的零信任网络切片实施

某医疗影像云平台依据《GB/T 39786-2021》等保三级要求,在 Kubernetes 集群中实施微隔离:使用 Cilium 1.14 的 eBPF 策略引擎替代 iptables,为 PACS 影像存储服务定义细粒度策略——仅允许 pacs-web 命名空间内带 role=viewer 标签的 Pod 访问 pacs-db 的 5432 端口,且必须携带 JWT 令牌经 authz-gateway 验证。策略配置片段如下:

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: pacs-db-policy
spec:
  endpointSelector:
    matchLabels:
      app: pacs-db
  ingress:
  - fromEndpoints:
    - matchLabels:
        "k8s:io.kubernetes.pod.namespace": pacs-web
        role: viewer
    toPorts:
    - ports:
      - port: "5432"
        protocol: TCP
    rules:
      http:
      - method: "POST"
        path: "/v1/auth/token/validate"

该方案使横向移动攻击面收敛92%,并通过 Cilium 的 cilium monitor --type l7 实时捕获所有 HTTP 层访问行为,满足审计日志留存180天的监管要求。

专注 Go 语言实战开发,分享一线项目中的经验与踩坑记录。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注