基于Istio的认证
Istio通过客户端和服务器端Policy Enforcement Points(PEPS)建立服务到服务的通信通道,PEPS在istio架构中的实现是envoy。
Peer authentication:
istio提供双向TLS作为传输认证的全栈解决方案,无需更改服务代码就可以启用它。这个解决方案为:
- 为每个服务提供强大的身份,表示其角色,以实现跨集群和云的互操作性。
- 保护服务到服务的通信
- 提供密钥管理系统,以自动进行密钥和证书的生成,分发和轮换
Request authentication
- 用于最终用户认证,以验证附加到请求的凭据
- istio使用JSON Web Token(JWT)验证启用请求级认证,并使用自定义认证实现或任务OpenID Connect的认证实现来简化开发人员体验。
Istio认证架构
- 未设置模式的网格范围的peer认证策略默认使用PERMISSIVE模式。
- 发送请求的客户端服务负责遵循必要的认证机制
- RequestAuthentication: 应用程序负责获取jwt凭证并将其附加到请求
- PeerAuthentication:
- istio会自动将两个PEPS之间的所有流量升级为双向TLS
- 如果认证策略禁用了双向TLS模式,则istio将继续在PEPS之间使用纯文本
- 要覆盖此行为,destination rules显示禁用双向TLS模式
双向TLS认证
当一个工作负载使用双向TLS认证向另一个工作负载发送请求时,该请求的处理方式如下:
- istio将出站流量从客户端重新路由到客户端的本地sidecar envoy
- 客户端envoy与服务器端envoy开始双向TLS握手。在握手期间,客户端envoy还做了安全命名检查,以验证服务器证书中显示的服务账户是否被授权运行目标服务
- 客户端envoy和服务器端envoy建立了一个双向的TLS连接,istio将流量从客户端envoy转发到服务器端envoy
- 授权后,服务器端envoy通过本地TCP连接将流量转发到服务器服务
宽容模式
允许服务同时接受纯文本流量和双向TLS流量,这个功能极大地提升了双向TLS的入门体验。
安全命名
服务器身份被编码在证书里,但服务名称通过服务发现或DNS被检索,安全命名信息将服务器身份映射到服务名称,身份a到服务名称b的映射表示“授权a运行服务b”。
认证策略
认证策略是对服务收到的请求生效的; 要在双向TLS中指定客户端认证策略,需要在DetinationRule中设置TLSSetting.
自定义双向认证
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: db-mtls
spec:
host: mydbserver.prod.svc.cluster.local
trafficPolicy:
tls:
mode: MUTUAL
clientCertificate: /etc/certs/clientcert.pem
privateKey: /etc/certs/private.pem
caCertificates: /etc/certs/cacerts.pem
单向认证,不去校验客户端
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: tls-foo
spec:
host: "*.foo.com"
trafficPolicy:
tls:
mode: SIMPLE
使用默认istio双向认证
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings-istio-mtls
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
PeerAuthentication
严格tls认证,不支持明文
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
标签app=httpbin不开启认证
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: "overwrite-example"
namespace: "foo"
spec:
selector:
matchLabels:
app: httpbin
mtls:
mode: DISABLE
RequestAuthentication
RequestAuthentication认证策略指定验证JSON Web Token(JWT)所需的值。这些值包括:
- token在请求中的位置
- 请求的issuer
- 公共JSON Web Key Set(JWKS)
istio会根据request认证策略中的规则检查提供的令牌(如果已提供),并拒绝令牌无效的请求。当请求不带有令牌时,默认情况下将接受它们。
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: "jwt-example"
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.12/security/tools/jwt/samples/jwks.json"
拒绝没有token的请求
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "frontend-ingress"
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
|