Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

零信任架构实战 2026

TL;DR:零信任不再是大厂专利。SPIFFE/SPIRE 已成云原生身份标准,本文从 SPIFFE Workload ID → SVID 签发 → mTLS 通信 → 策略决策(OPA),构建完整的 Go 零信任网络。

一、零信任三大核心要素

┌──────────────────────────────────────┐
│  Decision (策略)                      │
│  ┌─────────────┐                     │
│  │ OPA / Cedar │                     │
│  └──────┬──────┘                     │
└─────────┼────────────────────────────┘
          │ allow?
┌─────────┼────────────────────────────┐
│  Identity (身份)        │
│  ┌──────┴──────┐   ┌──────────┐  │
│  │ SPIFFE/SVID │ + │ 设备证明  │  │
│  └──────┬──────┘   └────┬─────┘  │
└─────────┼──────────────────────────────┘
          │ mTLS
┌─────────┼────────────────────────────┐
│  Workload (工作负载)                  │
│  Service A ↔ Service B              │
└──────────────────────────────────────┘

关键原则:never trust, always verify。每次访问都验证:你是谁(identity)、从哪来(device + network)、能做什么(policy)。

二、SPIFFE/SPIRE 基础

2.1 SPIFFE ID

格式:spiffe://trust-domain/path

例:spiffe://prod.example.com/ns/payments/sa/order-svc

2.2 SVID 签发

SPIRE Agent 监听 workload 启动,通过 Unix Domain Socket 提供 X.509 SVID:

go
import (
    github.com/spiffe/go-spiffe/v2/workloadapi
    github.com/spiffe/go-spiffe/v2/svid/x509svid
)

func main() {
    ctx := context.Background()
    source, _ := workloadapi.NewX509Source(ctx)
    defer source.Close()

    svid, err := source.GetX509SVID()
    if err != nil { log.Fatal(err) }

    // svid.ID = spiffe://prod.example.com/ns/payments/sa/order-svc
    // svid.Certificates[0] = X.509 SVID
    log.Printf(My SPIFFE ID: %s, svid.ID)
}

2.3 部署 SPIRE(K8s)

bash
helm install spire spire/spire \
  --set server.trustDomain=prod.example.com \
  --set server.config.nestedSpireAgent.enabled=true

三、Go 服务间 mTLS

3.1 服务端

go
import (
    google.golang.org/grpc
    google.golang.org/grpc/credentials
    github.com/spiffe/go-spiffe/v2/grpccredentials
)

func newServer() *grpc.Server {
    source, _ := workloadapi.NewX509Source(context.Background())
    tlsConfig := grpccredentials.MTLSConfig(source, source, mtlsWithAllowedSPIFFEIDs(
        spiffeid.RequireFromString(spiffe://prod.example.com/ns/payments/sa/order-svc),
    ))
    return grpc.NewServer(grpc.Creds(credentials.NewTLS(tlsConfig)))
}

3.2 客户端

go
func newClient(target string) (*grpc.ClientConn, error) {
    source, _ := workloadapi.NewX509Source(context.Background())
    tlsConfig := grpccredentials.MTLSConfig(source, source, mtlsWithAllowedSPIFFEIDs(
        spiffeid.RequireFromString(spiffe://prod.example.com/ns/payments/sa/inventory-svc),
    ))
    return grpc.NewClient(target, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)))
}

调用前 SPIRE 自动验证对端 SVID 在 allowlist 中,未授权则直接拒绝。

四、策略决策:OPA / Cedar

4.1 OPA Rego 策略示例

rego
package authz

default allow := false

allow {
    input.client_spiffe_id == spiffe://prod.example.com/ns/payments/sa/order-svc
    input.method == POST
    input.path == [/v1/orders]
    input.device_trust_level >= 3
    input.time_in_hours >= [time_range_start, time_range_end]
}

4.2 在 Go 中调用 OPA

go
import github.com/open-policy-agent/opa/rego

func authorize(req Request) bool {
    r := rego.New(
        rego.Query(data.authz.allow),
        rego.Load([]string{policy/authz.rego}),
    )
    rs, _ := r.Eval(context.Background(), rego.EvalInput(req))
    return rs[0].Expressions[0].Value.(bool)
}

五、零信任网关(BeyondCorp 风格)

5.1 Identity-Aware Proxy

go
func IAPMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 1. 验证 Bearer Token(用户身份)
        user := verifyIDToken(r.Header.Get(Authorization))
        if user == nil {
            http.Error(w, unauthorized, 401)
            return
        }

        // 2. 验证设备信任分(Google 称之为 Device Trust)
        if !checkDeviceTrust(r.UserAgent(), r.Header.Get(X-Device-ID)) {
            http.Error(w, untrusted device, 403)
            return
        }

        // 3. 上下文:时间、地理位置、风险评分
        if !isAllowedContext(user, r) {
            http.Error(w, access denied, 403)
            return
        }

        next.ServeHTTP(w, r)
    })
}

5.2 与 SPIFFE 联动

  • 用户身份:OIDC(Google/Azure AD)
  • 服务身份:SPIFFE
  • 设备身份:Intune / Jamf / Kandji
  • 上下文:Cloudflare Access / BeyondCorp

六、零信任迁移路径

阶段 1:身份基础设施

  • 部署 SPIRE(1-2 周)
  • 把核心服务 SPIFFE 化(4-8 周)
  • mTLS 灰度

阶段 2:策略层

  • 引入 OPA
  • 把 ACL 改为 Rego 策略
  • 灰度 10% → 50% → 100%

阶段 3:用户体验

  • 员工通过 IAP 访问内部应用(无需 VPN)
  • 设备合规性检查
  • 移除 VPN

七、ROI 估算

某 5000 人企业的真实数据:

  • VPN 维护成本:$280k/年
  • VPN 解除后释放带宽:120TB/月
  • 安全事件减少:67%
  • 员工远程接入效率提升:+28%

八、参考

  • SPIFFE 官方规范
  • Google BeyondCorp 论文
  • OPA Rego 文档
  • Cloudflare Access 案例

系列导航:Cisco ISE 漏洞 → LiteLLM MCP 注入 → 本篇

上次更新于: