紀錄檔脫敏是常見的安全需求。普通的基於工具類方法的方式,對程式碼的入侵性太強,編寫起來又特別麻煩。
sensitive提供基於註解的方式,並且內建了常見的脫敏方式,便於開發。
同時支援 logback 和 log4j2 等常見的紀錄檔脫敏外掛。
上面的方法非常適用於新的專案,按照響應的規範進行推廣。
但是很多金融公司都有很多歷史遺留專案,或者使用不規範,比如使用 map 等,導致上面的方法在脫敏技改時需要耗費大量的時間,而且回溯成本很高。
有沒有什麼方法,可以直接在紀錄檔層統一處理呢?
我們可以基於 log4j2 RewritePolicy 統一使用脫敏策略。
說明:如果使用 slf4j 介面,實現為 log4j2 時也是支援的。
引入核心脫敏包。
<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>
例子如下:
<?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>
幾個步驟:
指定 package 為 packages = "com.github.houbb.sensitive.log4j2.layout"
按照 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 這幾種策略。
為了滿足各種使用者的場景,在 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 思想,實現更加靈活的自定義策略。
為了便於使用者使用,v1.6.0 開始支援 logback 外掛模式。
引入 logback 依賴包
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<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,此處不再贅述。
基於紀錄檔外掛的方式更加方便,便於專案的推廣使用,實用性更強。
專案的開源地址