证书轮换机制:
- Istiod 作为 CA,定期颁发短期证书(默认 24 小时)
- Envoy 通过 SDS(Secret Discovery Service)动态获取证书
- 证书到期前自动轮换,无需重启服务
:::
认证(Authentication)
认证策略
Istio 支持两种认证方式:
JWT 认证
jwt-auth.yaml
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth
namespace: istio-system
spec:
selector:
matchLabels:
app: api-gateway
jwtRules:
- issuer: "https://auth.example.com"
audiences:
- "api.example.com"
forwardOriginalToken: true
# 从 Authorization header 提取 JWT
fromHeaders:
- name: Authorization
prefix: "Bearer "
# JWT 公共密钥来源
jwksUri: "https://auth.example.com/.well-known/jwks.json"
JWT 验证配置
jwt-with-claims.yaml
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth-detailed
namespace: istio-system
spec:
selector:
matchLabels:
app: api-gateway
jwtRules:
- issuer: "https://auth.example.com"
jwksUri: "https://auth.example.com/.well-known/jwks.json"
# 定义 JWT 中的声明
claimsToHeaders:
- claim: sub
header: X-User-Id
- claim: groups
header: X-User-Groups
授权(Authorization)
授权策略结构
Istio 的 AuthorizationPolicy 支持 ALLOW 和 DENY 两种策略:
authz-structure.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: policy-name
namespace: namespace
spec:
selector:
matchLabels:
app: target-service
action: ALLOW # ALLOW 或 DENY
rules: # 授权规则
- from:
- source:
principals: [...]
to:
- operation:
methods: [...]
paths: [...]
基础授权策略
basic-authz.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: order-authz
namespace: production
spec:
selector:
matchLabels:
app: order-service
action: ALLOW
rules:
# 允许前端服务访问
- from:
- source:
principals:
- "cluster.local/ns/production/sa/frontend"
to:
- operation:
methods: ["GET"]
paths: ["/api/v1/orders/*"]
# 允许支付服务访问
- from:
- source:
principals:
- "cluster.local/ns/production/sa/payment"
to:
- operation:
methods: ["POST"]
paths: ["/api/v1/orders/*"]
基于命名空间的授权
namespace-authz.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: cross-namespace-authz
namespace: production
spec:
selector:
matchLabels:
app: order-service
action: ALLOW
rules:
# 允许 monitoring 命名空间的服务读取 metrics
- from:
- source:
namespaces:
- "monitoring"
to:
- operation:
methods: ["GET"]
paths: ["/metrics"]
header-authz.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: header-authz
namespace: production
spec:
selector:
matchLabels:
app: api-gateway
action: ALLOW
rules:
# 允许带特定 Header 的请求
- from:
- source:
principals: ["*"]
to:
- operation:
methods: ["GET"]
when:
- key: request.headers[x-api-key]
values: ["valid-api-key-1", "valid-api-key-2"]
拒绝特定操作(DENY 策略)
DENY 策略优先级高于 ALLOW 策略:
deny-authz.yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-admin
namespace: production
spec:
selector:
matchLabels:
app: admin-service
action: DENY
rules:
# 拒绝来自非 admin 命名空间的访问
- from:
- source:
not_namespaces: ["admin"]
to:
- operation:
methods: ["*"]
paths: ["/admin/*"]
不带选择器的授权策略
ns-level-authz.yaml
# 命名空间级别的默认拒绝策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-all
namespace: production
spec:
# 不指定 selector,表示应用于命名空间内的所有工作负载
action: DENY
rules:
- {}
零信任安全实践
默认拒绝原则
flowchart LR
A["请求"] --> B{"检查 AuthorizationPolicy"}
B -->|"无匹配规则"| C["拒绝"]
B -->|"有 ALLOW 规则"| D["检查通过"]
B -->|"有 DENY 规则"| C
D --> E["检查 JWT"]
E -->|"无效 JWT"| F["拒绝"]
E -->|"有效 JWT"| G["允许"]
完整的零信任配置示例
zero-trust-config.yaml
# 1. 启用 STRICT mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
---
# 2. JWT 认证
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: require-jwt
namespace: production
spec:
selector:
matchLabels:
app: api-service
jwtRules:
- issuer: "https://auth.example.com"
jwksUri: "https://auth.example.com/.well-known/jwks.json"
---
# 3. 细粒度授权
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: api-authz
namespace: production
spec:
selector:
matchLabels:
app: api-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["*"]
to:
- operation:
methods: ["GET"]
paths: ["/api/v1/*"]
when:
- key: request.auth.claims[sub]
not_values: ["anonymous"]
安全配置最佳实践
清单
常见安全配置错误
:::danger
错误一:使用 PERMISSIVE 模式在生产环境
PERMISSIVE 允许明文流量,会削弱 mTLS 的安全效果。
正确做法:迁移完成后,切换到 STRICT 模式。