Istio_03_Istio安全
Security
Security: 透明的分布式安全层
- 认证方式:
mTLS
对等身份认证、JWT
令牌请求认证 - 零信任的安全体系(所有流量请求都必须基于认证和最小访问权)
如: Istio的安全架构
- Citadel:
CA
管理密钥和证书 - Envoy: 代理安全通信和安全策略执行
- Pilot: 统一管理服务网格内各安全相关配置
PeerAuthentication
PeerAuthentication(对等身份认证): 基于证书的透明双向认证
- 本质: 由数据面代理完成的双向TLS的服务身份认证
- 通过认证的身份才可进行授权策略的条件匹配
- 服务未配置SA时, 使用NS默认的SA
如: Istio的身份认证流量
- Istio控制面实现
SPIFFE
规范SPIFFE ID
格式(服务标识):spiffe://<trust_domain>/ns/<namespace>/sa/<service_account>
<trust_domain>
可通过控制面的环境变量配置
- Istio数据面使用
X.509
证书提供身份信息- 将每个数据面代理的
SPIFFE ID
注入X.509
证书的subjectAltName
扩展 - 数据面代理生成私钥, 并通过
CSR
将其和SA发送到控制面进行签名
- 将每个数据面代理的
PA常用配置清单:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: <String>
namespace: <String>
spec:
selector: <Object> # Label匹配管理的服务
mtls: <Object> # 双向认证模式(UNSET、DISABLE、PERMISSIVE、STRICT)
mode: <String>
portLevelMtls: <Map[Integer]Object> # 定义每个端口的双向认证模式
- 若省略
spec.selector
, 则作用于PA所在NS/全局下的所有服务 spec.mtls.mode
设置为UNSET
时, 会继承上一级范围内的配置- 定义多个全局PA时, 则仅最早定义PA生效
RequestAuthentication
RequestAuthentication(请求身份认证): 基于JWT
的透明请求认证
- 本质: 由数据面代理管理
JWT
令牌和请求身份认证 JWT
令牌可从指定请求头或请求参数中获取
如: JWT
请求流程
- 数据面代理从控制面配置的认证策略中获取验证
JWT
令牌的公钥- 数据面代理拦截到流量时, 使用公钥验证
JWT
令牌决定是否转发
- 数据面代理拦截到流量时, 使用公钥验证
RA常用配置清单:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: <String>
namespace: <String>
spec:
selector: <Object> # Label匹配管理的服务
jwtRules: <[]Object> # JWT认证规则
- issuer: <String> # 校验JWT令牌的发行者
audiences: <[]String> # 校验JWT令牌需包含的aud信息
jwksUri: <String> # JWT公钥获取的URL地址
jwks: <String> # JWT公钥, 与jwksUri互斥
fromHeaders: <[]Object> # 从指定请求头中获取JWT令牌
- name: <String> # 请求头中的名称
prefix: <String> # 数据前缀匹配
fromParams: <[]String> # 从指定请求参数中获取JWT令牌
AuthorizationPolicy
AuthorizationPolicy(授权策略): 基于认证身份配置授权策略
- 主要应用于L7, 依赖于对等身份认证/请求身份认证提供的身份标识
- 具有什么特征的主题在访问什么属性的对象时, 在满足什么条件时能做什么动作
- 服务可配置多个授权策略共同作用, 以细粒度的授权策略实现最小访问权限
如: Istio的授权优先级
- 授权动作优先级:
CUSTOM
>DENY
>ALLOW
- 只要有显式Deny, 则会直接结束并拒绝请求
- 当未设置授权策略时, 默认会允许所有服务都可访问
RA常用配置清单:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: <String>
namespace: <String>
spec:
selector: <Object> # Label匹配管理的服务
rules: <[]Object> # 匹配请求条件, 条件单独之间匹配
- form: <[]Object> # 请求来源
to: <[]Object> # 请求目标
when: <[]Object> # 请求条件
action: <String> # 满足匹配的动作(ALLOW、DENY、AUDIT、CUSTOM)
provider: <Object> # 指定额外的授权配置, 仅能搭配CUSTOM动作
spec.rules
中省略的配置, 则代表匹配所有相关条件- 当
spec.action
为AUDIT
时, 需对应的插件支持才可完成审计