高效能紀錄檔脫敏元件:已支援 log4j2 和 logback 外掛

2023-10-19 06:00:36

專案介紹

紀錄檔脫敏是常見的安全需求。普通的基於工具類方法的方式,對程式碼的入侵性太強,編寫起來又特別麻煩。

sensitive提供基於註解的方式,並且內建了常見的脫敏方式,便於開發。

同時支援 logback 和 log4j2 等常見的紀錄檔脫敏外掛。

拓展閱讀

金融使用者敏感資料如何優雅地實現脫敏?

紀錄檔脫敏之後,無法根據資訊快速定位怎麼辦?

log4j2 外掛統一脫敏

說明

上面的方法非常適用於新的專案,按照響應的規範進行推廣。

但是很多金融公司都有很多歷史遺留專案,或者使用不規範,比如使用 map 等,導致上面的方法在脫敏技改時需要耗費大量的時間,而且回溯成本很高。

有沒有什麼方法,可以直接在紀錄檔層統一處理呢?

log4j2 Rewrite

我們可以基於 log4j2 RewritePolicy 統一使用脫敏策略。

說明:如果使用 slf4j 介面,實現為 log4j2 時也是支援的。

使用入門

maven 引入

引入核心脫敏包。

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-log4j2</artifactId>
    <version>1.6.1</version>
</dependency>

其他的一般專案中也有,如 log4j2 包:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>

log4j2.xml 設定

例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages = "com.github.houbb.sensitive.log4j2.layout">

    <Properties>
        <Property name="DEFAULT_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
        <Property name="DEFAULT_CHARSET">UTF-8</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <SensitivePatternLayout/>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>

</Configuration>

幾個步驟:

  1. 指定 package 為 packages = "com.github.houbb.sensitive.log4j2.layout"

  2. 按照 log4j2 layout 規範,指定 Layout 策略為 SensitivePatternLayout

測試

正常的紀錄檔列印:

private static final String TEST_LOG = "mobile:13088887777; bankCard:6217004470007335024, email:[email protected], amount:123.00, " +
        "IdNo:340110199801016666, name1:李明, name2:李曉明, name3:李澤明天, name4:山東小栗旬" +
        ", birthday:20220517, GPS:120.882222, IPV4:127.0.0.1, address:中國上海市徐彙區888號;";

logger.info(TEST_LOG);

自動脫敏效果如下:

01:37:28.010 [main] INFO  com.github.houbb.sensitive.test.log4j2.Log4j2AndSlf4jLayoutTest - mobile:130****7777|9FC4D36D63D2B6DC5AE1297544FBC5A2; bankCard:6217***********5024|444F49289B30944AB8C6C856AEA21180, email:mahu*****@qq.com|897915594C94D981BA86C9E83ADD449C, amount:123.00, IdNo:340110199801016666, name1:李明, name2:李曉明, name3:李澤明天, name4:山東小栗旬, birthday:20220517, GPS:120.882222, IPV4:127.0.0.1, address:中國上海市徐******|821A601949B1BD18DCBAAE27F2E27147;

ps: 這裡是為了演示各種效果,實際預設對應為 1,2,3,4,9 這幾種策略。

log4j2 設定客製化化

為了滿足各種使用者的場景,在 V1.6.0 引入了 SensitivePatternLayout 策略的可設定化。

使用者可以在應用 resources 下通過 chars-scan-config.properties 組態檔指定。

預設設定

log4j2 設定中,SensitivePatternLayout 設定預設為:

chars.scan.prefix=::,,'"‘「=| +()()
chars.scan.scanList=1,2,3,4,9
chars.scan.replaceList=1,2,3,4,9
chars.scan.defaultReplace=12
chars.scan.replaceHash=md5
chars.scan.whiteList=""

屬性說明

SensitivePatternLayout 策略的屬性說明。

屬性 說明 預設值 備註
prefix 需要脫敏資訊的匹配字首 ::,,'"‘「= +()() 和英文豎線 降低誤判率
replaceHash 雜湊策略模式 md5 支援 md5/none 兩種模式
scanList 敏感掃描策略列表 1,2,3,4 1~10 內建的10種敏感資訊掃描策略,多個用逗號隔開
replaceList 敏感替換策略列表 1,2,3,4 1~10 內建的10種敏感資訊替換策略,多個用逗號隔開
defaultReplace 敏感替換預設策略 12 1~13 內建的13種敏感資訊替換策略,指定一個。當列表沒有匹配時,預設使用這個
whiteList 白名單 `` 希望跳過處理的白名單資訊

其中 1-13 的內建策略說明如下:

策略標識 說明
1 手機號
2 身份證
3 銀行卡
4 郵箱
5 中國人名
6 出生日期
7 GPS
8 IPV4
9 地址
10 護照
11 匹配任意不掩蓋
12 匹配任意半掩蓋
13 匹配任意全掩蓋

不足之處

這裡的策略自定義和 log4j2 的外掛化比起來,確實算不上強大,但是可以滿足 99% 的脫敏場景。

後續有時間考慮類似 log4j2 的 plugins 思想,實現更加靈活的自定義策略。

logback 脫敏外掛

說明

為了便於使用者使用,v1.6.0 開始支援 logback 外掛模式。

使用入門

maven 引入

引入 logback 依賴包

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>

指定 logback.xml 設定

<configuration>
    <!-- 基於 converter -->
    <conversionRule conversionWord="sensitive" converterClass="com.github.houbb.sensitive.logback.converter.SensitiveLogbackConverter" />
    <!-- 使用 converter -->
    <appender name="STDOUTConverter" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %sensitive%n</pattern>
        </encoder>
    </appender>

    <!-- 使用 layout -->
    <appender name="STDOUTLayout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="com.github.houbb.sensitive.logback.layout.SensitiveLogbackLayout">
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 設定根紀錄檔級別為DEBUG,並將紀錄檔輸出到控制檯 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUTConverter"/>
        <appender-ref ref="STDOUTLayout"/>
    </root>
</configuration>

這裡共計支援 Converter 和 Layout 兩種模式,任選一個即可。

建議使用 SensitiveLogbackConverter,脫敏紀錄檔內容。

紀錄檔效果

脫密效果和 log4j2 類似,如下:

01:42:32.579 [main] INFO  c.g.h.sensitive.test2.LogbackMain - mobile:130****7777|9FC4D36D63D2B6DC5AE1297544FBC5A2; bankCard:6217***********5024|444F49289B30944AB8C6C856AEA21180, email:mahu*****@qq.com|897915594C94D981BA86C9E83ADD449C, amount:123.00, " + "IdNo:340110199801016666, name1:李明, name2:李曉明, name3:李澤明天, name4:山東小栗旬" + ", birthday:20220517, GPS:120.882222, IPV4:127.0.0.1, address:中國上海市徐******|821A601949B1BD18DCBAAE27F2E27147;

設定屬性

同 log4j2,此處不再贅述。

小結

基於紀錄檔外掛的方式更加方便,便於專案的推廣使用,實用性更強。

專案的開源地址

https://github.com/houbb/sensitive