38.云原生之Istio安全-流量鉴权加密

云原生专栏大纲

文章目录

  • TLS 和 mTLS
    • TLS 和 mTLS使用场景
    • TLS 加密通信的流程
    • 终止 TLS
    • 什么时候用 mTLS?
    • 什么时候不用 mTLS?
  • 流量加密
    • 入口流量加密
    • 内部流量加密
      • PeerAuthentication 为工作负载设置 mTLS
      • DestinationRule 为工作负载设置 mTLS
  • 安全最佳实战

TLS 和 mTLS

TLS(Transport Layer Security)和 mTLS(mutual TLS)都是用于加密通信的协议,用于保护数据在网络上的传输安全。它们在保护通信方面有一些区别:

  1. TLS(Transport Layer Security)
    • TLS 是一种加密通信协议,用于在网络上安全地传输数据。它用于建立安全的通信通道,确保数据在传输过程中不被篡改或窃取。
    • TLS 通常用于客户端和服务器之间的通信,并且只要求服务器端提供证书,客户端验证服务器身份。
    • 在 Web 安全中,HTTPS(HTTP over TLS)就是使用 TLS 来加密 HTTP 通信的协议。
  2. mTLS(mutual TLS)
    • mTLS 是 TLS 的一种扩展,也称为双向 TLS 或双向认证。它要求通信双方(客户端和服务器)都提供证书,进行相互验证身份。
    • 在 mTLS 中,不仅服务器验证客户端的身份,客户端也验证服务器的身份。这种双向验证确保了通信的双方都是可信的,并且加强了通信的安全性。

主要区别在于 TLS 通常是单向验证,而 mTLS 是双向验证。mTLS 提供了更高级别的安全性,因为它不仅验证服务器的身份,还验证客户端的身份,确保了通信的完整性和安全性。
在网络安全领域,mTLS 通常用于要求更严格的安全标准的场景,如微服务之间的通信、API 访问控制等。通过使用 mTLS,可以确保通信双方的身份验证和通信数据的加密,提高了通信的安全性和可靠性。

TLS 和 mTLS使用场景

TLS(Transport Layer Security)和 mTLS(mutual TLS)在网络通信中有不同的使用场景,根据安全需求和通信模型的不同,选择合适的加密方式非常重要:
TLS 使用场景

  1. Web通信:TLS 在 Web 通信中广泛应用,用于加密 HTTP 通信,形成 HTTPS 协议,保护 Web 应用的数据传输安全。
  2. 客户端-服务器通信:在传统的客户端-服务器模型中,服务器通常会提供证书,客户端验证服务器的身份,确保通信的安全性。
  3. 加密数据传输:TLS 可用于保护数据在网络上的传输,确保数据在传输过程中不被篡改或窃取。
  4. 保护隐私数据:适用于需要保护用户隐私数据的应用场景,如登录、支付等敏感操作。

mTLS 使用场景

  1. 微服务通信:在微服务架构中,各个服务之间的通信可能需要更严格的安全性要求,mTLS 可用于确保服务之间的双向身份验证和通信加密。
  2. API 访问控制:在 API 访问控制中,服务端可以要求客户端提供证书进行身份验证,确保只有授权的客户端可以访问 API。
  3. 云原生环境:在容器化和云原生环境中,mTLS 可用于保护容器间的通信,确保容器之间的安全通信。
  4. 内部通信:适用于内部系统或服务之间的通信,要求更高级别的安全性和身份验证。

总的来说,TLS 适用于大多数常规的加密通信场景,而 mTLS 则适用于对通信安全性要求更高、需要双向身份验证的场景,如微服务架构、API 访问控制等。选择合适的加密方式取决于您的安全需求和通信模型。

TLS 加密通信的流程

在这里插入图片描述

  1. 服务器向受信任的 CA(证书管理机构)申请并获得证书(X.509 证书);
  2. 客户端向服务端发起请求,其中包含客户端支持的 TLS 版本和密码组合等信息;
  3. 服务器回应客户端请求并附上数字证书;
  4. 客户端验证证书的状态、有效期和数字签名等信息,确认服务器的身份;
  5. 客户端和服务器使用共享秘钥实现加密通信;

参考:TLS 握手期间会发生什么?
写给 Kubernetes 工程师的 mTLS 指南 | 云原生资料库

终止 TLS

TLS 终止(TLS Termination)指的是在将 TLS 加密流量传递给 Web 服务器之前对其进行解密的过程。将 TLS 流量卸载到入口网关或专用设备上,可以提高 Web 应用的性能,同时确保加密流量的安全性。一般运行在集群入口处,当流量到达入口处时实施 TLS 终止,入口与集群内服务器之间的通信将直接使用 HTTP 明文,这样可以提高服务性能。

在这里插入图片描述


Istio 默认在入口网关处终止 TLS,然后再为网格内的服务开启 mTLS。你也可以让流量直通(passthrough)到后端服务处理,例如:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: sample-gateway
spec:servers:- port:number: 443name: httpsprotocol: HTTPStls:mode: PASSTHROUGH

什么时候用 mTLS?

互联网客户端对 Web 服务的访问,一般使用单向 TLS,即只需要服务端提供身份证明,而不关心客户端的身份。当你需要验证客户端身份时,使用单向 TLS 可以使用密码、token、双因子认证等方式。不过这样的认证方式需要应用程序内部支持,而双向 TLS 是运行在应用程序之外的,不需要多应用逻辑进行修改。

  1. 实施 mTLS 的服务间需要交换证书,当服务数量变大时,就需要管理大量的证书,这需要消耗大量的精力,使用服务网格可以帮助你实现自动 mTLS,彻底解决证书管理的难题。
  2. 微服务通信:在微服务架构中,各个服务之间的通信可能需要更严格的安全性要求,mTLS 可用于确保服务之间的双向身份验证和通信加密。
  3. API 访问控制:在 API 访问控制中,服务端可以要求客户端提供证书进行身份验证,确保只有授权的客户端可以访问 API。
  4. 云原生环境:在容器化和云原生环境中,mTLS 可用于保护容器间的通信,确保容器之间的安全通信。
  5. 内部通信:适用于内部系统或服务之间的通信,要求更高级别的安全性和身份验证。

什么时候不用 mTLS?

虽然 mTLS 是确保云原生应用程序服务间通信安全的首选协议,但是应用 mTLS 需要完成复杂的对称加密、解密过程,这将非常耗时且消耗大量的 CPU 资源。
对于某些安全级别不高的流量,如果我们在流量入口处终止 TLS,并网格内部仅对针对性的服务开启 mTLS,就可以加快请求响应和减少计算资源消耗。

流量加密

Istio流量主要包含入口流量和内部流量,入口流量是需要TLS进行加密的,加密解密过程是需要消耗CPU资源的,若是集群规模比较大内部服务多,内部流量

在这里插入图片描述

  1. 外部入站流量 这是被 Sidecar 捕获的来自外部客户端的流量。 如果客户端在网格外面,该流量可能被 Istio 双向 TLS 加密。 Sidecar 默认配置 PERMISSIVE (宽容)模式:接受 mTLS 和 non-mTLS 的流量。 该模式能够变更为 STRICT (严格)模式,该模式下的流量流量必须是 mTLS;或者变更为 DISABLE (禁用)模式, 该模式下的流量必须为明文。mTLS 模式使用 PeerAuthentication资源配置。
  2. 内部入站流量 这是从 Sidecar 流出并引入您的应用服务的流量。流量会保持原样转发。 注意这并不意味着它总是明文状态,Sidecar 可能也通过 TLS 连接。 这只意味着一个新的 TLS 连接将不会从 Sidecar 中产生。
  3. 内部出站流量 这是被 Sidecar 拦截的来自您的应用服务的流量。 您的应用可能发送明文或者 TLS 的流量。 如果自动选择协议已开启,Istio 将能够自动地选择协议。 否则您可以在目标服务内使用端口名手动指定协议。
  4. 外部出站流量 这是离开 Sidecar 到一些外部目标的流量。流量会报错原样转发,也可以启动一个 TLS 连接(mTLS 或者标准 TLS)。 这可以通过 DestinationRule资源中的 trafficPolicy 来控制使用的 TLS 模式。 模式设置为 DISABLE 将发生明文,而 SIMPLE、MUTUAL 和 ISTIO_MUTUAL 模式将会发起一个 TLS 连接。

关键要点是:

  • PeerAuthentication 用于配置 Sidecar 接收的 mTLS 流量类型。
  • DestinationRule 用于配置 Sidecar 发送的 TLS 流量类型。
  • 端口名,或者自动选择协议,决定 sidecar 解析流量的协议。

入口流量加密

理解 TLS 配置
作为入站请求的一部分,网关必须对流量进行解码才能应用路由规则。 网关根据 Gateway资源中的服务配置解码。 例如,如果入站连接是明文的 HTTP,则端口协议配置成 HTTP:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
...servers:- port:number: 80name: httpprotocol: HTTP

同样,对于原始 TCP 流量,协议将设置为 TCP。
对于 TLS 连接,还有更多选项:

  1. 封装了什么协议? 如果连接是 HTTPS,服务协议应该配置成 HTTPS。 反之,对于使用 TLS 封装的原始 TCP 连接,协议应设置为 TLS。
  2. TLS 连接是终止还是通过? 对于直通流量,将 TLS 模式字段配置为 PASSTHROUGH:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
...servers:- port:number: 443name: httpsprotocol: HTTPStls:mode: PASSTHROUGH

在这种模式下,Istio 将根据 SNI 信息进行路由并将请求按原样转发到目的地。

  1. 是否应该使用双向 TLS ? 相互 TLS 可以通过 TLS 模式 MUTUAL 进行配置。配置后,客户端证书将根据配置的 caCertificates 或 credentialName 请求和验证:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
...servers:- port:number: 443name: httpsprotocol: HTTPStls:mode: MUTUALcaCertificates: ...

内部流量加密

如何理解 Istio 中的 mTLS 流量加密?
tio 的对等认证默认使用 PERMISSIVE 模式,自动将 mTLS 流量发送到这些工作负载,将纯文本流量发送到没有 sidecar 的工作负载。在将 Kubernetes 服务纳入 Istio 网格后,为了防止服务无法通过 mTLS,我们可以先使用 PERMISSIVE 模式。当我想为某些服务开启严格的 mTLS 模式时,可以使用以下两种方式之一:

  • 使用 PeerAuthentication 定义流量如何在 sidecar 之间传输;
  • 使用 DestinationRule 定义流量路由策略中的 TLS 设置;

PeerAuthentication 为工作负载设置 mTLS

你可以使用 namespace 和 selector 指定某个命名空间下的某个工作负载开启严格的 mTLS。例如下面的配置:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:name: foo-peer-policynamespace: default
spec:selector:matchLabels:app: reviewsmtls:mode: STRICT

你也可以给安装 Istio 的命名空间 istio-system 设置严格的 mTLS,那样会为网格中的所有服务开启严格的 mTLS,详细步骤请参考 Istio 文档 。

PeerAuthentication 中指定对目标工作负载实施的 mTLS 模式。对等认证支持以下模式:

  • PERMISSIVE:默认值,工作负载可接受双向 TLS 或纯文本流量;
  • STRICT:工作负载仅接受 mTLS 流量;
  • DISABLE:禁用 mTLS。从安全角度来看,除非你有自己的安全解决方案,否则不应禁用 mTLS;
  • UNSET:从父级继承,优先级为服务特定 > 命名空间范围 > 网格范围的设置;

DestinationRule 为工作负载设置 mTLS

DestinationRule 用于设置流量路由策略,例如负载均衡、异常点检测、TLS 设置等。其中 TLS 设置中包含多种模式 ,使用 ISTIO_MUTUAL 模式可以为工作负载开启 Istio 的自动 TLS,如下所示。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:name: reviewsnamespace: default
spec:host: reviewstrafficPolicy:tls:mode: ISTIO_MUTUAL

安全最佳实战

参考官网:安全最佳实践 安全策略示例
安全中通常会匹配那些路径能访问,通常这些访问路径研发人员才知道,若全是交给技术设施人员比较吃力,此处小编建议使用SpringcloudGateway网关进行路由规则的配置。istio人员只需配置限制的域名,流量加密鉴权等。在内部服务对安全要求较高的服务上加mTLS,网关入口终止TLS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 中文文档

模型(Model) https://openai.xiniushu.com/docs/modelsOpenAI 中文文档

hive 中少量数据验证函数的方法-stack

可以使用 stack 将少量数据直接写在sql中,然后用于验证是否正确 1、每个省累计销量前1名的城市 t1(pro_name,city_name,sale_num,sale_date) 源数据: ‘河北’,‘石家庄’,‘1’,‘2022-01-01’ ,‘河北’,‘石家庄’,‘2’,‘2022-01-02’ ,‘河北’,‘…

【vue3 路由使用与讲解】vue-router : 超详细全面介绍

# 核心内容介绍 路由跳转有两种方式&#xff1a; 声明式导航&#xff1a;<router-link :to"...">编程式导航&#xff1a;router.push(...) 或 router.replace(...) &#xff1b;两者的规则完全一致。 push(to: RouteLocationRaw): Promise<NavigationFailur…

Secure Boot(安全启动)

Secure Boot&#xff08;安全启动&#xff09;的原理基于链式验证&#xff0c;这是一种确保计算机在启动过程中只加载和执行经过认证的软件的机制。这个过程涉及到硬件、固件和操作系统的多个层面。以下是Secure Boot的基本原理&#xff1a; 密钥和证书&#xff1a;Secure Boot…

day07_分类管理EasyExcel品牌管理

文章目录 1 分类管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 列表查询1.4.1 需求分析1.4.2 后端接口CategoryCategoryControllerCategoryServiceCategoryMapperCategoryMapper.xml 1.4.3 前端对接category.jscategory.vue 2 EasyExcel2.1 数据导入导出意义2.2 EasyExcel简介…

ABAP - SALV教程 01- 开篇:打开SALV的三种方式之一

关于SALV&#xff0c;这里参考巨佬江正军的文章讲解&#xff0c;在做SAP开发的遇到困难和瓶颈的时候&#xff0c;每每读到巨佬的文章都会灵感爆发、醍醐灌顶。https://www.cnblogs.com/jiangzhengjun/p/4291387.html 博主由于是由JAVA转型的ABAP开发&#xff0c;刚接触ABAP的时…

力扣细节题:判断是否为平衡二叉树

经典题&#xff0c;需要记忆&#xff0c;且注意fabs和fmax函数的使用 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int deep(struct TreeNode*root){if(rootNULL){return 0;}r…

Unity3D 渲染队列 ZTest与ZWrite详解

前言 在Unity3D中&#xff0c;渲染队列&#xff08;Rendering Queue&#xff09;是一个非常重要的概念&#xff0c;它决定了游戏中各个物体的渲染顺序和优先级。而在渲染队列中&#xff0c;ZTest和ZWrite又是两个关键的参数&#xff0c;它们决定了物体在渲染的过程中如何处理深…

研发效能最佳实践:持续集成应用实践丨IDCF

作者&#xff1a;谢带达 研发效能&#xff08;DevOps&#xff09;工程师&#xff08;中级&#xff09;认证学员 一、DevOps概述 DevOps的发展可以追溯到2009年&#xff0c;当时由Patrick Debois和Andrew Clay Shafer发起了第一次DevOps Days会议。随后&#xff0c;DevOps开始…

【R语言简介】讲解

R语言简介&#xff0c;环境与基础语法及注释 1. R语言简介2. 环境安装3. 基础语法3.1 变量赋值3.2 数据结构3.3 函数调用3.4 控制流3.5 注释 4. 基本的数据操作和函数 1. R语言简介 R语言是一种专为统计分析、数据挖掘和图形展示而设计的编程语言和软件环境&#xff0c;它由统…

应用引导页配置相关 - iOS

应用引导页配置相关,通过 ScrollView 滑动至末页点击进入主页,具体实现方式如下,可供参考; /**加载引导页*/ - (void)loadGuidePage {// 基础配置self.window [[UIWindow alloc] initWithFrame:SCREEN_RECT];self.window.backgroundColor [UIColor whiteColor];viewControll…

永磁同步电机无感FOC(龙伯格观测器)算法技术总结-实战篇

文章目录 1、ST龙伯格算法分析&#xff08;定点数&#xff09;1.1 符号说明1.2 最大感应电动势计算1.3 系数计算1.4 龙伯格观测器计算1.5 锁相环计算1.6 观测器增益计算1.7 锁相环PI计算&#xff08;ST&#xff09;1.8 平均速度的用意 2、启动策略2.1 V/F压频比控制2.2 I/F压频…

qnx shell sh ,linux shell bash

for i in 1 2 3 4 5 doecho $i doneecho $SHELL Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门_centos sh bash-CSDN博客

php cli 多进程编程

前言 php cli 命令模式我想在日常开发中&#xff0c;大家用的都比较少。其实&#xff0c;在某些场景&#xff0c;cli命令真的很有作用&#xff0c; 我举个例子 在mysql数据库的某个表tab1中数据量有3000W条数据&#xff0c;现在需要对这张表中的每一条数据做计算处理。将处理…

设计模式(含7大原则)面试题

目录 主要参考文章 设计模式的目的 设计模式的七大原则 设计模式的三大分类及关键点 1、创建型模式(用于解耦对象的实例化过程) 2、结构型模式 3、行为型模式 23种设计模式(乱序--现学现写,不全面--应付面试为主) 单例模式 模板模式 哈哈哈哈哈 声明 此文只针…

策略模式代码示例(二)

一、定义 策略模式&#xff0c;针对每一个不同的类型&#xff0c;调用具有共同接口的不同实现类&#xff0c;从而使得它们可以相互替换。 策略模式 &#xff0c;针对实现同一接口的不同的类&#xff0c;采用不同的策略。比如&#xff0c;面对高级会员、初级会员会采用不同的折…

详解字符串函数<string.h>(下)

1. strncpy函数的使用和模拟实现 char* strncpy(char* destination, const char* source, size_t num) 1.1 函数功能以及用法 拷贝指定长度的字符串 将“source”指向的字符串中的“num”个字符拷贝到“destination”指向的字符数组中。相比于strcpy函数&#xff0c;该函数多…

SQL语言的五大分类 (DQL、DDL、DML、DCL、TCL)

目录 一、DQL 二、DDL 三、DML 四、DCL 五、TCL 一、DQL&#xff08;数据查询语言&#xff09; Data Query Language&#xff0c;数据查询语言&#xff1a; select&#xff1a;用于数据查询 关键字&#xff1a;SELECT ... FROM ... WHERE 二、DDL&#xff08;数据定义语…

swift 长按桌面图标弹出快捷选项

文章目录 一、3D Touch二、主屏交互1. 静态添加2. 动态添加三、监听主屏交互按钮的点击事件四、预览和跳转1. 注册3D touch2. 实现协议3. 在目标控制器复写previewActionItems4. 使用UIContextMenuConfiguration一、3D Touch 3D Touch通过屏幕下方的压力感应器来感知不同的压力…

Cesium地表透明

之前Cesium是不能地表透明的&#xff0c;需要改内部代码&#xff0c;将GlobeSurfaceTileProvider.js中的PASS.GLOBE改成PASS.TRANSPARENT&#xff0c;通过将地表的drawCommand放到透明队列里渲染。现在发现有了新的方法&#xff08;其实2020年就有该方法了&#xff09;&#xf…