📖 目录
- [1. Istio 安全治理概述](#1. Istio 安全治理概述)
- [1.1 安全治理的核心价值](#1.1 安全治理的核心价值)
- [2. 身份认证(Authentication)](#2. 身份认证(Authentication))
- [2.1 对等认证(Peer Authentication)](#2.1 对等认证(Peer Authentication))
- [2.2 请求认证(Request Authentication)](#2.2 请求认证(Request Authentication))
- [3. 授权(Authorization)](#3. 授权(Authorization))
- [3.1 授权策略类型](#3.1 授权策略类型)
- [3.2 授权策略示例场景](#3.2 授权策略示例场景)
- [4. 传输安全(mTLS)](#4. 传输安全(mTLS))
- [4.1 mTLS 工作原理](#4.1 mTLS 工作原理)
- [4.2 配置示例](#4.2 配置示例)
- [5. 安全策略最佳实践](#5. 安全策略最佳实践)
- [5.1 分层安全策略](#5.1 分层安全策略)
- [5.2 安全策略演进路径](#5.2 安全策略演进路径)
- [6. 监控与审计](#6. 监控与审计)
- [6.1 安全指标监控](#6.1 安全指标监控)
- [6.2 审计日志配置](#6.2 审计日志配置)
- [7. 常见问题与解决方案](#7. 常见问题与解决方案)
- [7.1 证书问题排查](#7.1 证书问题排查)
- [7.2 授权策略调试](#7.2 授权策略调试)
- [8. 实战演练:构建安全微服务](#8. 实战演练:构建安全微服务)
- [8.1 环境准备](#8.1 环境准备)
- [8.2 部署安全策略](#8.2 部署安全策略)
- [9. 总结与进阶学习](#9. 总结与进阶学习)
- [9.1 核心要点回顾](#9.1 核心要点回顾)
- [9.2 推荐学习路径](#9.2 推荐学习路径)
- [9.3 资源推荐](#9.3 资源推荐)
1. Istio 安全治理概述
Istio 作为服务网格的事实标准,提供了强大的安全治理能力,主要包括身份认证、授权、加密通信和策略管理四大核心功能。通过 Istio 的安全机制,可以在零信任网络环境中实现微服务间的安全通信。
1.1 安全治理的核心价值
- 零信任架构:默认不信任任何服务,所有通信都需要验证
- 透明的安全层:应用无需修改代码即可获得安全能力
- 细粒度控制:支持服务级、方法级的访问控制
- 证书自动管理:自动化的 mTLS 证书颁发和轮换
2. 身份认证(Authentication)
Istio 提供两种类型的身份认证:对等认证(Peer Authentication)和请求认证(Request Authentication)。
2.1 对等认证(Peer Authentication)
对等认证用于服务到服务之间的身份验证,主要基于 mTLS(双向 TLS)。
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
工作模式:
STRICT:强制使用 mTLSPERMISSIVE:允许明文和 mTLS 混合(迁移阶段使用)DISABLE:禁用 mTLS
2.2 请求认证(Request Authentication)
请求认证用于终端用户到服务的身份验证,支持 JWT(JSON Web Token)验证。
yaml
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth
namespace: default
spec:
selector:
matchLabels:
app: productpage
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.20/security/tools/jwt/samples/jwks.json"
3. 授权(Authorization)
Istio 的授权策略基于 AuthorizationPolicy CRD,支持灵活的访问控制规则。
3.1 授权策略类型
yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-policy
namespace: default
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/sleep"]
to:
- operation:
methods: ["GET"]
paths: ["/info"]
- from:
- source:
namespaces: ["trusted-ns"]
to:
- operation:
methods: ["POST"]
关键字段:
action: ALLOW/DENY/AUDIT/CUSTOMsource: 基于身份、命名空间、IP 等operation: HTTP 方法、路径、端口等when: 附加条件(请求头、JWT claims 等)
3.2 授权策略示例场景
#mermaid-svg-ywgw676MyTsOC5zu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ywgw676MyTsOC5zu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ywgw676MyTsOC5zu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ywgw676MyTsOC5zu .error-icon{fill:#552222;}#mermaid-svg-ywgw676MyTsOC5zu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ywgw676MyTsOC5zu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ywgw676MyTsOC5zu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ywgw676MyTsOC5zu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ywgw676MyTsOC5zu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ywgw676MyTsOC5zu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ywgw676MyTsOC5zu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ywgw676MyTsOC5zu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ywgw676MyTsOC5zu .marker.cross{stroke:#333333;}#mermaid-svg-ywgw676MyTsOC5zu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ywgw676MyTsOC5zu p{margin:0;}#mermaid-svg-ywgw676MyTsOC5zu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ywgw676MyTsOC5zu .cluster-label text{fill:#333;}#mermaid-svg-ywgw676MyTsOC5zu .cluster-label span{color:#333;}#mermaid-svg-ywgw676MyTsOC5zu .cluster-label span p{background-color:transparent;}#mermaid-svg-ywgw676MyTsOC5zu .label text,#mermaid-svg-ywgw676MyTsOC5zu span{fill:#333;color:#333;}#mermaid-svg-ywgw676MyTsOC5zu .node rect,#mermaid-svg-ywgw676MyTsOC5zu .node circle,#mermaid-svg-ywgw676MyTsOC5zu .node ellipse,#mermaid-svg-ywgw676MyTsOC5zu .node polygon,#mermaid-svg-ywgw676MyTsOC5zu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ywgw676MyTsOC5zu .rough-node .label text,#mermaid-svg-ywgw676MyTsOC5zu .node .label text,#mermaid-svg-ywgw676MyTsOC5zu .image-shape .label,#mermaid-svg-ywgw676MyTsOC5zu .icon-shape .label{text-anchor:middle;}#mermaid-svg-ywgw676MyTsOC5zu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ywgw676MyTsOC5zu .rough-node .label,#mermaid-svg-ywgw676MyTsOC5zu .node .label,#mermaid-svg-ywgw676MyTsOC5zu .image-shape .label,#mermaid-svg-ywgw676MyTsOC5zu .icon-shape .label{text-align:center;}#mermaid-svg-ywgw676MyTsOC5zu .node.clickable{cursor:pointer;}#mermaid-svg-ywgw676MyTsOC5zu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ywgw676MyTsOC5zu .arrowheadPath{fill:#333333;}#mermaid-svg-ywgw676MyTsOC5zu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ywgw676MyTsOC5zu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ywgw676MyTsOC5zu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ywgw676MyTsOC5zu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ywgw676MyTsOC5zu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ywgw676MyTsOC5zu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ywgw676MyTsOC5zu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ywgw676MyTsOC5zu .cluster text{fill:#333;}#mermaid-svg-ywgw676MyTsOC5zu .cluster span{color:#333;}#mermaid-svg-ywgw676MyTsOC5zu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ywgw676MyTsOC5zu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ywgw676MyTsOC5zu rect.text{fill:none;stroke-width:0;}#mermaid-svg-ywgw676MyTsOC5zu .icon-shape,#mermaid-svg-ywgw676MyTsOC5zu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ywgw676MyTsOC5zu .icon-shape p,#mermaid-svg-ywgw676MyTsOC5zu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ywgw676MyTsOC5zu .icon-shape .label rect,#mermaid-svg-ywgw676MyTsOC5zu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ywgw676MyTsOC5zu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ywgw676MyTsOC5zu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ywgw676MyTsOC5zu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JWT有效
JWT无效
符合规则
不符合规则
mTLS有效
mTLS无效
外部用户请求
请求认证检查
授权策略评估
返回401未授权
允许访问服务
返回403禁止访问
对等认证检查
服务间通信
连接终止
4. 传输安全(mTLS)
4.1 mTLS 工作原理
- 证书自动颁发:Istiod 作为 CA 为每个工作负载颁发证书
- 身份绑定 :证书中的 SPIFFE ID 格式:
spiffe://<trust-domain>/ns/<namespace>/sa/<service-account> - 自动轮换:证书默认 24 小时轮换,透明完成
4.2 配置示例
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: mtls-strict
namespace: default
spec:
selector:
matchLabels:
app: reviews
mtls:
mode: STRICT
portLevelMtls:
9080:
mode: DISABLE # 特定端口禁用 mTLS
5. 安全策略最佳实践
5.1 分层安全策略
yaml
# 1. 命名空间级默认策略
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
# 2. 服务级细化策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: api-gateway-policy
namespace: production
spec:
selector:
matchLabels:
app: api-gateway
rules:
- from:
- source:
principals: ["cluster.local/ns/ingress/sa/istio-ingressgateway"]
5.2 安全策略演进路径
- 阶段一(宽松):PERMISSIVE mTLS + 基础授权
- 阶段二(严格):STRICT mTLS + 细化授权
- 阶段三(零信任):基于身份的细粒度策略 + 持续验证
6. 监控与审计
6.1 安全指标监控
bash
# 查看授权拒绝情况
kubectl exec -it deploy/sleep -c istio-proxy -- \
pilot-agent request GET stats | grep rbac
# 查看 mTLS 连接状态
istioctl proxy-config secret <pod-name>.<namespace>
6.2 审计日志配置
yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: audit-policy
spec:
action: AUDIT
rules:
- to:
- operation:
paths: ["/admin/*"]
7. 常见问题与解决方案
7.1 证书问题排查
bash
# 1. 检查证书状态
istioctl proxy-status
# 2. 查看工作负载证书
kubectl exec <pod-name> -c istio-proxy -- \
cat /etc/certs/cert-chain.pem | openssl x509 -text -noout
# 3. 验证 mTLS 连接
istioctl authn tls-check <pod-name>.<namespace> <service>.<namespace>.svc.cluster.local
7.2 授权策略调试
bash
# 启用调试日志
kubectl exec <pod-name> -c istio-proxy -- \
curl -X POST "localhost:15000/logging?rbac=debug"
# 查看策略生效情况
kubectl logs <pod-name> -c istio-proxy | grep rbac
8. 实战演练:构建安全微服务
8.1 环境准备
bash
# 启用 Istio 安全功能
istioctl install --set profile=demo \
--set values.global.mtls.enabled=true \
--set values.global.sds.enabled=true
8.2 部署安全策略
yaml
# 完整的示例策略
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: frontend-jwt
spec:
selector:
matchLabels:
app: frontend
jwtRules:
- issuer: "auth.example.com"
jwksUri: "https://auth.example.com/.well-known/jwks.json"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: frontend-policy
spec:
selector:
matchLabels:
app: frontend
rules:
- from:
- source:
principals: ["cluster.local/ns/istio-system/sa/istio-ingressgateway"]
to:
- operation:
methods: ["GET", "POST"]
9. 总结与进阶学习
9.1 核心要点回顾
- 身份是安全的基础:SPIFFE/SPIRE 标准提供可移植的身份
- 策略驱动安全:声明式配置实现安全即代码
- 透明无侵入:应用无需感知安全层的存在
- 自动化运维:证书生命周期全自动管理
9.2 推荐学习路径
- 基础:mTLS 配置、基础授权策略
- 进阶:JWT 验证、条件授权、审计策略
- 高级:自定义提供程序、外部 CA 集成、多集群安全