3 步完成 Spring Boot 的日誌脫敏

在我們寫代碼的時候,會書寫許多日誌代碼,但是有些敏感數據是需要進行安全脫敏處理的。

對於日誌脫敏的方式有很多,常見的有①使用conversionRule標籤,繼承MessageConverter②書寫一個脫敏工具類,在打印日誌的時候對特定特字段進行脫敏返回。

兩種方式各有優缺點:

自定義脫敏組件(slf4j+logback)

一個項目在書寫了很多打印日誌的代碼,但是後面有了脫敏需求,如果我們去手動改動代碼,會花費大量時間。如果引入本組件,完成配置即可輕鬆完成脫敏。(僅需三步可輕鬆配置)

一、自定義脫敏組件 - 脫敏效果演示

二、自定義脫敏組件 - 使用方式

1、引入 Jar 包依賴

前提是你將 Jar 包打入本地倉庫,Jar 包地址見後文。

<dependency>
    <groupId>pers.liuchengyin</groupId>
    <artifactId>logback-desensitization</artifactId>
    <version>1.0.0</version>
</dependency>

2、替換日誌文件配置類 (logback.xml)

日誌打印方式都只需要替換成脫敏的類即可,如果你的業務不需要,則無需替換。

①ConsoleAppender - 控制檯脫敏
// 原類
ch.qos.logback.core.ConsoleAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyConsoleAppender
②RollingFileAppender - 滾動文件
// 原類
ch.qos.logback.core.rolling.RollingFileAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyRollingFileAppender
③FileAppender - 文件
// 原類
ch.qos.logback.core.FileAppender
// 替換類
pers.liuchengyin.logbackadvice.LcyFileAppender

替換示例:

<property 
          value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>

<!-- ConsoleAppender 控制檯輸出日誌 -->
<appender >
    <encoder>
        <pattern>
            ${CONSOLE_LOG_PATTERN}
        </pattern>
    </encoder>
</appender>

3、添加脫敏配置文件 (logback-desensitize.yml)

該配置文件應該放在 resources 文件下

三、自定義脫敏組件 - 脫敏規範

1、支持數據類型

八大基本類型及其包裝類型、Map、List、業務裏的 Pojo 對象、List <業務裏的 Pojo 對象>、JSON 字符串。

注:在配置文件中配置的時候,只需要配置對象裏的屬性值就行。

2、不支持的數據類型

List <八大基本類型及包裝類型>,因爲不知道脫敏的數據源具體是哪一個。

3、匹配規則

key + 分割符 + value,目前僅支持冒號 (:) 和等號(=),示例如下:

log.info("your email:{}, your phone:{}""123456789@qq.com","15310763497");
log.info("your email={}, your cellphone={}""123456789@qq.com","15310763497");

4、日誌規範

建議書寫日誌的時候儘量規範,對於 key 爲中文的是沒有辦法脫敏的,規範程度可以見脫敏效果演示裏的代碼。

四、logback-desensitize.yml 配置說明

# 日誌脫敏
log-desensitize:
  # 是否忽略大小寫匹配,默認爲true
  ignore: true
  # 是否開啓脫敏,默認爲false
  open: true
  # pattern下的key/value爲固定脫敏規則
  pattern:
    # 郵箱 - @前第4-7位脫敏
    email: "@>(4,7)"
    # qq郵箱 - @後1-3位脫敏
    qqemail: "@<(1,3)"
    # 姓名 - 姓脫敏,如*杰倫
    name: 1,1
    # 密碼 - 所有需要完全脫敏的都可以使用內置的password
    password: password
  patterns:
    # 身份證號,key後面的字段都可以匹配以下規則(用逗號分隔)
    - key: identity,idcard
      # 定義規則的標識
      custom:
        # defaultRegex表示使用組件內置的規則:identity表示身份證號 - 內置的18/15位
        - defaultRegex: identity
          position: 9,13
        # 內置的other表示如果其他規則都無法匹配到,則按該規則處理
        - defaultRegex: other
          position: 9,10
    # 電話號碼,key後面的字段都可以匹配以下規則(用逗號分隔)
    - key: phone,cellphone,mobile
      custom:
        # 手機號 - 內置的11位手機匹配規則
        - defaultRegex: phone
          position: 4,7
        # 自定義正則匹配表達式:座機號(帶區號,號碼七位|八位)
        - customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
        # -後面的1-4位脫敏
          position: "-<(1,4)"
        # 自定義正則匹配表達式:座機號(不帶區號)
        - customRegex: "^[0-9]{7,8}"
          position: 3,5
        # 內置的other表示如果其他規則都無法匹配到,則按該規則處理
        - defaultRegex: other
          position: 1,3
    # 這種方式不太推薦 - 一旦匹配不上,就不會脫敏
    - key: localMobile
      custom:
          customRegex: "^0[0-9]{2,3}-[0-9]{7,8}"
          position: 1,3

上面這個配置是相對完整的,一定要嚴格遵守層級配置格式。

自定義脫敏支持的方式

1、key:value 的方式

2、以符號作爲起始、結束節點作爲脫敏標誌

emai:"@>(4,7)"@爲脫敏標誌,>表示其爲結束節點,<表示其爲開始節點。即@>表示對@之前的進行脫敏,@<表示對@之後的進行脫敏。這個示例就是@前的數據的第 4-7 位進行脫敏。

注意:這種規則裏的雙引號、括號不能省略,其次:=不能作爲標誌符號,因爲和匹配規則有衝突

3、自定義正則脫敏

patterns:
  # 手機號
  - key: phone,mobile
    custom:
      # 手機號的正則
      - customRegex: "^1[0-9]{10}"
        # 脫敏範圍
        position: 4,7

customRegex:正則表達式,如果符合該表達式,則使用其對應的脫敏規則 (position)

4、一個字段,根據多種值含義進行自定義脫敏

比如說,username 字段的值可以是手機號、也可以是郵箱,這個值動態改變的,前面幾種方式都沒辦法解決,可以使用該方式。

patterns:
  - key: username
    custom:
      # 手機號 - 11位
      - defaultRegex: phone
        position : 4,7
      # 郵箱 - @
   - defaultRegex: email
     position : "@>(3,12)"
   # 身份證 - 15/18位
   - defaultRegex: identity
     position : 1,3
   # 自定義正則
   - customRegex: "^1[0-9]{10}"
     position : 1,3
   # 都匹配不到時,按照這種規則來
   - defaultRegex: other
     position : 1,3

注意:上面示例中匹配規則裏的 雙引號和括號 都不能省略

該組件內置四種匹配規則:手機號、身份證號、郵箱、other(其他匹配不到時用的),內置一種脫敏方式:password,表示完全脫敏,可用於 pattren 下的。

注:當 pattern 和 patterns 下的 key 有重複的時候,只會使用 pattern 下指定的方式進行脫敏。

Jar 包地址和源碼地址

https://github.com/liuchengyin01/LogbackDesensitization/tree/master/repo/pers/liuchengyin/logback-desensitization/1.0.0

Github 地址:

https://github.com/liuchengyin01/LogbackDesensitization

Jar 包打入 Maven 本地倉庫的方式

1、下載 Jar 包,放在一個文件夾裏

2、在這個文件夾裏打開 cmd(打開 cmd,進入到這個文件夾)

3、執行命令 (前提保證 maven 配置正常,使用mvn -v命令查看是否正常,如果顯示版本號表示正常)

mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar

命令說明:

-DgroupId
 表示jar對應的groupId  
 <groupId>pers.liuchengyin</groupId>
-DartifactId:
 表示jar對應的artifactId
 <artifactId>logback-desensitization</artifactId>
-Dversion
 表示jar對應的 version
 <version>1.0.0</version>

作者:九月清晨柳成蔭

來源:https://blog.csdn.net/qq_40885085

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/gqbnEZGb-ZRlpbii1TlB8w