title: "零信任安全架构:从理论到落地实践"
date: "2026-07-10"
tags: ["安全", "零信任", "架构", "DevSecOps"]
零信任安全架构:从理论到落地实践
零信任(Zero Trust)的核心理念是"永不信任,始终验证"。传统的边界安全模型已经无法应对现代威胁。
核心原则
1. 显式验证:每个访问请求都必须经过身份验证和授权
2. 最小权限:只授予完成任务所需的最小权限
3. 假设被攻破:假设网络已被入侵,限制爆炸半径
身份验证
多因素认证(MFA)
PYTHON
import pyotp
import qrcode
def setup_totp(user_id: str) -> tuple[str, str]:
"""设置 TOTP 双因素认证"""
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
# 生成 QR 码 URI
uri = totp.provisioning_uri(
name=f"{user_id}@example.com",
issuer_name="MyApp"
)
return secret, uri
def verify_totp(secret: str, code: str) -> bool:
"""验证 TOTP 码"""
totp = pyotp.TOTP(secret)
return totp.verify(code)
# 使用
secret, uri = setup_totp("alice")
# 用户扫描二维码后,输入 6 位验证码
is_valid = verify_totp(secret, "123456")JWT 令牌验证
PYTHON
import jwt
from datetime import datetime, timedelta
def create_access_token(user_id: str, scope: list[str]) -> str:
payload = {
"sub": user_id,
"scope": scope,
"iat": datetime.utcnow(),
"exp": datetime.utcnow() + timedelta(minutes=15),
"jti": str(uuid.uuid4()) # 唯一标识,防止重放
}
return jwt.encode(payload, SECRET_KEY, algorithm="RS256")
def verify_token(token: str) -> dict:
try:
payload = jwt.decode(
token,
PUBLIC_KEY,
algorithms=["RS256"],
options={"require": ["exp", "iat", "sub", "jti"]}
)
# 检查令牌是否被撤销
if is_token_revoked(payload["jti"]):
raise ValueError("Token revoked")
return payload
except jwt.ExpiredSignatureError:
raise ValueError("Token expired")
except jwt.InvalidTokenError:
raise ValueError("Invalid token")网络分段
微隔离
YAML
# Kubernetes NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-policy
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress
ports:
- port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- port: 5432
- to:
- namespaceSelector: {}
ports:
- port: 443 # 允许 HTTPS 出站服务间认证
mTLS(双向 TLS)
PYTHON
import ssl
import httpx
# 客户端证书
client_cert = ("/path/to/client.crt", "/path/to/client.key")
ca_cert = "/path/to/ca.crt"
# 创建带 mTLS 的 HTTP 客户端
client = httpx.Client(
cert=client_cert,
verify=ca_cert
)
response = client.get("https://internal-api.example.com/data")NGINX
# Nginx mTLS 配置
server {
listen 443 ssl;
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;
# 要求客户端证书
ssl_client_certificate /etc/ssl/ca.crt;
ssl_verify_client on;
location / {
proxy_pass http://backend;
proxy_set_header X-Client-CN $ssl_client_s_dn_cn;
}
}权限管理
RBAC + ABAC 混合模型
PYTHON
from dataclasses import dataclass
from enum import Enum
class Role(Enum):
ADMIN = "admin"
EDITOR = "editor"
VIEWER = "viewer"
@dataclass
class Permission:
resource: str
action: str
conditions: dict = None
# RBAC 角色权限
ROLE_PERMISSIONS = {
Role.ADMIN: [
Permission("*", "*"),
],
Role.EDITOR: [
Permission("posts", "create"),
Permission("posts", "update", {"owner_only": True}),
Permission("posts", "read"),
],
Role.VIEWER: [
Permission("posts", "read"),
],
}
def check_permission(user: dict, resource: str, action: str) -> bool:
role = Role(user["role"])
permissions = ROLE_PERMISSIONS.get(role, [])
for perm in permissions:
if perm.resource in (resource, "*") and perm.action in (action, "*"):
# 检查条件(ABAC)
if perm.conditions:
if perm.conditions.get("owner_only"):
if user["id"] != resource_owner_id(resource):
continue
return True
return False审计日志
PYTHON
import structlog
from datetime import datetime
logger = structlog.get_logger("audit")
def log_access_event(
user_id: str,
action: str,
resource: str,
result: str,
ip_address: str,
user_agent: str
):
logger.info(
"access_event",
timestamp=datetime.utcnow().isoformat(),
user_id=user_id,
action=action,
resource=resource,
result=result,
ip_address=ip_address,
user_agent=user_agent,
event_type="security"
)
# 使用
@app.middleware("http")
async def audit_middleware(request: Request, call_next):
response = await call_next(request)
log_access_event(
user_id=request.state.user_id if hasattr(request.state, "user_id") else "anonymous",
action=f"{request.method} {request.url.path}",
resource=request.url.path,
result="success" if response.status_code < 400 else "denied",
ip_address=request.client.host,
user_agent=request.headers.get("user-agent", "")
)
return response安全清单
| 层级 | 措施 |
|------|------|
| 身份 | MFA、SSO、定期轮换凭据 |
| 网络 | 微隔离、mTLS、WAF |
| 应用 | 输入验证、输出编码、CSRF 防护 |
| 数据 | 加密存储、传输加密、密钥管理 |
| 监控 | 审计日志、异常检测、实时告警 |
零信任不是一个产品,而是一种安全理念和架构模式。它要求在每个访问点都进行验证,而不是依赖网络边界。
读者评论 2