详解Istio mTLS

极客漫游说
• 阅读 4917

Istio提供双向TLS作为服务到服务身份验证的解决方案。

双向认证是指双方同时进行认证,这是某些协议的默认认证方式。以前称为“相互实体认证” ,因为两个或多个实体在传输任何数据或信息之前会验证对方的合法性。

下面是istio服务之间mTLS流:

详解Istio mTLS

  1. 客户端应用程序容器将纯文本HTTP请求发送到服务器。
  2. 客户端代理容器拦截出站请求。
  3. 客户端代理与服务器端代理执行TLS握手。此握手包括证书交换。这些证书由Istio预加载到代理容器中。
  4. 客户端代理对服务器的证书执行安全命名检查,以验证授权身份正在运行服务器。
  5. 客户端和服务器建立相互TLS连接,服务器代理将请求转发到服务器应用程序容器。

实现细节

从Istio 1.5开始,Istio使用自动双向TLS。这意味着,尽管服务同时接受纯文本和TLS通信,但默认情况下,服务将在集群内发送TLS请求。

与其他Istio配置一样,您可以在.yaml文件中指定身份验证策略。您使用kubectl部署策略。以下示例身份验证策略指定带有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中,可以通过三个粒度级别定义mTLS设置。对于每种服务,Istio都会应用最窄的匹配策略。顺序为:服务特定,命名空间范围,网格范围。

  • 网格范围:为根名称空间指定的策略,不带有或带有空的选择器字段。
  • 命名空间范围:为没有或没有空选择器字段的非根名称空间指定的策略。
  • 服务特定:在常规名称空间中定义的策略,带有非空选择器字段。

例如我们上面的示例就是一个服务特定的策略。

每个命名空间只能有一个网格范围的对等身份验证策略,并且只能有一个命名空间范围的对等身份验证策略。当您为同一网格或名称空间配置多个网格范围或命名空间范围的对等身份验证策略时,Istio会忽略较新的策略。当多个特定于工作负载的对等身份验证策略匹配时,Istio将选择最旧的策略。

模式

对等身份验证策略指定Istio对目标工作负载实施的双向TLS模式。支持以下模式:

  • PERMISSIVE:工作负载接受双向TLS和纯文本流量。当没有Sidecar的工作负载无法使用双向TLS时,此模式在迁移过程中最有用。通过使用sidecar注入迁移工作负载后,您应该将模式切换为STRICT
  • STRICT:工作负载仅接受双向TLS通信。、
  • DISABLE:相互TLS已禁用。从安全角度来看,除非您提供自己的安全解决方案,否则不应使用此模式。

取消设置模式时,将继承父作用域的模式。缺省情况下,未设置模式的网格范围对等身份验证策略使用PERMISSIVE模式。

此时,您可以在Istio中将任何服务设置为任何mTLS模式。但是,让我们看一下In mesh(从网格内)或out of mesh(网格外)调用服务时每种模式会发生什么情况?

In mesh 表示Sidecar代理在应用程序容器旁边运行。Out of mesh意味着没有Sidecar容器。

总结的表格如下:

详解Istio mTLS

  • PERMISSIVE 在网格内使用mTLS,在网格外使用纯文本连接
  • STRICT 在网格内使用mTLS,但拒绝来自网格外的连接
  • DISABLED 在网格内外都使用纯文本连接

Demo

该demo,我们会创建两个服务,分别检查未启用和启用对等身份验证策略的服务访问情况。

首先部署demo中需要的资源等:

kubectl create ns foo
kubectl label namespace foo istio-injection=enabled
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/httpbin/httpbin.yaml -n foo
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/sleep/sleep.yaml -n foo

sleep 应用程序是我们本次demo的客户端。httpbin 应用程序是我们本次demo的服务端。

我们查看一下访问情况,exec 到 sleep pod,然后对 httpbin pod 执行 curl:

curl http://httpbin:8000

<!DOCTYPE html>
<html lang="en">
......

访问成功。正如前面讲到的,istio1.5 之后自动mtls。在未设置特殊对等策略下,是可以接受纯文本请求。

接下来我们设置一个命名空间级别的对等策略,并且模式为严格:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: foo
spec:
  mtls:
    mode: STRICT

允许名称空间foo下所有工作负载的mTLS通信。

使用kubectl 将该策略应用到集群。

kubectl apply -f policy.yaml
peerauthentication.security.istio.io/default created

接着我们再次进入到sleep pod,对 httpbin pod 执行 curl:

curl http://httpbin:8000

<!DOCTYPE html>
<html lang="en">
......

访问依旧可以成功,这不是说明了我们对等策略没有生效。因为sleep 程序在mesh当中。

接下来,我们部署一个没有sidecar的sleep程序,即我们检测mesh外应用访问情况,我们另外创建了一个命名空间legacy,并且没有对其作istio-injection=enabled 标签处理,从而告诉istio忽略该命名空间应用。

kubectl create ns legacy
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/sleep/sleep.yaml -n legacy

我们进入到legacy命名空间下的sleep pod,对 httpbin pod 执行 curl:

curl http://httpbin.foo:8000
curl: (56) Recv failure: Connection reset by peer

访问失败。因为我们对foo命名设置了严格模式的mTLS策略。纯文本请求将不被允许,因为身份验证失败。

当然我们此时可以删除创建的严格对等策略,之后访问恢复正常。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
ssh连接服务器
1.概述ssh是一种网络通信协议,用于计算机之间的加密登录.一般用ssh连接服务器有两种方式:密码认证与密钥认证.密码认证就是通过传统的输入密码的方式登录,密钥认证就是把产生的公钥注册到服务器后,用私钥登录,这样就可以不用每次登录输入密码.特别适合作者这种脑残记不住密码的懒人.2.密码认证密码认证登录直接在终端使用ssh
莎利亚 莎利亚
4年前
JWT 认证方案学习
定义JWT(JSONWEBTOKEN)是一种安全通讯标准,它定义了一种紧凑自包含的方式,用于在各方之间安全的传输JSON对象。常见应用场景是API之间的认证通讯。一般的用户认证流程1、请求方发送账户密码到服务器,验证账户可用性。2、验证成功,生成session,保存在服务端。3、服务端返回一个s
Stella981 Stella981
3年前
Shiro要点概览与SpringBoot整合实例
1\.简介概念说明Subject主体,简化点说就是用户实体PrincipalSubject的唯一标识,如id、用户名、手机号、邮箱等Credential凭证信息,主体证明自己的东西,如密码、证书等Authenticator认证器,对Subject身份进行认证,例如验证用户的用户名和密码是否匹配Aut
Stella981 Stella981
3年前
Kerberos协议
Kerberos协议定义一种计算机网络授权协议,用来在非安全网路中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止replay攻击、保护数据完整性等场合,是一种应用对称密钥
Stella981 Stella981
3年前
Hyperledger Fabric如何启用双向TLS安全通信?
HyperlederFabric区块链支持在通信节点之间启用TLS传输层安全通信,TLS支持单向验证仅验证服务节点身份,或双向验证同时验证服务节点和客户端节点的身份。本文将介绍如何在HyperledgerFabric网络中启用双向TLS安全通信。HyperledgerFabric链码与应用开发相关教程:Hype
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
Java Web 实现 HTTP Basic
Basic认证是一种较为简单的HTTP认证方式,客户端通过明文(Base64编码格式)传输用户名和密码到服务端进行认证,通常需要配合HTTPS来保证信息传输的安全。界面如下。!(https://oscimg.oschina.net/oscnet/up94d8097b336216fe118be732975765663a7.png)下面
Stella981 Stella981
3年前
Kubernetes初学者实操教程:五步轻松调试K8s服务
下周二晚上8点,为你全面解读Istio最新发布的两个新版本!包括Istio架构演化、新架构解读以及新特性的实战demo噢!点击【阅读原文】或访问以下链接即可预约报名!http://zmz.cn/1BGJE在Kubernetes中,服务是一个核心概念。在本文中,将介绍如何调试K8S服务,这些服务是由多个Pod组成的工作负载的抽象接
Stella981 Stella981
3年前
Google、IBM和Lyft开源的微服务管理框架Istio安装与试用
Istio是Google、IBM和Lyft联合开源的微服务ServiceMesh框架,旨在解决大量微服务的发现、连接、管理、监控以及安全等问题。Istio的主要特性包括:HTTP、gRPC和TCP网络流量的自动负载均衡丰富的路由规则,细粒度的网络流量行为控制流量加密、服务间认证,以及强身份声明全范围(Fleet
曼成 曼成
1年前
一文看懂身份证二要素实名认证API的工作原理与流程
随着互联网技术的快速发展和社会信息化程度的提高,实名认证作为一种重要的身份验证方式已经广泛应用于各行各业。实名认证能够对用户身份进行验证,有效减少虚假注册、网络欺诈等问题。在实名认证过程中,身份证二要素实名认证API是一种常见的技术方案,今天我们就来一文看懂身份证二要素实名认证API的工作原理与流程。