数据安全加固:深入解析滴滴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导入新建工程即可。 优…...

运行示例程序和一些基本操作
欢迎 ----> 示例 --> 选择sample CTRL B 编译代码 CTRL R 运行exe 项目 中 Shadow build 表示是否 编译生成文件和 源码是否放一块 勾上不在同一个地方 已有项目情况下怎么打开项目 方法一: 左键双击 xxx.pro 方法二: 文件菜单里面 选择打开项目...

大语言模型评测体系全解析(下篇):工具链、学术前沿与实战策略
文章目录 一、评测工具链:从手工测试到自动化工程的效率革命(一)OpenCompass:开源评测框架的生态构建1. 技术架构:三层架构实现评测自动化2. 开发者赋能:从入门到进阶的工具矩阵 (二)…...
leetcode 2434. 使用机器人打印字典序最小的字符串 中等
给你一个字符串 s 和一个机器人,机器人当前有一个空字符串 t 。执行以下操作之一,直到 s 和 t 都变成空字符串: 删除字符串 s 的 第一个 字符,并将该字符给机器人。机器人把这个字符添加到 t 的尾部。删除字符串 t 的 最后一个 字…...
极速互联·智控未来——SG-Can(FD)Hub-600 六通道CANFD集线器
工业通信的全维进化,CANFD高速网络的终极枢纽! 核心革新 CANFD协议深度支持:名义波特率5K-1Mbps,数据域速率飙升至5Mbps(较传统CAN提升5倍),开启位速率转换最低100Kbps,完美兼容新旧…...

(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
题目:2434. 使用机器人打印字典序最小的字符串 思路:贪心栈,时间复杂度0(n)。 字符串t其实就是栈,后进先出。要让p的字典序最小,那当然是t每次弹出的字符,都小于或等于“剩下未入t里的字符串的字符”&#…...
软考 系统架构设计师系列知识点之杂项集萃(83)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(82) 第150题 体系结构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM)是一种常见的系统架构评估框架,该框架主要关注系统的…...

【计算机网络】非阻塞IO——select实现多路转接
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹:【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机 🔖流水不争࿰…...

第R9周:阿尔茨海默病诊断(优化特征选择版)
文章目录 1. 导入数据2. 数据处理2.1 患病占比2.2 相关性分析2.3 年龄与患病探究 3. 特征选择4. 构建数据集4.1 数据集划分与标准化4.2 构建加载 5. 构建模型6. 模型训练6.1 构建训练函数6.2 构建测试函数6.3 设置超参数 7. 模型训练8. 模型评估8.1 结果图 8.2 混淆矩阵9. 总结…...

【推荐算法】DeepFM:特征交叉建模的革命性架构
DeepFM:特征交叉建模的革命性架构 一、算法背景知识:特征交叉的演进困境1.1 特征交叉的核心价值1.2 传统方法的局限性 二、算法理论/结构:双路并行架构2.1 FM组件:显式特征交叉专家2.2 Deep组件:隐式高阶交叉挖掘机2.3…...
深入理解Java单例模式:确保类只有一个实例
文章目录 什么是单例模式?为什么我们需要单例模式?单例模式的常见实现方式1. 饿汉式(Eager Initialization)2. 懒汉式(Lazy Initialization)3. 双重检查锁定(Double-Checked Locking - DCL&…...