数据安全加固:深入解析滴滴ES安全认证技术方案
前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于ES具有强大的搜索和分析功能,同时也因其开源和易于使用而成为黑客攻击的目标。近些年,业界ES数据泄露事件频发, 以下是一些比较严重的数据泄露案件:
2021年12月,Socialarks泄露了400GB数据,由于ElasticSearch数据库设置错误,泄露了超过3.18亿条用户记录,涉及到Instagram、领英、Facebook等多个社交平台的用户信息。[1]
2022年6月,美的(midea.com) 某分站存在Elasticsearch未授权访问漏洞。[2]
2022年8月, 超过2.8亿条印度公民记录在网上泄露,包括用户账户信息、银行账户信息和个人身份信息。[3]
滴滴引入 ES 时,也存在ES http 9200端口未授权访问和 Kibana http 5601端口未授权访问问题,为了保障数据安全,滴滴ES团队决定尽快修复这些问题。
1
问题描述
先简单介绍下滴滴ES架构,包含如下五个部分:
1. ES集群:提供数据存储、分词、检索等服务
2. GateWay集群:ES集群代理,提供认证、鉴权、限流、路由、指标统计功能,用户通过GateWay集群读写ES集群索引
3. ES Admin管控平台:提供元数据展示,索引定时创建清理、DCDR主从切换校验等功能
4. 用户控制台:用户操作索引、展示索引信息的平台
5. 用户端:用户通过ES client访问GateWay集群
问题在于ES整个服务具备认证和鉴权能力,但ES集群单独对外时不具备安全认证能力。ES服务通过 Gateway 对外提供安全认证和鉴权服务,但 ES 集群本身并没有安全认证能力,任何人只要获取到 ES 集群 IP、端口就可以对ES集群进行任何操作。因此,我们需要对 ES 集群增加安全认证能力,并且需要对访问ES集群的admin、gateway、客户端进行安全适配工作。
2
解决方案
方案一:ES X-Pack 插件
1、ES X-Pack 插件简介
ES X-Pack是Elasticsearch的官方插件,提供了一系列的功能,包括安全性、警报、监视、报告和图形可视化等方面的支持。其中安全特性提供了身份验证、授权和加密功能,可以确保只有授权的用户才能够访问集群。
开启 X-Pack 安全特性,通过HTTP请求创建账号密码并将账号密码信息存储在ES索引中。ES集群接收HTTP请求并处理,处理过程中会调用AuthenticationService进行安全认证(通过解析请求头中的账号密码和索引账号密码对比是否一致)。HTTP认证通过后会将认证用户信息写入线程上下文,并会在TCP层执行相关操作前进行授权检查,检查该认证用户是否拥有对应操作权限,授权通过后方可执行真正的业务逻辑。
2、优势
Kibana不需要进行代码改造。Kibana 本身支持 X-Pack 插件,并在页面提供账号密码登录页面。
原生支持完整的认证、授权、审计逻辑。
3、 缺点
无法支持集群滚动重启升级,插件开启后,不仅会强制开启HTTP层账号密码身份验证,并且为了确保恶意节点无法加入集群,会强制节点之间TCP层面使用SSL加密通信认证。在滚动重启升级安全认证过程中,未升级节点和已升级节点TCP无法通信导致集群不可用。
DCDR无法同步数据,如果主集群未开启安全认证,从集群开启安全认证,由于TCP层存在授权逻辑,将会导致主集群请求从集群失败。
无法快速回滚止损,ES账号密码认证机制开启后,如果第三方因为安全认证访问异常,无法及时止损,必须集群节点全量回滚方可恢复。
误删账号密码存储索引、索引别名会导致集群不可访问,并且账号密码信息不可恢复。该插件将账号密码信息存储在集群的security索引里面,并通过索引别名访问该索引,误删该索引或者索引别名都会导致账号密码信息丢失,从而无法认证请求导致请求失败。
误操作修改密码会导致访问不可用,止损时间过长。密码恢复流程复杂,需要登录到线上机器执行5个步骤方可修改为原有集群账号密码。
4、改造点
新增动态配置支持一键开关安全认证,支持一键止损。
移除节点TCP层 TLS/SSL 加密通信逻辑,支持DCDR同步数据以及集群滚动重启。
GateWay、Admin、client需要在请求头中携带账号密码信息。
方案二:自研 ES 安全插件
1、自研 ES 安全插件原理简介
通过自研插件的方式实现 http 请求拦截器,该拦截器用于获取 http请求头携带的账号密码信息,根据本地配置文件中保存的账号密码信息进行匹配认证。如果认证成功可以继续执行后续逻辑,失败则返回认证失败异常。
2、优势
架构简单,逻辑清晰,只需在HTTP请求处理环节中进行简单的字符串校验,无需涉及节点内部TCP通信验证。
支持ES集群滚动重启升级。通过增加动态集群配置能够很方便的开启关闭权限校验,对滚动升级友好。
支持一键开关安全认证能力,可以快速止损。新增集群动态配置,一键开关安全认证,用户因为安全认证访问异常时可以快速止损。
Kibana不需要进行代码改造
1) 只需要在Kibana.yml配置正确账号密码,kibana请求就会自动携带该账号密码可访问ES集群
2) 登录Kibana页面也需要输入正确的账号密码方可访问,不要额外的认证跳转页面
避免误操作修改密码导致请求不可用。账号密码配置在elasticsearch.yml 并且强制不可修改
3、缺点
只有大账号认证功能,没有鉴权、审计等其他功能
后期修改密码需要集群节点重启生效
4、改造点
方案选择
从开发量、易运维、稳定性、易用性等角度综合比较上述两个方案,我们最终决定采用了方案二。下面是采用方案二后ES生态的查询流程:
1. ES客户端向Gateway发起查询请求。
2. Gateway对该请求进行认证和鉴权,鉴权通过后会到Admin获取对应集群的访问地址以及访问ES集群的账号密码,并缓存到本地。
3. Gateway通过步骤2获取到的ES集群账号密码,将查询请求转发到对应ES集群。
4. ES执行查询逻辑将结果返回给Gateway,Gateway将该结果返回给客户端。至此查询流程结束。
3
上线保障
安全升级涉及ES集群、ES Gateway、ES Admin、ES客户端、Fastindex(Hive2ES)、DataX(Mysql2ES)、Flink2ES。以下是升级组件的规模:
ES 共有66个集群,2236个节点
Gateway 共有28个集群,492个节点
Admin 共2个集群,12个节点
Flink2ES 共有8500+任务需要重启任务升级到最新ES客户端
Fastindex 3个集群
DataX 3个集群
其中升级最为繁琐的是ES集群。ES是一个分布式引擎,它将数据分散存储在多个节点上。当 ES 集群进行滚动升级时,一个节点重启可能会导致集群状态变为 "yellow",这意味着集群中的某些分片副本未能被分配到节点上。为了保障数据的可用性,需要等待集群状态恢复为 "green",才会对下一个节点进行重启。集群从 "yellow" 恢复到 "green"的时间长短取决于集群中的数据量和节点数量,公共集群一个节点升级极端情况下会超过1小时,所以ES所有集群完成一个大版本升级往往需要3个月以上。
为了确保所有组件都稳定升级到安全版本,守住稳定性的基石和底线,避免ES开启安全特性后影响业务读写,同时在变更时发现异常问题能快速回滚,我们做了以下工作:
ES引擎支持一键开关安全特性。前文也提到,为了支持ES集群滚动重启升级、避免ES集群、ES客户端等组件升级互相影响,也为了出现访问不可用时可以秒级回滚,ES安全认证插件支持一键开启、关闭集群安全认证能力。
依照ES集群优先级依次升级、开启安全特性。优先级从低到高分别为:日志集群、公共集群、独立集群,如果中间出现问题可以及时回滚和关闭安全特性,避免带来更大的稳定性问题。
脚本定时扫描ES集群、Gateway集群。确保所有ES节点、Gateway节点都已经升级到安全认证版本。
统计Flink任务运行版本。确保Flink2ES任务都已经升级完毕
增加ES安全认证异常指标。通过指标兜底确保集群开启安全特性时影响业务时可以及时发现并关闭集群安全特性,等用户升级完毕后再重新开启。
4
总结
历时3个多月, ES RD 同学配合ES SRE同学完成了所有ES组件的升级,Flink2ES 任务也在Flink团队的大力支持下完成全量重启升级,DataX 在同步中心同学配合下完成了升级。并且在业务几乎无感情况下开启了所有集群的安全特性。至此,滴滴ES线上所有集群都支持安全认证能力,大大降低了数据泄露和数据丢失的风险。
相关文章:

数据安全加固:深入解析滴滴ES安全认证技术方案
前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于ES具有强大的搜索和分析功能,同时也因其开源和易于使用而成为黑客攻击的目标。近些年,业界ES数据泄露事件频发, 以下是一些比较严重的数据泄露案件: 202…...
Typescript第九/十章 前后端框架,命名空间和模块
第九章 前后端框架 9.1 前端框架 Typescript特别适合用于开发前端应用。Typescript对JSX有很好的支持,而且能安全地建模不可变性,从而提升应用的结构和安全性,写出的代码正确性高,便于维护。 9.1.1 React JSX/TSX内容等 详情…...
LLM - argparse 解析脚本参数
目录 一.引言 二.argparse 解析 shell 参数 1.使用步骤 2.python 侧示例 3.shell 侧示例 一.引言 CUDA_VISIBLE_DEVICES0 python src/train_bash.py \--stage pt \--model_name_or_path path_to_your_model \--do_train \--dataset wiki_demo \--template default \--fin…...

谈一谈在两个商业项目中使用MVI架构后的感悟
作者:leobertlan 前言 当时项目采用MVP分层设计,组员的代码风格差异也较大,代码中类职责赋予与封装风格各成一套,随着业务急速膨胀,代码越发混乱。试图用 MVI架构 单向流 形成 掣肘 带来一致风格。 但这种做法不够以…...

ApacheCon - 云原生大数据上的 Apache 项目实践
Apache 软件基金会的官方全球系列大会 CommunityOverCode Asia(原 ApacheCon Asia)首次中国线下峰会将于 2023 年 8 月 18-20 日在北京丽亭华苑酒店举办,大会含 17 个论坛方向、上百个前沿议题。 字节跳动云原生计算团队在此次 CommunityOve…...

Git 代码分支规范
目的 俗话说:没有规矩,不成方圆。遵循一个好的规章制度能让你的工作事半功倍。同时也可以展现出你做事的认真的态度以及你的专业性,不会显得杂乱无章,管理困难。Git分支规范也是一样。当遵循了某种约定的Git分支,在代…...

ATFX汇评:美7月通胀率数据基本符合预期,美指仍无法站稳103关口
ATFX汇评:据美劳工部,美国7月未季调CPI年率,最新值3.2,高于前值3%,低于预期值3.3%,这标志着连续12个月的下降已经停止;7月未季调核心CPI年率,最新值4.7%,低于前值4.8%&am…...

系统架构设计专业技能 · 软件工程(一)【系统架构设计师】
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

C语言 指针的运算
目录 一、介绍 二、指针 整数 、指针 - 整数 二、指针 - 指针 四、指针的关系运算 一、介绍 在C语言中,指针的运算分为三类 1、指针 整数 、指针 - 整数2、指针 - 指针3、指针的关系运算 二、指针 整数 、指针 - 整数 因为数组在…...

【JAVA基础】- 同步非阻塞模式NIO详解
【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO(Non-Blocking IO)是同步非阻塞方式来处理IO数据。…...

dingding机器人
“自定义机器人”只支持消息发送,自动回复需要“企业内部机器人” 消息发送 import requests import jsonres requests.post(https://oapi.dingtalk.com/robot/send?access_token036a339axxx,data json.dumps({"text": {"content":"h…...

6.6 实现卷积神经网络LeNet训练并预测手写体数字
模型架构 代码实现 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(nn.Conv2d(1,6,kernel_size5,padding2),nn.Sigmoid(),#padding2补偿5x5卷积核导致的特征减少。nn.AvgPool2d(kernel_size2,stride2),nn.Conv2d(6,16,kernel_size5),nn.S…...

Django路由Router
文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redire…...

蜜蜂路线 P2437
蜜蜂路线 题目背景 无 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m 开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误&…...

无脑——010 复现yolov8 使用yolov8和rt detr 对比,并训练自己的数据集
1.配置环境 1. 首先去官网下载yolov8的zip https://github.com/ultralytics/ultralytics 存放在我的目录下G:\bsh\yolov8 然后使用conda创建新的环境 conda create -n yolov8 python3.8 #然后激活环境 conda activate yolov8然后安装pytorch,注意 ,py…...

如何给Google Chrome增加proxy
1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件,可以是用这个命令 chmod x 文件名 3. 然后执行这个命令: ./sthp-linux -p 8080 -s 127.0.0.1:…...
设计模式——原型模式
原型模式就是有时我们需要多个类的实例,但是一个个创建,然后初始化,这样太麻烦了,此时可以使用克隆,来创建出克隆对象,就能大大的提高效率。具体就是要让此类实现Cloneable接口,然后重写Object类…...
Spring框架中的Bean生命周期
目录 Bean的实例化 BeanFactoryPostProcessor 属性赋值 循环依赖 初始化 处理各种Aware接口 执行BeanPostProcessor前置处理 执行InitializingBean初始化方法或执行init-method自定义初始化方法 执行BeanPostProcessor后置处理 销毁 Spring Bean 的生命周期总体分为…...
async和await修饰符
async和await是JavaScript中用来处理异步操作的关键字 。 async和await也是解决回调地域的终极方案,简单,而Promise链混杂难以看懂。 async关键字用于定义一个函数,使其返回一个Promise对象。这意味着该函数可以通过await关键字来暂停执行&…...

vivado tcl创建工程和Git管理
一、Tcl工程创建 二、Git版本管理 对于创建完成的工程需要Git备份时,不需要上传完整几百或上G的工程,使用tcl指令创建脚本,并只将Tcl脚本上传,克隆时,只需要克隆tcl脚本,使用vivado导入新建工程即可。 优…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...