零信任(Zero Trust)安全模型彻底改变了传统的网络边界安全思维。在云计算、移动办公、远程工作的时代,“内网即安全"的假设已不成立。本文深入解析零信任的核心理念、架构设计与企业级落地实践。
1. 传统边界安全的问题
传统"城堡+护城河"模型:
互联网
│
┌──────┴──────┐
│ Firewall │ ← 边界防护
└──────┬──────┘
│
企业内网 ◄─── 一旦进入,自由访问
/ │ \
PC 服务器 打印机
问题:
- VPN 一旦打通,用户可访问整个内网
- 内网横向移动容易
- 云/移动端点不在边界内
- 内部威胁无法防范
2. 零信任核心原则
2.1 三大基本原则
| 原则 | 含义 | 传统 vs 零信任 |
|---|---|---|
| 永不信任,始终验证 | 不基于网络位置信任任何请求 | 内网免登录 → 每次请求都验证身份 |
| 最小权限访问 | 只授予完成工作所需的最小权限 | 网络段访问 → 应用级细粒度授权 |
| 假设已突破 | 设计时假设攻击者已在网络内 | 边界防御 → 微隔离 + 持续监控 |
2.2 NIST 零信任架构(SP 800-207)
┌─────────────────────────────────────────────────────────────┐
│ 零信任架构核心组件 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Policy │ │ Policy │ │ Policy │ │
│ │ Engine │◄──►│ Decision │ │ Enforcement│ │
│ │ (PE) │ │ Point (PDP)│ │ Point (PEP)│ │
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ │ 持续评估 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 数据平面 │ │
│ │ Subject → Authentication → Authorization → Resource │ │
│ │ │ │ │ │ │ │
│ │ │ Identity Access Asset │ │
│ │ │ Provider Policy Database │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
3. Google BeyondCorp 实践
3.1 架构概览
Google BeyondCorp(2014 年起全面实践,无内部 VPN):
员工设备 ──► 互联网 ──► Access Proxy(身份感知代理)
│
├──► 设备证书验证(设备注册)
├──► 用户身份验证(SSO)
├──► 设备健康检查(补丁/加密)
└──► 策略引擎决策
│
▼
允许访问特定应用
(不能访问其他内网资源)
3.2 关键组件
| 组件 | 功能 |
|---|---|
| Device Inventory | 所有设备注册,发放唯一证书 |
| User/Group Database | 身份与组织架构 |
| Access Proxy | 单点入口,强制认证 |
| Trust Inference | 动态评估设备/用户信任度 |
| Access Control Engine | 实时策略决策 |
4. mTLS 双向认证
4.1 TLS vs mTLS
TLS(单向):
Client ──► Server
│ │
│ └── 服务端证书(客户端验证)
│ └── 客户端无需证书
mTLS(双向):
Client ────────► Server
│ │
│◄── 服务端证书──┤ (客户端验证服务器身份)
├── 客户端证书──►│ (服务器验证客户端身份)
4.2 服务网格 mTLS
# Istio 自动 mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT # 强制 mTLS,拒绝明文通信
---
# 自动证书轮转(Citadel/Istiod 管理)
# 无需应用修改,Sidecar 自动处理 TLS
4.3 自签名 mTLS 实现
# 1. 创建 CA
openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \
-out ca-cert.pem -days 365 -nodes \
-subj "/CN=my-ca"
# 2. 服务端证书
openssl req -newkey rsa:4096 -keyout server-key.pem \
-out server-req.pem -nodes \
-subj "/CN=server"
openssl x509 -req -in server-req.pem -CA ca-cert.pem \
-CAkey ca-key.pem -out server-cert.pem -days 365
# 3. 客户端证书(同理)
# 4. Nginx 配置
server {
listen 443 ssl;
ssl_certificate /etc/nginx/server-cert.pem;
ssl_certificate_key /etc/nginx/server-key.pem;
ssl_client_certificate /etc/nginx/ca-cert.pem;
ssl_verify_client on; # 强制客户端证书
}
5. SPIFFE/SPIRE: 工作负载身份
5.1 为什么需要工作负载身份
传统身份:基于 IP、主机名(动态环境中不可靠)
零信任需要:工作负载的密码学身份
- 不依赖网络位置
- 可自动签发与轮换
- 跨集群/云可验证
5.2 SPIFFE 标准
SPIFFE ID: spiffe://trust-domain/path
示例:
spiffe://production.example.com/ns/default/sa/backend
spiffe://production.example.com/ns/payment/sa/api
SVID(SPIFFE Verifiable Identity Document):
- X.509-SVID:X.509 证书,含 SPIFFE ID
- JWT-SVID:JWT Token,含 SPIFFE ID
5.3 SPIRE 部署
# SPIRE Server(控制平面)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: spire-server
spec:
template:
spec:
containers:
- name: spire-server
image: ghcr.io/spiffe/spire-server:latest
args:
- -config
- /run/spire/config/server.conf
---
# SPIRE Agent(每个节点运行)
apiVersion: DaemonSet
kind: DaemonSet
metadata:
name: spire-agent
---
# 工作负载注册
apiVersion: spire.spiffe.io/v1alpha1
kind: ClusterSPIFFEID
metadata:
name: backend-workload
spec:
spiffeIDTemplate: "spiffe://example.com/ns/{{ .PodMeta.Namespace }}/sa/{{ .PodSpec.ServiceAccountName }}"
podSelector:
matchLabels:
app: backend
5.4 使用 SVID
// gRPC + mTLS + SPIFFE
SpiffeId spiffeId = SpiffeId.parse("spiffe://example.com/ns/default/sa/client");
SslContext sslContext = SslContextBuilder.forClient()
.trustManager(spiffeTrustManager()) // 验证 SPIFFE ID
.keyManager(spiffeKeyManager()) // 使用 SVID
.build();
ManagedChannel channel = NettyChannelBuilder.forAddress("server", 443)
.sslContext(sslContext)
.build();
// 服务端验证客户端 SPIFFE ID
public void verifyPeer(SpiffeId peerId) {
if (!peerId.toString().startsWith("spiffe://example.com/ns/payment/")) {
throw new SecurityException("Unauthorized workload");
}
}
6. 微隔离(Micro-segmentation)
6.1 与网络分段的区别
| 维度 | 网络分段(VLAN) | 微隔离 |
|---|---|---|
| 粒度 | 子网/网段 | 工作负载/进程/端口 |
| 动态性 | 静态配置 | 随工作负载自动调整 |
| 位置 | 网络设备 | 主机/容器/Sidecar |
| 策略 | IP/子网 | 身份/标签/属性 |
6.2 Calico 网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: payment-policy
spec:
podSelector:
matchLabels:
app: payment
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
tier: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- protocol: TCP
port: 5432
6.3 零信任网络策略原则
默认拒绝(Default Deny):
- 没有明确允许 = 拒绝
- 所有工作负载初始无通信权限
最小连接:
- 只允许必要的服务间通信
- 按端口、协议、方向细粒度控制
持续验证:
- 通信双方身份验证
- 策略实时更新
- 异常流量检测
7. 身份感知代理(IAP)
用户 ──► IAP/Google Cloud Armor ──► 后端服务
│
├── 认证(OAuth/OIDC)
├── 设备状态检查
├── 地理位置限制
├── 访问时间限制
└── 自定义策略
IAP 决策日志:
- 谁(身份)
- 什么时间
- 从什么设备
- 访问什么资源
- 允许/拒绝
8. 零信任实施路线图
Phase 1: 资产盘点与分类
└── 识别所有用户、设备、应用、数据
Phase 2: 身份基础
└── SSO、MFA、设备注册、证书管理
Phase 3: 网络分段
└── 微隔离、南北向流量控制
Phase 4: 应用访问代理
└── IAP部署、策略引擎
Phase 5: 持续监控与优化
└── UEBA、异常检测、策略迭代
9. 总结
零信任不是产品,而是安全范式的转变:
传统思维:"我在内网,所以安全"
零信任:"无论在哪,都要证明你是谁,并且只给你必要的权限"
实现路径:
网络边界 ──► 身份边界
静态规则 ──► 动态策略
网络位置 ──► 密码学身份
定期审计 ──► 持续验证
零信任的建设需要数年时间,但每走一步都在提升安全水位。对于云原生环境,服务网格(Istio + mTLS)+ SPIRE + 网络策略是最接近零信任的技术组合。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。