Istio安全特性
参考文档
https://istio.io/latest/zh/docs/concepts/security/
Istio安全目标
默认安全:应用程序代码和基础设施无需更改
深度防御:与现有安全系统集成以提供多层防御
零信任网络:在不受信任的网络上构建安全解决方案
架构
总揽
Istio 中的安全性涉及多个组件: - 用于密钥和证书管理的证书颁发机构(CA) - 配置 API 服务器分发给代理: - 认证策略 - 授权策略 - 安全命名信息 - Sidecar 和边缘代理作为 Policy Enforcement Points(PEPs) 以保护客户端和服务器之间的通信安全 - 一组 Envoy 代理扩展,用于管理遥测和审计
公钥基础设施(PKI)
Istio PKI 使用 X.509 证书为每个工作负载都提供强大的身份标识。伴随着每个 Envoy 代理的 istio-agent 和 istiod 一起协作来大规模进行自动化密钥和证书轮换。下图显示了这个机制的运行流程
通过 secret discovery service(SDS)来实现的,具体流程如下:
- istiod 提供 gRPC 服务以接受证书签名请求(CSRs)。
- 当工作负载启动时,Envoy 通过秘密发现服务(SDS)API 向同容器内的 istio-agent 发送证书和密钥请求。
- 在收到 SDS 请求后,istio-agent 创建私钥和 CSR,然后将 CSR 及其凭据发送到 istiod CA 进行签名。
- istiod CA 验证 CSR 中携带的凭据,成功验证后签署 CSR 以生成证书。
- Istio-agent 通过 Envoy SDS API 将私钥和从 Istio CA 收到的证书发送给 Envoy。
- Istio-agent 会监工作负载证书的有效期。上述 CSR 过程会周期性地重复,以处理证书和密钥轮换。
特性
认证
Istio 提供两种类型的认证: - Peer authentication:用于服务到服务的认证,以验证进行连接的客户端。Istio 提供双向 TLS 作为传输认证的全栈解决方案,无需更改服务代码就可以启用它。这个解决方案: - 为每个服务提供强大的身份,表示其角色,以实现跨群集和云的互操作性。 - 保护服务到服务的通信。 - 提供密钥管理系统,以自动进行密钥和证书的生成,分发和轮换。
- Request authentication:用于最终用户认证,以验证附加到请求的凭据。 Istio 使用 JSON Web Token(JWT)验证启用请求级认证,并使用自定义认证实现或任何 OpenID Connect 的认证实现(例如下面列举的)来简化的开发人员体验。
- ORY Hydra
- Keycloak
- Auth0
- Firebase Auth
- Google Auth
双向TLS认证流程
- Istio 将出站流量从客户端重新路由到客户端的本地 sidecar Envoy。
- 客户端 Envoy 与服务器端 Envoy 开始双向 TLS 握手。在握手期间,客户端 Envoy 还做了安全命名检查,以验证服务器证书中显示的服务帐户是否被授权运行目标服务。
- 客户端 Envoy 和服务器端 Envoy 建立了一个双向的 TLS 连接,Istio 将流量从客户端 Envoy 转发到服务器端 Envoy。
- 授权后,服务器端 Envoy 通过本地 TCP 连接将流量转发到服务器服务。
宽容模式
启用宽容模式后,服务可以同时接受纯文本和双向 TLS 流量。这个模式为入门提供了极大的灵活性。服务中安装的 Istio sidecar 立即接受双向 TLS 流量而不会打断现有的纯文本流量。因此,运维人员可以逐步安装和配置客户端 Istio sidecar 发送双向 TLS 流量。一旦客户端配置完成,运维人员便可以将服务端配置为仅 TLS 模式
认证示例
在foo命名空间中与带有 app:reviews 标签的工作负载的传输层认证,必须使用双向 TLS:
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "example-peer-policy"
namespace: "foo"
spec:
selector:
matchLabels:
app: reviews
mtls:
mode: STRICT
鉴权
架构
鉴权流程
对于未应用授权策略的工作负载,Istio允许所有请求。
授权策略支持允许、拒绝和自定义操作。可以根据需要应用多个策略,每个策略具有不同的操作,以确保对工作负载的访问。 Istio按以下顺序检查层中的匹配策略:自定义、拒绝,然后允许。对于每种类型的操作,Istio首先检查是否存在应用了操作的策略,然后检查请求是否与策略的规范匹配。如果请求与其中一层中的策略不匹配,则检查将继续到下一层。
鉴权示例
应用该策略的目标是:foo命名空间下的匹配标签app: httpbin
和version: v1
的工作负载
策略拒绝所有不是来源于foo命名空间的请求
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-deny
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: DENY
rules:
- from:
- source:
notNamespaces: ["foo"]