Security · #architecture#security#zero-trust

零信任架构设计与实施指南

2025.06.01 7 min 2.7k
// 目录 · contents

前言

传统的”城堡与护城河”安全模型假设内网是安全的,外网是不可信的。随着云计算、远程办公和微服务架构的普及,网络边界变得模糊,这种假设不再成立。零信任架构(Zero Trust Architecture, ZTA)的核心理念是”永不信任,始终验证”(Never Trust, Always Verify)。本文将深入探讨零信任的核心原则和实施方案。

传统安全模型 vs 零信任

graph TB
    subgraph "传统模型: 城堡与护城河"
        FW1[防火墙/VPN] --> INTERNAL[内部网络]
        INTERNAL --> S1[服务A]
        INTERNAL --> S2[服务B]
        INTERNAL --> S3[数据库]
        ATTACKER[攻击者] -.->|突破边界后<br>横向移动自由| INTERNAL
        style ATTACKER fill:#d32f2f,color:#fff
    end

    subgraph "零信任模型: 无边界"
        USER[用户/设备] --> PEP1[策略执行点]
        PEP1 --> |验证身份+设备+上下文| PA1[服务A]
        USER --> PEP2[策略执行点]
        PEP2 --> |验证身份+设备+上下文| PA2[服务B]
        USER --> PEP3[策略执行点]
        PEP3 --> |验证身份+设备+上下文| PA3[数据库]
        ATTACKER2[攻击者] -.->|每次访问都需验证<br>横向移动困难| PEP1
        style ATTACKER2 fill:#d32f2f,color:#fff
    end

零信任核心原则

NIST零信任原则(SP 800-207)

mindmap
  root((零信任原则))
    身份为中心
      所有资源访问<br>需要身份验证
      最小权限原则
      动态策略决策
    假设被攻破
      微隔离
      持续监控
      自动化响应
    显式验证
      多因素认证
      设备合规性
      网络位置无关
    数据保护
      加密传输
      数据分类
      DLP策略

七大原则详述:

  1. 所有数据源和计算服务都被视为资源
  2. 无论网络位置如何,所有通信都必须安全
  3. 对单个企业资源的访问按会话授予
  4. 资源访问由动态策略决定
  5. 企业监控所有资产的完整性和安全态势
  6. 所有资源认证和授权在访问前严格执行
  7. 企业收集资产、网络、通信的状态信息以改进安全态势

BeyondCorp模型

Google的BeyondCorp是零信任架构的先驱实践。

graph TB
    subgraph "BeyondCorp Architecture"
        USER[User + Device] --> AP[Access Proxy<br>入口代理]
        AP --> ACE[Access Control Engine<br>访问控制引擎]

        ACE --> |查询| TI[Trust Inferer<br>信任推断器]
        ACE --> |查询| POLICY[Policy Engine<br>策略引擎]

        TI --> DD[Device Database<br>设备数据库]
        TI --> UD[User Database<br>用户数据库]
        TI --> CERT[Certificate Authority]

        POLICY --> |决策| ACE
        ACE --> |允许/拒绝| AP
        AP --> |安全访问| RESOURCES[Internal Resources]
    end

核心组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 零信任核心组件
components:
identity_provider:
description: "身份认证中心"
examples:
- Okta
- Azure AD (Entra ID)
- Google Workspace
capabilities:
- SSO (Single Sign-On)
- MFA (Multi-Factor Authentication)
- Conditional Access

policy_engine:
description: "策略决策点 (PDP)"
inputs:
- user_identity
- device_posture
- location
- time
- resource_sensitivity
- behavioral_analysis
output: "allow / deny / step_up_auth"

policy_enforcement:
description: "策略执行点 (PEP)"
implementations:
- reverse_proxy # 应用层
- service_mesh # 微服务
- network_gateway # 网络层
- endpoint_agent # 终端

continuous_monitoring:
description: "持续监控"
data_sources:
- SIEM
- EDR
- UEBA
- Network flow

身份验证(Identity Verification)

多因素认证(MFA)

sequenceDiagram
    participant U as User
    participant App as Application
    participant IdP as Identity Provider
    participant MFA as MFA Service

    U->>App: 访问请求
    App->>IdP: 重定向到认证
    U->>IdP: 用户名 + 密码
    IdP->>IdP: 评估风险等级

    alt 低风险 (已知设备, 常用位置)
        IdP->>App: 认证成功 + Token
    else 中风险 (新位置)
        IdP->>MFA: 请求二次验证
        MFA->>U: Push通知 / TOTP
        U->>MFA: 确认
        MFA->>IdP: 验证通过
        IdP->>App: 认证成功 + Token
    else 高风险 (异常行为)
        IdP->>U: 要求硬件密钥 (FIDO2/WebAuthn)
        U->>IdP: 硬件密钥验证
        IdP->>App: 认证成功 + Token (受限权限)
    end

条件访问策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 条件访问策略引擎(概念示意)
class ConditionalAccessEngine:
def evaluate(self, request_context):
"""评估访问请求,返回决策"""
user = request_context.user
device = request_context.device
resource = request_context.resource
location = request_context.location

# 规则1: 非托管设备只能访问低敏感资源
if not device.is_managed and resource.sensitivity > "low":
return Decision.DENY

# 规则2: 特权账户必须使用硬件MFA
if user.is_privileged and not request_context.mfa_method == "fido2":
return Decision.STEP_UP_AUTH

# 规则3: 异常位置需要额外验证
if self.is_anomalous_location(user, location):
return Decision.REQUIRE_MFA

# 规则4: 设备不合规则拒绝
if not device.is_compliant:
return Decision.DENY

# 规则5: 基于风险评分
risk_score = self.calculate_risk(request_context)
if risk_score > 80:
return Decision.DENY
elif risk_score > 50:
return Decision.STEP_UP_AUTH

return Decision.ALLOW

def calculate_risk(self, ctx):
"""计算综合风险评分 (0-100)"""
score = 0
score += self.user_risk_score(ctx.user) # 0-30
score += self.device_risk_score(ctx.device) # 0-30
score += self.network_risk_score(ctx.network) # 0-20
score += self.behavior_risk_score(ctx) # 0-20
return min(score, 100)

微隔离(Micro-Segmentation)

微隔离将网络划分为细粒度的安全域,限制横向移动。

graph TB
    subgraph "传统网络分段"
        direction LR
        VLAN1[VLAN 1: Web] --- VLAN2[VLAN 2: App] --- VLAN3[VLAN 3: DB]
        NOTE1[粗粒度,VLAN内自由通信]
    end

    subgraph "微隔离"
        WEB1[Web-1] -->|HTTPS only| APP1[App-1]
        WEB2[Web-2] -->|HTTPS only| APP2[App-2]
        APP1 -->|Port 5432 only| DB1[DB-Primary]
        APP2 -->|Port 5432, Read only| DB2[DB-Replica]
        WEB1 -.x APP2
        WEB2 -.x APP1
        APP1 -.x DB2
    end

Kubernetes网络策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Kubernetes NetworkPolicy示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-server-policy
namespace: production
spec:
podSelector:
matchLabels:
app: api-server
policyTypes:
- Ingress
- Egress
ingress:
# 只允许来自网关的流量
- from:
- podSelector:
matchLabels:
app: api-gateway
ports:
- protocol: TCP
port: 8080
egress:
# 只允许访问数据库
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- protocol: TCP
port: 5432
# 允许DNS查询
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53

服务网格实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Istio AuthorizationPolicy
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: payment-service-policy
namespace: production
spec:
selector:
matchLabels:
app: payment-service
rules:
- from:
- source:
principals:
- cluster.local/ns/production/sa/order-service
to:
- operation:
methods: ["POST"]
paths: ["/api/v1/payments"]
when:
- key: request.auth.claims[scope]
values: ["payment:write"]

设备信任(Device Trust)

flowchart TB
    DEVICE[设备接入] --> CHECK1{设备已注册?}
    CHECK1 -->|否| REGISTER[引导注册MDM]
    CHECK1 -->|是| CHECK2{设备证书有效?}

    CHECK2 -->|否| BLOCK1[拒绝访问]
    CHECK2 -->|是| CHECK3{合规性检查}

    CHECK3 --> OS[OS版本最新?]
    CHECK3 --> AV[防病毒运行?]
    CHECK3 --> DISK[磁盘加密?]
    CHECK3 --> FW[防火墙开启?]
    CHECK3 --> JAIL[未越狱/Root?]

    OS & AV & DISK & FW & JAIL --> SCORE{合规评分}

    SCORE -->|合规| FULL[完整访问]
    SCORE -->|部分合规| LIMITED[受限访问<br>+修复提示]
    SCORE -->|不合规| BLOCK2[拒绝访问<br>+强制修复]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设备合规性检查(概念)
class DevicePostureCheck:
def evaluate(self, device):
checks = {
"os_updated": self.check_os_version(device),
"disk_encrypted": self.check_encryption(device),
"antivirus_active": self.check_antivirus(device),
"firewall_enabled": self.check_firewall(device),
"not_jailbroken": self.check_integrity(device),
"certificate_valid": self.check_device_cert(device),
"mdm_enrolled": self.check_mdm(device),
}

passed = sum(1 for v in checks.values() if v)
total = len(checks)
score = passed / total * 100

if score == 100:
return PostureResult.COMPLIANT
elif score >= 70:
return PostureResult.PARTIALLY_COMPLIANT
else:
return PostureResult.NON_COMPLIANT

持续授权(Continuous Authorization)

零信任不是”一次验证,永远信任”,而是持续评估。

sequenceDiagram
    participant U as User Session
    participant PDP as Policy Decision Point
    participant SIEM as SIEM/UEBA
    participant EDR as EDR Agent

    loop 每N分钟 或 触发事件
        PDP->>SIEM: 查询用户行为异常?
        SIEM-->>PDP: 风险评分

        PDP->>EDR: 查询设备安全态势?
        EDR-->>PDP: 设备合规状态

        alt 风险升高
            PDP->>U: 要求重新认证
        else 设备不合规
            PDP->>U: 降级权限或断开
        else 正常
            PDP->>U: 继续允许访问
        end
    end

实施路线图

gantt
    title 零信任实施路线图
    dateFormat YYYY-MM
    axisFormat %Y-%m

    section 阶段1: 基础
    资产盘点与分类                :a1, 2025-01, 2M
    统一身份管理 (IdP)           :a2, 2025-02, 3M
    全面启用MFA                  :a3, 2025-03, 2M
    网络流量加密 (mTLS)          :a4, 2025-04, 2M

    section 阶段2: 增强
    设备管理 (MDM/UEM)           :b1, 2025-06, 3M
    微隔离 (网络策略)            :b2, 2025-07, 3M
    条件访问策略                  :b3, 2025-08, 2M
    日志集中与SIEM               :b4, 2025-08, 3M

    section 阶段3: 成熟
    UEBA行为分析                 :c1, 2025-11, 3M
    自动化响应 (SOAR)            :c2, 2026-01, 3M
    持续合规监控                  :c3, 2026-02, 2M
    红队演练与优化                :c4, 2026-03, 2M

分阶段实施建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 阶段1: 身份优先 (3-6个月)
phase_1:
goals:
- "知道谁在访问什么"
actions:
- deploy_idp: "部署统一身份提供商 (Okta/Azure AD)"
- enable_sso: "所有应用接入SSO"
- enforce_mfa: "全员强制MFA"
- inventory: "完成资产和数据分类"
quick_wins:
- "淘汰VPN直连,改用身份感知代理"
- "禁用共享账户"

# 阶段2: 设备与网络 (6-12个月)
phase_2:
goals:
- "只有合规设备可以访问"
actions:
- deploy_mdm: "部署终端管理"
- micro_segment: "实施网络微隔离"
- conditional_access: "部署条件访问策略"
- centralize_logs: "日志集中到SIEM"

# 阶段3: 持续验证 (12-18个月)
phase_3:
goals:
- "实时检测和响应威胁"
actions:
- deploy_ueba: "部署用户行为分析"
- automate_response: "自动化安全响应"
- continuous_compliance: "持续合规检查"
- red_team: "定期红队演练"

技术栈参考

领域 开源方案 商业方案
身份提供商 Keycloak Okta, Azure AD
设备管理 - Intune, Jamf
网络代理 Pomerium, Teleport Zscaler, Cloudflare Access
服务网格 Istio, Linkerd Consul Connect
SIEM Wazuh, ELK Splunk, Sentinel
EDR OSSEC, Velociraptor CrowdStrike, SentinelOne

总结

零信任不是一个产品,而是一种安全架构理念。实施零信任的核心要点:

  1. 身份为中心:所有访问都基于身份验证和授权,而非网络位置
  2. 最小权限:只授予完成工作所需的最小权限
  3. 微隔离:即使攻击者进入内部,也无法自由横向移动
  4. 持续验证:不是一次认证永远信任,而是持续评估风险
  5. 渐进实施:从身份管理开始,逐步增强设备管理和行为分析

零信任是一个持续的旅程,而非一次性项目。从身份管理和MFA开始,逐步扩展到设备信任、微隔离和持续授权,是最务实的实施路径。

作者 · authorzt
发布 · date2025-06-01
篇幅 · length2.7k 字 · 7 min
许可 · licenseCC BY-SA 4.0
$ echo "comments" · 评论