一种配置化的数据脱敏与反脱敏框架实现

一种,配置,数据,脱敏,框架,实现 · 浏览次数 : 186

小编点评

**4.1 日志文件配置** ```xml &configuration scan="true" scanPeriod="60 seconds" debug="false" <contextName>demo</contextName> <!-- 日志最大的历史 单位:天 --> <property name="maxHistory" value="90"/> <property name="LOG_PATTERN" value=\"%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8:00} : %m%n\"/> <appender name="mask" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file> <pattern>${LOG_DES_PATTERN}</pattern> <encoder> <charset>${LOG_CHARSET}</charset> <pattern>${LOG_DES_PATTERN}</pattern> </encoder> </appender> <logger name="com.jd.car.tony.log.DefaultMaskLogProcessor" additivity="false"> <level value="INFO" /> <appender-ref ref="mask" /> </logger></configuration> ``` **4.3 场景接入** ```java @RequestMapping(\"test\") @MaskMethod(\"order\") public DemoResult test(AuthInfoBO authInfo) { return new DemoResult(); } ``` **4.4 业务监控业务监控点触发逻辑敏感数据明文查看单账号、单日、单接口访问次数到达访问限额时,则发送邮件给权限管理人员。敏感数据查询日志敏感数据脱敏后、明文数据查看时,按集团要求格式单独记录到日志文件中。作者:京东零售 邱新达来源:京东云开发者社区。归纳总结以上内容,生成内容时需要带简单的排版

正文

1.tony框架背景

  • 在业务量日益剧增的背景下,大量数据在各种业务活动中产生,数据安全控制一直是治理的重要环节,数据脱敏属于安全控制的范畴。对互联网公司来说,数据安全一直是极为重视和敏感的话题。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息按照相关部门规定,都需要进行数据脱敏。

  • 在现有的微服务技术架构背景下,敏感数据的使用存在如下痛点:

    • 敏感数据与PC、APP客户端使用明文数据交互,数据安全无法保证。

    • 敏感数据浏览缺乏监控,无法针对性的做数据治理。

    • 微服务架构系统应用多而杂,期望引入一套通用的方案统一解决敏感数据安全问题。

基于以上痛点,tony提供了一套完整、安全、透明化、低改造成本的数据脱敏整合解决方案。

2.tony框架简介

Tony是一款敏感数据脱敏与浏览记录监控工具,可对系统中的敏感信息进行脱敏处理,并在泄漏时提供追溯依据,为企业数据共享、迁移、分发提供安全保护措施。该项目基于spring进行开发,提供spring-boot-starter启动包,接入简单,主要实现功能如下:

灵活的脱敏方案

业务系统的数据千变万化,为确保所有业务数据都能够正常进行敏感信息处理,数据脱敏提供高灵活性的自定义脱敏配置。通过丰富多样的脱敏规则定义,敏感数据处理可实现高度契合业务的脱敏处理。

统一的明文数据管理

框架内置敏感数据对应的明文数据管理流程,将明文数据统一缓存管理,提供统一的明文数据访问api。

浏览记录留痕

针对不同用户对敏感信息明文数据的浏览动作,接入方可以自定义日志格式模版记录输出到日志文件中,做到每条数据的浏览有迹可循。

异常浏览量预警

接入方通过自定义脱敏配置可以设置不同场景的敏感浏览明文数据量阈值,开启告警后,当用户访问明文数据次数到达阈值后,会触发预警流程,接入方可自定义预警逻辑。

tony整体架构:

tony-core模块定义了基本的脱敏功能实现,整体流程采用spi机制预留了充分的扩展空间。以tony-core为底座,集成汽车现有技术栈提供了tony-transformers模块对基础的脱敏功能进行了扩展:异步的缓存事件分发,分布式明文数据缓存,对接集团安全部门的敏感日志留痕,异常浏览量的邮件预警。

tony架构图.png

name desc
MaskAnnotationProcessor 业务场景代理,通过注解代理对应的脱敏场景方法。
IMaskProcess 数据脱敏处理器
IMaskLogProcessor 数据浏览日志处理器
IMaskCacheProcessor 明文数据缓存处理器
IMaskLimitProcessor 明文数据访问限额管理
IMaskWarningProcessor 异常浏览预警处理
IMaskContent 上下文信息处理器
IUnMaskProcessor 明文数据获取处理器
DefaultUnMaskProcessorAdapter 明文数据获取适配器,提供从缓存中获取明文数据功能。
DefaultMaskCacheProcess 明文数据缓存处理器,提供分布式缓存功能。
DefaultMaskContent 上下文信息处理器,提供ThreadLocal实现。
DefaultMaskWarningProcessor 异常浏览预警处理,提供邮件告警实现。
PlaintextProcess 明文属于获取接口约束,可自定义明文数据获取的扩展。
MaskMonitorCacheHandle 缓存时间消费,异步消费缓存事件,存储明文数据。

tony处理流程详解:

tony和业务代码部署在一起,接入应用通过脱敏场景与脱敏配置项的指定来实现对应业务场景的脱敏代理。业务代码只需配置场景注解即可兼容使用。此时敏感数据的脱敏工作由tony负责,tony会拦截业务场景的响应数据,对敏感信息进行脱敏处理。

tony处理流程详解.png

tony脱敏配置详解:

脱敏配置主要分为四部分:脱敏上下文配置,脱敏场景配置,脱敏预警配置以及日志留痕模版,其详情如下图所示:

tony脱敏配置简介.png

key name desc
tony.appName 接入系统名称
tony.maskSourceName 脱敏白名单 控制统一场景的接口对不同调用方进行数据是否脱敏控制
tony.mask.XXX 脱敏场景 XXX为具体场景的key
tony.mask.XXX.enable 动态开关 控制是否开启脱敏
tony.mask.XXX.limits 明文浏览限额 限制明文浏览次数
tony.mask.XXX.cacheKey 数据缓存解析规则 示例:STATEMENT_BILL_PAGE:${argItem.id}
tony.types.YYY 脱敏字段 YYY为具体字段的key
tony.types.YYY.regex 脱敏规则配置 脱敏的正则表达式 示例:(\d{3})\d{4}(\d{4})
tony.types.YYY.replacement 脱敏规则配置 脱敏的正则表达式 示例:$1****$2
tony.types.YYY.logName 日志字段名称

3. 系统详细设计

3.1 详细设计

3.1.1 活动图

未命名绘图-第 14 页 (1).png

3.1.2 时序图

未命名绘图-第 13 页 (2).png

3.1.3 类图

Tony框架.png

职责
com.jd.car.tony.annoation 注解层 负责声明要被代理的业务操作。
com.jd.car.tony.limit 负责记录敏感数据的访问次数,并提供预警。
com.jd.car.tony.mask 管理基础配置,并根据配置进行敏感数据遮盖脱敏。
com.jd.car.tony.log 记录敏感数据的访问操作,输出统一格式的日志信息。
com.jd.car.tony.unmask 提供敏感数据的明文信息查看功能。
com.jd.car.tony.support util包,负责全局功能的支持。

4. 接入使用

4.1 引入坐标

			<dependency>
                <groupId>com.jd.car</groupId>
                <artifactId>tony-spring-boot-starter</artifactId>
                <version>1.8-RELEASE</version>
            </dependency>



4.2 yaml配置

tony:
  appName: "appName"
  #鉴权信息key
  sessionName: ""
  systemName: "systemName"
  warningName: "XXX"
  #脱敏白名单
  maskSourceName: ""
  types:
    name:
      regex: "([\\u4e00-\\u9fa5a-z0-9]{1})[\\u4e00-\\u9fa5a-z0-9]+"
      replacement: "$1**"
      logName: "accountName"
  mask:
    order:
      enable: true
      limits: 100
      limitError: false
      cacheKey: "order:${argItem.id}"
      menuName: "场景名称"
      name: "order"
      #日志记录操作类型
      maskLogOp: ""
      maskLogAccountType: 3
      
   #预警邮箱设置
   mail:
    mailHost: 
    mailPort: 
    mailUser: 
    mailPwd: 
    mailFrom: 
    mailTo: 
    copyto: 
    sendFlag: 
    
 #异步事件缓存明文数据配置,分布式缓存
 jd:
  cache:
    jimdb:
      enable: false
      url: ''
  event:
    enable: true
    queue:
      # 自定义queue名字,例如monitorQueue
      maskMonitorQueue:
        retryCount: 3
        maxBakSize: 1000
        # monitorHandle 处理事件的beanName
        handlerBean: maskMonitorCacheHandle 



4.3 日志文件配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <contextName>demo</contextName>
    <!-- 日志最大的历史 单位:天 -->
    <property name="maxHistory" value="90"/>

    <property name="LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8:00} -%5p ${PID:- } --- [%X{PFTID}][%t] %-40.40logger{39}[%L] : %m%n"/>

    <property name="LOG_CHARSET" value="UTF-8"/>

    <property name="LOG_DES_PATTERN" value="%msg%n" />

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <property name="LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8:00} -%5p ${PID:- } --- [%X{PFTID}][%t] %-40.40logger{39}[%L] : %m%n"/>

    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%X{PFTID}][%15.15t]){faint} %clr(%-40.40logger{39}[%L]){cyan} %clr(:){faint} %m%n}"/>


    <appender name="mask" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/today_log/mask.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/history_logs/mask-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <charset>${LOG_CHARSET}</charset>
            <pattern>${LOG_DES_PATTERN}</pattern>
        </encoder>
    </appender>
    <logger name="com.jd.car.tony.log.DefaultMaskLogProcessor" additivity="false">
        <level value="INFO" />
        <appender-ref ref="mask" />
    </logger>

</configuration>



4.3 场景接入

 /**
     * 测试脱敏
     *
     * @return
     */
    @RequestMapping("test")
    @MaskMethod("order")
    public DemoResult test(AuthInfoBO authInfo) {
        return new DemoResult();
    }

    /**
     * 测试脱敏
     *
     * @return
     */
    @RequestMapping("test-list")
    @MaskMethod("order")
    public List<DemoResult> testList(AuthInfoBO authInfo) {
        List<DemoResult> objects = Lists.newArrayList();
        objects.add(new DemoResult());
        objects.add(new DemoResult());
        return objects;
    }

 		@Autowired
    private IUnMaskProcessor unMaskProcessorProxy;

    /**
     * 测试反脱敏
     *
     * @return
     */
    @RequestMapping("unmask")
    public Map testUnMask(@RequestBody UnMaskRequest unMaskRequest, AuthInfoBO authInfo) {
        return unMaskProcessorProxy.unMask(unMaskRequest, authInfo);
    }



4.3 脱敏字段配置

@Data
public class DemoResult {

    @Mask(type = "name")
    private String userName = "jajajaasjcij";

    @Mask(type = "phone")
    private String userTel = "18911112222";

    private Long orderId = 1L;

}



4.4 业务监控

业务监控点 触发逻辑
敏感数据明文查看 单账号、单日、单接口访问次数到达访问限额时,则发送邮件给权限管理人员。
敏感数据查询日志 敏感数据脱敏后、明文数据查看时,按集团要求格式单独记录到日志文件中。

作者:京东零售 邱新达

来源:京东云开发者社区

与一种配置化的数据脱敏与反脱敏框架实现相似的内容:

一种配置化的数据脱敏与反脱敏框架实现

在业务量日益剧增的背景下,大量数据在各种业务活动中产生,数据安全控制一直是治理的重要环节,数据脱敏属于安全控制的范畴。对互联网公司来说,数据安全一直是极为重视和敏感的话题

[转帖]Redis故障检查:识别慢查询操作

https://weibo.com/ttarticle/p/show?id=2309404650615585505652 使用SLOWLOG命令查看Redis中的慢查询操作。 ​​前几篇日志总结了下对Redis部署时的一些配置,Redis启动后,面对各种请求,数据持久化到硬盘,很可能会出现内存不足等

Low-Code,一定“low”吗?

低代码是一组数字技术工具平台,基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务。通过少量代码或不用代码实现数字化转型中的场景应用创新。本文将重点介绍低代码相关知识,包括低代码的定义与意义、相关概念、行业发展等,同时介绍京东的低代码工具,期望能帮助大家更好地认识与理解低代码。

Biwen.Settings添加对IConfiguration&IOptions的集成支持

Biwen.Settings 是一个简易的配置项管理模块,主要的作用就是可以校验并持久化配置项,比如将自己的配置存储到数据库中,JSON文件中等 使用上也是很简单,只需要在服务中注入配置, 比如我们有一个GithubSetting的配置项,我们只需要定义好对象然后注入到Service中即可: [De

[转帖]Redis数据库的备份与恢复

Redis备份 当程序有较多的任务在执行时,我们可以redis-cli模式下执行 bgsave,进入后台进行备份. Snapshot 当然我们可以直接运行save命令.会写入dump.rdb文件。 配置说明: save 900 1 #当900秒之后有一个key变化进行持久化保存 save 300 1

Chart.js (v2.9.4) 2-主要的函数和对象介绍

Color() :主要负责渲染图表时候,针对颜色处理相关函数 helpers_core:工具对象,提供了基础的工具函数功能,遍历数组,扩展对象,合并对象,克隆对象等等。 core_defaults:负责存储系统默认的全局属性或是插件,用户通过这个全局对象配置一些通用的属性或是插件,轻松让所有实例化出

35个Redis企业级性能优化点与解决方案

Redis作为企业级应用中广泛使用的高性能键值存储数据库,其性能优化是一个复杂且多面的话题。以下是V 哥整理的一些关键的优化点和相应的解决方案,提供给兄弟们参考。 Redis的性能优化涉及到硬件选择、配置调整、客户端优化、持久化策略等多个层面。 1. 硬件优化 解决方案:选择更快的CPU、更多的内存

深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略

首先,我们介绍了Elasticsearch(ES)的倒排索引,这是一种用于快速检索的数据结构。其次,我们了解了ES集群的架构,包括主节点、数据节点和协调节点的功能和作用。然后,我们探讨了中文分词器的选择,其中包括IK、HanLP和Jieba等常用的分词工具。接着,我们解释了写入数据和查询数据的工作原理,包括请求的分配和预处理,数据的存储和查询结果的处理过程。最后,我们讨论了ES部署的优化方法,包括调整JVM内存、分片布局和数量、节点身份设计以及配置Ingest节点等方面的策略。

Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。 所以,这篇博文将帮助您解决了在 Spring Boot

结合实例,解读华为云数字工厂信息模型配置器

摘要:结合一个实际的“生产执行管理”场景涉及的相关业务数据对象,系统介绍了华为云数字工厂平台的“信息模型”配置器的使用方法,实现对相关业务对象的数据建模。 本文分享自华为云社区《数字工厂深入浅出系列(二):信息模型配置器的使用方法介绍》,作者: 云起MAE 。 华为云数字工厂平台,采用业内先进的元数