Language:Chinese VersionEnglish Version

零信任不是产品——它是一种设计理念

走进2026年的任何企业安全对话,你都会听到”零信任”被提到至少十几次。供应商销售零信任防火墙、零信任VPN和零信任一切。但实际概念——它所要求的架构转变——却被营销噪音所掩盖。本指南通过具体的实现模式、真实的配置示例以及对零信任在工程努力(而不仅仅是美元)方面成本的诚实评估,穿透了这些噪音。

零信任起源于John Kindervag在2010年发表的一份Forster研究报告,他观察到传统网络安全运作在一个危险的假设上:边界内的一切都是可信的。一旦攻击者突破边界——他们最终总会做到——他们就可以以最小的阻力横向移动。零信任的答案简单明了但难以实施:永不信任,始终验证,无论请求来自何处。

三大核心原则

每个零信任实施,无论供应商或规模如何,都必须实施三项原则。这些不是可选层——它们是结构基础。

1. 明确验证每个身份

不应仅基于网络位置信任任何请求。来自10.0.0.5的请求并不比来自203.0.113.42的请求 inherently 更可信。每个身份——人类用户、服务账户或机器身份——在访问每个资源时都必须经过身份验证和授权。

在实践中,这意味着从网络级访问控制转向身份感知代理。Google的BeyondCorp模式(它启发了现代零信任思维的许多方面)用身份感知访问代理取代了基于VPN的访问,这些代理在授予访问权限前会评估多个信号:

# 示例:带有外部授权过滤器的Envoy代理
# 此配置在将请求传递到上游之前,会将每个请求发送到authz服务

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          http_filters:
          - name: envoy.filters.http.ext_authz
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
              grpc_service:
                envoy_grpc:
                  cluster_name: ext-authz
              failure_mode_allow: false
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

failure_mode_allow: false 设置至关重要。如有疑问,一律拒绝——这是零信任的核心原则。

2. 使用最小权限访问

访问权限应限制在完成任务所需的最低范围内。这适用于人类身份、服务账户,甚至是临时令牌。考虑一个从数据库读取客户订单的微服务。传统的访问控制为该服务提供一个具有整个订单表读取权限的数据库用户。零信任要求您提出更深入的问题:它是否需要访问所有列?它是否需要访问所有客户的订单,还是只需要访问当前正在处理的订单?

-- PostgreSQL: 面向服务范围的行级安全
CREATE POLICY order_service_read ON orders
  FOR SELECT
  TO order_service_role
  USING (
    tenant_id = current_setting('app.current_tenant_id')::uuid
    AND created_at > NOW() - INTERVAL '90 days'
  );

-- 服务在连接时设置其租户上下文:
SET app.current_tenant_id = '3f7a8b2c-1234-5678-abcd-ef0123456789';
SELECT * FROM orders WHERE status = 'pending';

这迫使服务声明其操作上下文,并在其凭证被泄露时限制影响范围。

3. 假设已被入侵

设计系统时要假设攻击者已经可以访问您网络的某些部分。这种思维转变改变了您处理日志、网络分段和事件响应的方式。您不再问”我们如何阻止攻击者进入?”而是问”我们能够多快检测到横向移动并控制损害?”

实际实施:分阶段方法

大多数组织无法一夜之间转变为零信任。转型需要在身份、设备、应用程序和网络方面分阶段进行。以下是一个针对10至50名工程师团队的18个月现实路线图。

阶段1(第1-3个月):身份基础

首先,您需要一个强大的身份提供商。如果您尚未使用具有多因素认证强制执行、OIDC/SAML支持和设备信任信号的身份提供商,这就是起点。具体供应商不如这些不可协商的功能重要:

  • 防钓鱼多因素认证(FIDO2/WebAuthn,而非短信OTP)
  • 基于设备健康和位置的条件访问策略
  • 使用短期凭证的服务账户管理
  • 对所有认证事件的全面审计日志

根据谷歌在实施BeyondCorp后的内部研究,仅部署防钓鱼多因素认证就能将账户被盗风险降低99%以上。这是您最高效的第一步。

阶段2(第3-8个月):应用程序访问代理

使用身份感知代理替代基于 VPN 的内部应用访问。Cloudflare Access、Google IAP 和 Pomerium 都是可行的选择。代理会拦截每个请求,验证用户身份令牌,检查策略,然后才转发到后端。

# Pomerium 策略示例 (pomerium/config.yaml)
policy:
  - from: https://grafana.internal.example.com
    to: http://grafana.default.svc.cluster.local:3000
    allowed_groups:
      - engineering@example.com
    require_mfa: true

  - from: https://vault.internal.example.com
    to: http://vault.vault.svc.cluster.local:8200
    allowed_users:
      - infra-lead@example.com
      - security@example.com
    require_mfa: true
    set_request_headers:
      X-Pomerium-Claim-Email: "{claim.email}"
      X-Pomerium-Claim-Groups: "{claim.groups}"

注意 Pomerium 会注入身份头信息,上游应用可用于精细化的授权。后端 Grafana 实例不再需要自己的身份验证——这一关注点已在代理层处理。

第三阶段(第 8-14 个月):服务间相互 TLS

人到应用的访问只是问题的一半。服务间通信也需要身份验证。相互 TLS (mTLS) 通过要求连接双方出示证书来解决这个问题。像 Istio 或 Linkerd 这样的服务网格可以透明地实现 mTLS,而无需更改应用代码。

# Istio PeerAuthentication: 对命名空间中的所有服务强制执行 mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT

---
# AuthorizationPolicy: 只允许特定服务调用支付服务
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: payments-authz
  namespace: production
spec:
  selector:
    matchLabels:
      app: payments-service
  rules:
  - from:
    - source:
        principals:
          - "cluster.local/ns/production/sa/order-service"
          - "cluster.local/ns/production/sa/refund-service"
    to:
    - operation:
        methods: ["POST"]
        paths: ["/api/v1/charge", "/api/v1/refund"]

此策略意味着支付服务只接受来自两个特定服务账户的 POST 请求,且只能访问两个特定端点。即使受损的前端服务能够访问网络地址,也无法调用支付端点。

第四阶段(第 14-18 个月):持续验证和异常检测

零信任不是一次性配置。访问决策应纳入实时信号:此设备是否仍然合规?用户行为是否发生变化?此请求模式与其历史使用是否一致?

像 Elastic Security、Microsoft Sentinel 和 Splunk Enterprise Security 这样的 UEBA(用户和实体行为分析)工具可以建立正常行为基线并标记偏差。当一个通常访问三个内部服务的开发者突然在一小时内开始扫描 40 个服务时,这是一个值得调查的信号——即使他们的凭据是有效的。

常见失败模式

将零信任视为供应商解决方案

没有单一产品能使您符合零信任要求。CISA 零信任成熟度模型(版本 2.0,2023)确定了五个支柱:身份、设备、网络、应用程序和工作负载,以及数据。大多数供应商只解决一到两个支柱。购买零信任网络访问(ZTNA)产品只能解决网络问题,而其他四个支柱仍未解决。

实施而不测量

零信任应该显著减少您的攻击面。在每个阶段前后跟踪以下指标:

  • 具有广泛网络访问的服务数量与具有策略范围访问的服务数量对比
  • 检测横向移动的平均时间(使用紫队练习)
  • 使用 mTLS 的服务间流量百分比
  • 过度权限的服务账户数量
  • 按身份验证类型(TOTP 与 FIDO2)的 MFA 采用率

忽视开发者体验

让开发变得痛苦是零信任部署失败的最快方式。如果工程师需要通过三个身份验证步骤才能访问暂存数据库,他们会寻找变通方法。使用像 HashiCorp Vault 的动态秘密这样的短期凭据自动化,这样开发者可以无摩擦地获得访问权限,同时安全团队可以获得完整的可审计性。

# Vault 动态数据库凭据
$ vault read database/creds/dev-role
Key                Value
---                -----
lease_id           database/creds/dev-role/3QBtMJvTqOWB0Tgn4Y3A1234
lease_duration     1h
lease_renewable    true
password           A1a-xK7Pq9Mn2Lrw8Tz4
username           v-token-dev-role-1Kqx4WbNmRt5-1711234567

密码在一小时后过期。没有需要轮换、泄露或放错位置的共享凭据。

诚实的现实检验

在一个 50 人规模的工程组织中,完整的零信任实施通常需要 12 到 18 个月的持续努力、一名专职安全工程师以及对开发者访问资源方式的重大改变。回报——显著减少的爆炸半径、更快的漏洞检测、与 NIST 800-207 的合规性——是真实的,但工作也是真实的。

从身份和防钓鱼 MFA 开始。在接触网络分段之前确保这部分正确。在每个阶段前测量您当前的状态,以便您可以展示进展。永远不要让供应商说服您,仅凭他们的产品就能使您符合零信任要求。架构才是产品,供应商只是工具。

关键要点

  • 零信任是一种架构理念,而非产品类别。其背后有三个核心原则:显式验证、最小权限原则、假设已被入侵。
  • 分阶段实施——首先是身份认证和多因素认证(MFA),然后是应用访问代理,接着是服务间mTLS(双向TLS),最后是持续验证。
  • 通过服务网格实现的mTLS可以在网络层面强制执行服务身份,无需更改应用程序代码。
  • 在每个阶段前后使用具体指标进行衡量:过度授权账户数量、mTLS覆盖率、MFA采用率。
  • 开发者体验是一种安全控制。繁琐的访问流程会产生危险的变通方法。

By Michael Sun

Founder and Editor-in-Chief of NovVista. Software engineer with hands-on experience in cloud infrastructure, full-stack development, and DevOps. Writes about AI tools, developer workflows, server architecture, and the practical side of technology. Based in China.

Leave a Reply

Your email address will not be published. Required fields are marked *

You missed