当前位置: 首页 > 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导入新建工程即可。 优…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器

从本章节开始&#xff0c;进入到函数有多个参数的情况&#xff0c;前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参&#xff0c;ECX是整型的第一个参数的寄存器&#xff0c;那么多个参数的情况下函数如何传参&#xff0c;下面展开介绍参数为整型时候的几种情…...

宠物车载安全座椅市场报告:解读行业趋势与投资前景

一、什么是宠物车载安全座椅&#xff1f; 宠物车载安全座椅是一种专为宠物设计的车内固定装置&#xff0c;旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成&#xff0c;具备良好的缓冲性能&#xff0c;并可通过安全带或ISOFIX接口固定于车内。 近年来&…...