idou老师教你学istio1:如何为服务提供安全防护能力

今天,我们就来谈谈Istio主打功能---保护服务。

那么,便引出3个问题:

Istio 凭什么保护服务?

Istio 具体如何保护服务?

如何告诉 Istio 发挥保护能力?

Istio凭什么保护服务?

将单体应用程序分解为一个个服务,为大型软件系统的开发和维护带来了诸多好处,比如更好的灵活性、可伸缩性和可复用性。但这也带来了一些安全问题:

为了抵御中间***,需要对流量进行加密

为了提供灵活的服务访问控制,需要 mTLS(双向的安全传输层协议)和细粒度的访问策略

要审计谁在什么时候做了什么,需要审计工具

Istio 尝试提供全面的安全解决方案来解决这3个问题。

idou老师教你学istio1:如何为服务提供安全防护能力

如上图所示, Istio 安全的三大目标是:

默认安全(Security by default):应用程序代码和基础结构,无需更改。

深度防御(Defense in depth):与现有安全系统集成,提供多层防御。

零信任网络(Zero-trust network):在不受信任的网络上,构建安全解决方案。

为了实现这3个目标,Istio 安全功能提供了4大守护系统:

强大的身份(Identity)系统

健壮的策略(Policy)系统

认证,授权和审计(AAA:Authentication,Authorization,Accounting)系统,用于保护服务和数据

透明的 TLS 加密(Encryption)系统。

就保护对象而言,Istio 安全系统可以抵御来自内部或外部的威胁,这些威胁主要针对服务网格内的端点(Endpoints),通信(Communication),平台(Platform)和数据(Data)。

Istio具体如何保护服务?

在安全方面,Istio 具备3个远大的目标,配备了4大守护系统,那么它到底是通过怎样的架构实现这个目标的呢,又通过什么样的安全基础设施,和 kubernetes 配合呢?

1、Istio 安全架构

idou老师教你学istio1:如何为服务提供安全防护能力

如上图,与 Istio 的4大守护系统相对应,Istio 中涉及安全的组件有:

Pilot :将授权策略和安全命名信息分发给代理

Proxy :实现客户端和服务端之间的安全通信

Citadel :用于密钥和证书管理

Mixer :管理授权和审计

由此可见,Pilot 不仅负责流量规则和策略的分发,还负责安全相关策略的下发,有点像皇上的贴身太监,负责宣读圣旨;Proxy 有点像各州属的州官,负责奉天承运;Citadel 有点像玉玺和虎符,负责鉴真去假;Mixer 有点像三省六部,负责授权审计。

2、两个安全基本概念

2.1)Identity

身份(Identity)是几乎所有安全基础架构的基本概念。在服务和服务的通信开始前,双方必须用其身份信息交换凭证,以达到相互认证的目的。在客户端,根据安全命名(secure naming)信息,检查服务端的标识,以查看它是否是该服务的授权运行程序;在服务端,服务端可以根据授权策略(authorization policies)信息,确定客户端可以访问哪些数据,审计其在什么时间访问了什么,拒绝未授权客户端的访问。

在 Istio 身份模型中,Istio 使用一流的服务标识来确定服务的身份。这为表示人类用户,单个服务或一组服务提供了极大的灵活性和粒度。在没有此类身份的平台上,Istio 可以使用可以对服务实例进行分组的其他身份,例如服务名称。

不同平台上的 Istio 服务标识:

Kubernetes: Kubernetes 服务帐户

GKE/GCE: 可以使用 GCP 服务帐户

AWS: AWS IAM 用户/角色 帐户

On-premises (non-Kubernetes): 用户帐户,自定义服务帐户,服务名称,istio 服务帐户或 GCP 服务帐户。

做个类比,京东和天猫都有自己的一套非常成熟的服务账户系统,淘宝只需要复用天猫的账户系统即可,无需重新开发一套,这样我们就可以用天猫的账号,直接登录淘宝。而 Istio 也更倾向于复用业界一流的服务账户系统,如 Kubernetes 和 AWS 的,但也可以自定义服务账户,并按需复用 Kubernetes 的账户系统。

2.2)PKI

Istio PKI(Public Key Infrastructure)建立在 Istio Citadel 之上,可为每个工作负载提供安全且强大的工作负载标识。Istio 使用 X.509 证书来携带 SPIFFE 格式的身份信息。PKI 还可以大规模自动化地进行密钥和证书轮换。

Istio 支持在 Kubernetes pod 和本地计算机上运行的服务。目前,Istio 为每个方案使用不同的证书密钥配置机制,下面试举例 Kubernetes 方案的配置过程:

Citadel 监视 Kubernetes apiserver,为每个现有和新的服务帐户创建 SPIFFE 证书和密钥对。 Citadel 将证书和密钥对存储为 Kubernetes secrets。

创建 pod 时,Kubernetes 会根据其服务帐户通过 Kubernetes secret volume 将证书和密钥对挂载到 pod。

Citadel 监视每个证书的生命周期,并通过重写 Kubernetes secret 自动轮换证书。

Pilot 生成安全命名信息,该信息定义了哪些服务帐户可以运行某个服务。接着Pilot 将安全命名信息传递给 Envoy。

如何告诉Istio发挥保护能力?

如上一章节所言,Istio 基于控制面组件,引入了一流的服务账户系统,结合强大的PKI,实现了对服务网格的安全守护。同时,Istio 也开放了接口,让我们可以进行精细化的配置,全方位满足我们对服务的安全需求。

服务安全,总是离不开两个具体过程:认证(Authentication)和鉴权(Authorization)。Istio 通过 Policy 和 MeshPolicy 文件,实现对认证相关功能的定义;通过RbacConfig、ServiceRole 和 ServiceRoleBinding 文件,实现对鉴权相关功能的启用和定义。

让我们举个几个通俗的例子来区分认证和鉴权:

进火车站需要×××和火车票,×××可以证明你就是你,这是认证;火车票可以证明你有权上那趟火车,这是授权。

又例如,你要访问自己淘宝的购物车,需要先登录,这是认证。你要访问朋友的购物车,就需要他的允许,这是授权。

再例如,有经验的朋友能发现浏览器经常会面对两个错误码:401和403。通常而言,401就是未登录的意思,需要认证;403就是禁止访问的意思,需要授权。

1、认证

Istio 提供两种类型的身份认证:

A)传输身份认证,也称为服务到服务身份认证:对直连客户端进行验证。Istio 提供双向TLS作为传输身份认证的全栈解决方案。我们可以轻松启用此功能,而无需更改服务代码。这个解决方案:

为每个服务提供强大的身份认定,以实现跨群集和跨云的互操作性。

保护服务到服务通信和最终用户到服务通信。

提供密钥管理系统,以自动执行密钥和证书生成,分发和轮换。

B)来源身份认证,也称为终端用户身份认证:对来自终端用户或设备的原始客户端请求进行验证。Istio 通过 JSON Web Token(JWT)、Auth0、Firebase Auth、Google Auth 和自定义身份认证来简化开发者的工作,使之轻松实现请求级别的身份认证。

在这两种情况下,Istio 都通过自定义 Kubernetes API 将身份认证策略存储在 Istio 配置存储(Istio config store)中。Pilot 会在适当的时候进行同步,为每个Proxy更新其最新状态以及密钥。此外,Istio 支持在许可模式下进行身份认证,以帮助我们理解策略变更前后,服务的安全状态是如何变化的。

1.1)认证架构

我们可以使用身份认证策略,为 Istio 网格中接收请求的服务指定身份认证要求。我们使用 .yaml 文件来配置策略,策略将保存在 Istio 配置存储中。在任何策略变更后,Pilot 会将新策略转换为适当的配置,下发给Envoy,告知其如何执行所需的身份认证机制。Pilot 可以获取公钥并将其附加到 JWT 进行配置验证。或者,Pilot 提供 Istio 系统管理的密钥和证书的路径,并将它们安装到负载 Pod 中,以进行双向 TLS。

idou老师教你学istio1:如何为服务提供安全防护能力

本文多次提到双向TLS认证,让我们理解一下其在 Istio 里的实现。Istio 通过客户端和服务端各自配备的 Envoy 进行通信,也就是说,客户端和服务端的流量,是被各自的 Envoy 接管了的。对于客户端调用服务端,遵循的步骤是:

Istio 将出站流量从客户端重新路由到客户端的本地 Envoy。

客户端 Envoy 与服务端 Envoy 开始双向 TLS 握手。在握手期间,客户端 Envoy 还执行安全命名检查,以验证服务证书中提供的服务帐户是否有权运行目标服务。

客户端 Envoy 和服务端 Envoy 建立了一个双向的 TLS 连接,Istio 将流量从客户端 Envoy 转发到服务端 Envoy。

授权后,服务端 Envoy 通过本地 TCP 连接将流量转发到服务端的服务。

1.2)认证策略配置

和其他的 Istio 配置一样,可以用 .yaml 文件的形式来编写认证策略,然后使用 Istioctl 二进制工具进行部署。如下图的配置,通过配置 Policy 文件,对 reviews 服务进行了传输身份认证的配置,要求其必须使用双向TLS做认证。

apiVersion: "authentication.Istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "reviews"
spec:
targets:

  • name: reviews
    peers:
  • mtls: {}
    2、授权

Istio 的授权功能,也称为基于角色的访问控制(RBAC),为 Istio 服务网格中的服务提供命名空间级别,服务级别和方法级别的访问控制。它的特点是:

基于角色的语义,简单易用。

包含服务到服务和终端用户到服务两种授权模式。

通过自定义属性灵活定制授权策略,例如条件,角色和角色绑定。

高性能,因为 Istio 授权功能是在 Envoy 里执行的。

2.1)授权架构

idou老师教你学istio1:如何为服务提供安全防护能力0118_4.jpg

上图显示了基本的 Istio 授权架构。和认证的生效过程一样,运维人员使用.yaml文件指定 Istio 授权策略。部署后,Istio 将策略保存在 Istio Config Store 中。Pilot 会一直监视 Istio 授权策略的变更,如果发现任何更改,它将获取更新的授权策略,并将 Istio 授权策略分发给与服务实例位于同一 pod 内的 Envoy 代理。

每个 Envoy 代理都运行一个授权引擎,该引擎在运行时授权请求。当请求到达代理时,授权引擎根据当前授权策略评估请求上下文,并返回授权结果ALLOW或DENY。

2.2)授权策略配置

我们可以使用 RbacConfig 启用授权策略,并使用 ServiceRole 和ServiceRoleBinding 配置授权策略。

RbacConfig 是一个网格维度的单例,其固定名称值为 default,也就是说我们只能在网格中配置一个 RbacConfig 实例。与其他 Istio 配置对象一样,RbacConfig 被定义为 Kubernetes CustomResourceDefinition (CRD) 对象。

在 RbacConfig 中,运算符可以指定 mode 值,它可以是:

OFF:禁用 Istio 授权。

ON:为网格中的所有服务启用了 Istio 授权。

ON_WITH_INCLUSION:仅对包含字段中指定的服务和命名空间启用 Istio 授权。

ON_WITH_EXCLUSION:除了排除字段中指定的服务和命名空间外,网格中的所有服务都启用 Istio 授权。

在以下示例中,为 default 命名空间启用了 Istio 授权:

apiVersion: "rbac.Istio.io/v1alpha1"
kind: RbacConfig
metadata:
name: default
namespace: Istio-system
spec:
mode: 'ON_WITH_INCLUSION'
inclusion:
namespaces: ["default"]
针对服务和命名空间启用授权后,我们还需要配置具体的授权策略,这通过配置ServiceRole 和 ServiceRoleBinding 实现。与其他 Istio 配置对象一样,它们同样被定义为CRD对象。

ServiceRole 定义了一组访问服务的权限。ServiceRoleBinding 向特定对象授予 ServiceRole,例如用户,组或服务。

ServiceRole 和 ServiceRoleBinding 组合规定了: 允许谁在哪些条件下做什么,具体而言:

谁指的是 ServiceRoleBinding 中的 subject 部分。

做什么指的是 ServiceRole 中的 rule 部分。

哪些条件指的是我们可以在 ServiceRole 或 ServiceRoleBinding 中使用 Istio Attributes 指定的 condition 部分。

让我们再举一个简单的例子,如下图,ServiceRole 和 ServiceRoleBinding 的配置规定:将所有用户(user=“*”)绑定为(products-viewer)角色,这个角色可以对products 这个服务发起 GET 或 HEAD 请求,但是其限制条件是请求头必须包含version,且值为v1或v2。

apiVersion: "rbac.Istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: products-viewer
namespace: default
spec:
rules:

  • services: ["products"]
    methods: ["GET", "HEAD"]
    constraints:
    • key: request.headers[version]
      values: ["v1", "v2"]

      apiVersion: "rbac.Istio.io/v1alpha1"
      kind: ServiceRoleBinding
      metadata:
      name:binding-products-allusers
      namespace:default
      spec:
      subjects:

  • user: "*"
    roleRef:
    kind: ServiceRole
    name: "products-viewer"

至此,我们做个简单的总结:单体应用程序拆分成成千上百个服务后,带来了安全问题,Istio 尝试在由服务组成的服务网格里,加入了一套全栈解决方案。这套方案里,Istio 默默处理了大部分安全基础设施,但也暴露了认证和授权两个功能让用户进行自定义配置。我们通过 Policy、MeshPolicy 以及 RbacConfig、ServiceRole、ServiceRoleBinding 就可以完成对认证和授权环节所有功能的配置,而不需要侵入地改动任何服务的代码。

原文地址:http://blog.51cto.com/14051317/2344165

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别、服务级别和方法级别的访问控制。基于角色的访问控制具有简单易用、灵活和高性能等特性。本文介绍如何在服务网格中为服务进行授权控制。·前置条件·•安装istio的k8s集群,启用认证功能、
Errorfromserver(Forbidden):errorwhencreating"oot/istio.yaml":configmaps"istio-galley-configuration"isforbidden:unabletocreatenewcontentinnamespaceistio-systembecauseitisbeingterminatedErrorfromserver(Forbid
3.1Istio的核心组件及其功能Istio总体分两部分:控制面和数据面。数据面(sidecar):sidecar通过注入的方式和业务容器共存于一个pod,会劫持业务容器的流量,并接受控制面组件的控制,同时会向控制面输出日志、跟踪以及监控数据。控制面:Istio的核心,管理Istio的所有功能。
在Istio中,双向TLS是传输身份验证的完整堆栈解决方案,它为每个服务提供可跨集群的强大身份、保护服务到服务通信和最终用户到服务通信,以及提供密钥管理系统。本文阐述如何在不中断通信的情况下,把现存Istio服务的流量从明文升级为双向TLS。使用场景 在部署了Istio的集群中,使用人员
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力。今天,将向大家介绍如何用Istio实现流量熔断。熔断机制是创建弹性微服务应用程序的重要模式。熔断可以帮助您自由控制故障影响的范围、网络延迟的峰值以及抵御其他一些来自外部的恶意***等场景。在接下来
流量镜像流量镜像,也称为影子流量,流量镜像提供一种尽可能低的风险为生产带来变化的强大功能。镜像会将实时流量的副本发送到镜像服务。镜像流量发生在主服务的关键请求路径之外。在非生产或者测试环境中,尝试访问一个服务所有可能的测试用例组合是个非常不现实的任务。在某些情况下
一、负载均衡算法原理与实战负载均衡算法(loadbalancingalgorithm),定义了几种基本的流量分发方式,在Istio中一共有4种标准负载均衡算法。•Round_Robin:轮询算法,顾名思义请求将会依次发给每一个实例,来共同分担所有的请求。•Random:随机算法,将所有的请求随机分发给健康的实例•
本文整理自华为CloudBU技术专家在K8S技术社上关于Istio调用链的分享。前言大家好,我是idouba,来自华为CloudBU,当前在做Istio服务网格在华为云容器服务的产品化工作。今天跟大家分享的主题是Istio调用链相关内容。通过剖析Istio的架构机制与Istio中调用链的工作原理来解答一个大
今天,我们就来谈谈Istio主打功能---保护服务。那么,便引出3个问题:Istio凭什么保护服务?Istio具体如何保护服务?如何告诉Istio发挥保护能力?Istio凭什么保护服务?将单体应用程序分解为一个个服务,为大型软件系统的开发和维护带来了诸多好处,比如更好的灵活性、可伸缩性和可复用性
istio-opentracing链路追踪方案istio-opentracing链路追踪主要是由sidecar(envoy)支持的,istio只是在上层进行配置的修改。envoy链路追踪envoy主要用三个功能来支撑系统范围内的跟踪生成RequestID:envoy会在需要的时候生成UUID,并操作名为[x-request-id]的HTTPHeader。应用可
在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移。这两个方面的功能都是Istio流量治理的一部分。今天将继续带大家了解Istio的另一项功能,关于请求超时的管理。首先我们可以通过一个简单的Bookinfo的微服务应用程序来动手实践一下Istio是如何实现请求超时的管理。看过ido
调用链原理和场景正如ServiceMesh的诞生是为了解决大规模分布式服务访问的治理问题,调用链的出现也是为了对应于大规模的复杂的分布式系统运行中碰到的故障定位定界问题。大量的服务调用、跨进程、跨服务器,可能还会跨多个物理机房。无论是服务自身问题还是网络环境的问题导致调用
在Istio中,双向TLS是传输身份验证的完整堆栈解决方案,它为每个服务提供可跨集群的强大身份、保护服务到服务通信和最终用户到服务通信,以及提供密钥管理系统。本文阐述如何在不中断通信的情况下,把现存Istio服务的流量从明文升级为双向TLS。使用场景在部署了Istio的集群中,使用人员刚
前言在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置IstioIngressGateway什么是IngressGateway由于KubernetesIngressAPI只能支持最基本的HTTP路由,使用KubernetesIngress资源来配置外部流量的方式不能满足需求。因此Istiov1alpha3routingAPI引
Istio是什么?使用云平台可以为组织提供丰富的好处。然而,不可否认的是,采用云可能会给DevOps团队带来压力。开发人员必须使用微服务已满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署。Istio允许您连接、保护、控制和观测服务。在较高的层次上,Istio有助于降低这些
Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness:liveness探针用来侦测什么时候需要重启容器。比如说当liveness探针捕获到程序运行时出现的一个死锁,这种情况下重启容器可以让程序更容易可用。readiness探针用来使容器准备好接收流量。
摘要使用Istio可以很方便地实现微服务间的访问控制。本文演示了使用Denier适配器实现拒绝访问,和Listchecker适配器实现黑白名单两种方法。使用场景有时需要对微服务间的相互访问进行控制,比如使满足某些条件(比如版本)的微服务能够(或不能)调用特定的微服务。访问控制属于策略
导读目前以Kubernetes为基础构建的容器生态逐渐完善,这其中Kubernetes、Istio、Knative三个独立项目被越来越多的人提及,并且已经开始尝试大规模落地实践,它们恰好构成了容器云的未来拼图。今天与大家一起分享下,这三个项目究竟解决了什么问题,为什么它们能够一鸣惊人。随着微服务理念
注:以下讲述的按理环境场景是基于Kubernetes环境基础上部署的Istio环境。涉及到Envoy概念介绍请参考深度解析Istio系列之流量控制篇。本文重点针对Envoy初始化场景进行拆解。Istio-proxy(Envoy)作为Istio数据平面的重要组件,基于sidecar方式与业务应用混合部署到同一pod,为应用提
使用云平台可以为组织提供丰富的好处。然而,不可否认的是,采用云可能会给DevOps团队带来压力。开发人员必须使用微服务以满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署。Istio允许您连接、保护、控制和观测服务。在较高的层次上,Istio有助于降低这些部署的复杂性,