1.tony结构布景

  • 在业务量日益剧增的布景下,大量数据在各种业务活动中发生,数据安全控制一直是办理的重要环节,数据脱敏归于安全控制的领域。对互联网公司来说,数据安全一直是极为注重和活络的论题。数据脱敏是指对某些活络信息通过脱敏规则进行数据的变形,完结活络隐私数据的可靠保护。触及客户安全数据或许一些商业性活络数据,如身份证号、手机号、卡号、客户号等个人信息依照相关部门规定,都需求进行数据脱敏。

  • 在现有的微服务技能架构布景下,活络数据的运用存在如下痛点:

    • 活络数据与PC、APP客户端运用明文数据交互,数据安全无法确保。
    • 活络数据阅览短少监控,无法针对性的做数据办理。
    • 微服务架构系统运用多而杂,希望引入一套通用的方案共同处理活络数据安全问题。

根据以上痛点,tony供应了一套无缺、安全、透明化、低改造本钱的数据脱敏整合处理方案。

2.tony结构简介

Tony是一款活络数据脱敏与阅览记载监控东西,可对系统中的活络信息进行脱敏处理,并在泄露时供应追溯根据,为企业数据同享、迁移、分发供应安全保护措施。该项目根据spring进行开发,供应spring-boot-starter发动包,接入简单,首要完结功用如下:

活络的脱敏方案

业务系统的数据千变万化,为确保一切业务数据都可以正常进行活络信息处理,数据脱敏供应高活络性的自定义脱敏配备。通过丰盛多样的脱敏规则定义,活络数据处理可完结高度契合业务的脱敏处理。

共同的明文数据办理

结构内置活络数据对应的明文数据办理流程,将明文数据共同缓存办理,供应共同的明文数据访问api。

阅览记载留痕

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

失常阅览量预警

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

tony整体架构:

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

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

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

tony处理流程详解:

tony和业务代码部署在一起,接入运用通过脱敏场景与脱敏配备项的指定来完结对应业务场景的脱敏署理。业务代码只需配备场景注解即可兼容运用。此刻活络数据的脱敏作业由tony担任,tony会阻拦业务场景的响应数据,对活络信息进行脱敏处理。

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

tony脱敏配备详解:

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

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

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∗∗∗∗1****2
tony.types.YYY.logName 日志字段称谓

3. 系统详细规划

3.1 详细规划

3.1.1 活动图

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

3.1.2 时序图

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

3.1.3 类图

一种配备化的数据脱敏与反脱敏结构完成 | 京东云技能团队

职责
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 业务监控

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

作者:京东零售 邱新达

来历:京东云开发者社区