当前位置: 首页 > news >正文

数据安全加固:深入解析滴滴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集群

cd34d4e6495c62e57ac5cba053ab86fd.png

问题在于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、改造点

0701649d1829d25a1de8a3604422f049.png

方案选择

从开发量、易运维、稳定性、易用性等角度综合比较上述两个方案,我们最终决定采用了方案二。下面是采用方案二后ES生态的查询流程:

1. ES客户端向Gateway发起查询请求。

2. Gateway对该请求进行认证和鉴权,鉴权通过后会到Admin获取对应集群的访问地址以及访问ES集群的账号密码,并缓存到本地。

3. Gateway通过步骤2获取到的ES集群账号密码,将查询请求转发到对应ES集群。

4. ES执行查询逻辑将结果返回给Gateway,Gateway将该结果返回给客户端。至此查询流程结束。

ea650f5cd1a1cf621eca32b1ed3059b9.png

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安全认证异常指标。通过指标兜底确保集群开启安全特性时影响业务时可以及时发现并关闭集群安全特性,等用户升级完毕后再重新开启。

6449f0848415445bdd960595b604d043.png

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

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

无脑——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&#xff0c;注意 &#xff0c;py…...

如何给Google Chrome增加proxy

1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件&#xff0c;可以是用这个命令 chmod x 文件名 3. 然后执行这个命令&#xff1a; ./sthp-linux -p 8080 -s 127.0.0.1:…...

设计模式——原型模式

原型模式就是有时我们需要多个类的实例&#xff0c;但是一个个创建&#xff0c;然后初始化&#xff0c;这样太麻烦了&#xff0c;此时可以使用克隆&#xff0c;来创建出克隆对象&#xff0c;就能大大的提高效率。具体就是要让此类实现Cloneable接口&#xff0c;然后重写Object类…...

Spring框架中的Bean生命周期

目录 Bean的实例化 BeanFactoryPostProcessor 属性赋值 循环依赖 初始化 处理各种Aware接口 执行BeanPostProcessor前置处理 执行InitializingBean初始化方法或执行init-method自定义初始化方法 执行BeanPostProcessor后置处理 销毁 Spring Bean 的生命周期总体分为…...

async和await修饰符

async和await是JavaScript中用来处理异步操作的关键字 。 async和await也是解决回调地域的终极方案&#xff0c;简单&#xff0c;而Promise链混杂难以看懂。 async关键字用于定义一个函数&#xff0c;使其返回一个Promise对象。这意味着该函数可以通过await关键字来暂停执行&…...

vivado tcl创建工程和Git管理

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

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...