作者:潘娟
作者簡(jiǎn)介
潘娟奇昙,京東數(shù)科高級(jí)DBA护侮,主要負(fù)責(zé)京東數(shù)科數(shù)據(jù)庫(kù)中間件開(kāi)發(fā)、數(shù)據(jù)庫(kù)運(yùn)維自動(dòng)化平臺(tái)開(kāi)發(fā)储耐、生產(chǎn)數(shù)據(jù)庫(kù)運(yùn)維工作羊初。多次參與京東6.18、11.11等大促活動(dòng)的護(hù)航工作什湘。曾負(fù)責(zé)京東數(shù)科數(shù)據(jù)庫(kù)自動(dòng)化平臺(tái)設(shè)計(jì)與開(kāi)發(fā)項(xiàng)目长赞,現(xiàn)專(zhuān)注于A(yíng)pache ShardingSphere分布式數(shù)據(jù)庫(kù)中間件開(kāi)發(fā)。樂(lè)于在數(shù)據(jù)庫(kù)闽撤、自動(dòng)化得哆、分布式、中間件等相關(guān)領(lǐng)域進(jìn)行學(xué)習(xí)和探索哟旗。
一贩据、背景
安全控制一直是治理的重要環(huán)節(jié),數(shù)據(jù)脫敏屬于安全控制的范疇闸餐。對(duì)互聯(lián)網(wǎng)公司饱亮、傳統(tǒng)行業(yè)來(lái)說(shuō),數(shù)據(jù)安全一直是極為重視和敏感的話(huà)題绎巨。數(shù)據(jù)脫敏是指對(duì)某些敏感信息通過(guò)脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形近尚,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù)。涉及客戶(hù)安全數(shù)據(jù)或者一些商業(yè)性敏感數(shù)據(jù)场勤,如身份證號(hào)戈锻、手機(jī)號(hào)、卡號(hào)和媳、客戶(hù)號(hào)等個(gè)人信息按照相關(guān)部門(mén)規(guī)定格遭,都需要進(jìn)行數(shù)據(jù)脫敏。
在真實(shí)業(yè)務(wù)場(chǎng)景中留瞳,相關(guān)業(yè)務(wù)開(kāi)發(fā)團(tuán)隊(duì)則往往需要針對(duì)公司安全部門(mén)需求拒迅,自行實(shí)行并維護(hù)一套加解密系統(tǒng),而當(dāng)脫敏場(chǎng)景發(fā)生改變時(shí),自行維護(hù)的脫敏系統(tǒng)往往又面臨著重構(gòu)或修改風(fēng)險(xiǎn)璧微。此外作箍,對(duì)于已經(jīng)上線(xiàn)的業(yè)務(wù),如何在不修改業(yè)務(wù)邏輯前硫、業(yè)務(wù)SQL的情況下胞得,透明化、安全低風(fēng)險(xiǎn)地實(shí)現(xiàn)無(wú)縫進(jìn)行脫敏改造呢屹电?
Apache ShardingSphere根據(jù)業(yè)界對(duì)脫敏的需求及業(yè)務(wù)改造痛點(diǎn)阶剑,提供了一套完整、安全危号、透明化牧愁、低改造成本的數(shù)據(jù)脫敏整合解決方案。
二外莲、前序
Apache ShardingSphere是一套開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件解決方案組成的生態(tài)圈猪半,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(規(guī)劃中)這3款相互獨(dú)立苍狰,卻又能夠混合部署配合使用的產(chǎn)品組成办龄。它們均能夠提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片淋昭、分布式事務(wù)和分布式治理功能,可適用于如Java同構(gòu)安接、異構(gòu)語(yǔ)言翔忽、容器、云原生等各種多樣化的應(yīng)用場(chǎng)景盏檐。
數(shù)據(jù)脫敏模塊屬于ShardingSphere分布式治理這一核心功能下的子功能模塊歇式。它通過(guò)對(duì)用戶(hù)輸入的SQL進(jìn)行解析,并依據(jù)用戶(hù)提供的脫敏配置對(duì)SQL進(jìn)行改寫(xiě)胡野,從而實(shí)現(xiàn)對(duì)原文數(shù)據(jù)進(jìn)行加密材失,并將原文數(shù)據(jù)(可選)及密文數(shù)據(jù)同時(shí)存儲(chǔ)到底層數(shù)據(jù)庫(kù)。在用戶(hù)查詢(xún)數(shù)據(jù)時(shí)硫豆,它又從數(shù)據(jù)庫(kù)中取出密文數(shù)據(jù)龙巨,并對(duì)其解密,最終將解密后的原始數(shù)據(jù)返回給用戶(hù)熊响。Apache ShardingSphere分布式數(shù)據(jù)庫(kù)中間件自動(dòng)化&透明化了數(shù)據(jù)脫敏過(guò)程旨别,讓用戶(hù)無(wú)需關(guān)注數(shù)據(jù)脫敏的實(shí)現(xiàn)細(xì)節(jié),像使用普通數(shù)據(jù)那樣使用脫敏數(shù)據(jù)汗茄。此外秸弛,無(wú)論是已在線(xiàn)業(yè)務(wù)進(jìn)行脫敏改造,還是新上線(xiàn)業(yè)務(wù)使用脫敏功能,ShardingSphere都可以提供一套相對(duì)完善的解決方案递览。
三叼屠、需求場(chǎng)景分析
對(duì)于數(shù)據(jù)脫敏的需求,在現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中一般分為兩種情況:
1. 新業(yè)務(wù)上線(xiàn)绞铃,安全部門(mén)規(guī)定需將涉及用戶(hù)敏感信息环鲤,例如銀行、手機(jī)號(hào)碼等進(jìn)行加密后存儲(chǔ)到數(shù)據(jù)庫(kù)憎兽,在使用的時(shí)候再進(jìn)行解密處理冷离。因?yàn)槭侨孪到y(tǒng),因而沒(méi)有存量數(shù)據(jù)清洗問(wèn)題纯命,所以實(shí)現(xiàn)相對(duì)簡(jiǎn)單西剥。
2. 已上線(xiàn)業(yè)務(wù),之前一直將明文存儲(chǔ)在數(shù)據(jù)庫(kù)中亿汞。相關(guān)部門(mén)突然需要對(duì)已上線(xiàn)業(yè)務(wù)進(jìn)行脫敏整改瞭空。這種場(chǎng)景一般需要處理三個(gè)問(wèn)題:
a) 歷史數(shù)據(jù)需要如何進(jìn)行脫敏處理,即洗數(shù)疗我。
b) 如何能在不改動(dòng)業(yè)務(wù)SQL和邏輯情況下咆畏,將新增數(shù)據(jù)進(jìn)行脫敏處理,并存儲(chǔ)到數(shù)據(jù)庫(kù)吴裤;在使用時(shí)旧找,再進(jìn)行解密取出。
c) 如何較為安全麦牺、無(wú)縫钮蛛、透明化地實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)在明文與密文數(shù)據(jù)間的遷移。
四剖膳、處理流程詳解
整體架構(gòu)
ShardingSphere提供的Encrypt-JDBC和業(yè)務(wù)代碼部署在一起魏颓。業(yè)務(wù)方需面向Encrypt-JDBC進(jìn)行JDBC編程。由于Encrypt-JDBC實(shí)現(xiàn)所有JDBC標(biāo)準(zhǔn)接口吱晒,業(yè)務(wù)代碼無(wú)需做額外改造即可兼容使用甸饱。此時(shí),業(yè)務(wù)代碼所有與數(shù)據(jù)庫(kù)的交互行為交由Encrypt-JDBC負(fù)責(zé)仑濒。業(yè)務(wù)只需提供脫敏規(guī)則即可叹话。作為業(yè)務(wù)代碼與底層數(shù)據(jù)庫(kù)中間的橋梁,Encrypt-JDBC便可攔截用戶(hù)行為躏精,并在改造行為后與數(shù)據(jù)庫(kù)交互渣刷。
Encrypt-JDBC將用戶(hù)發(fā)起的SQL進(jìn)行攔截,并通過(guò)SQL語(yǔ)法解析器進(jìn)行解析矗烛、理解SQL行為辅柴,再依據(jù)用戶(hù)傳入的脫敏規(guī)則箩溃,找出需要脫敏的字段和所使用的加解密器對(duì)目標(biāo)字段進(jìn)行加解密處理后,再與底層數(shù)據(jù)庫(kù)進(jìn)行交互碌嘀。ShardingSphere會(huì)將用戶(hù)請(qǐng)求的明文進(jìn)行加密后存儲(chǔ)到底層數(shù)據(jù)庫(kù)涣旨;并在用戶(hù)查詢(xún)時(shí),將密文從數(shù)據(jù)庫(kù)中取出進(jìn)行解密后返回給終端用戶(hù)股冗。ShardingSphere通過(guò)屏蔽對(duì)數(shù)據(jù)的脫敏處理霹陡,使用戶(hù)無(wú)需感知解析SQL、數(shù)據(jù)加密止状、數(shù)據(jù)解密的處理過(guò)程烹棉,就像在使用普通數(shù)據(jù)一樣使用脫敏數(shù)據(jù)。
脫敏規(guī)則
在詳解整套流程之前怯疤,我們需要先了解下脫敏規(guī)則與配置浆洗,這是認(rèn)識(shí)整套流程的基礎(chǔ)。脫敏配置主要分為四部分:數(shù)據(jù)源配置集峦,加密器配置伏社,脫敏表配置以及查詢(xún)屬性配置,其詳情如下圖所示:
數(shù)據(jù)源配置:是指DataSource的配置塔淤。
加密器配置:是指使用什么加密策略進(jìn)行加解密摘昌。目前ShardingSphere內(nèi)置了兩種加解密策略:AES/MD5。用戶(hù)還可以通過(guò)實(shí)現(xiàn)ShardingSphere提供的接口高蜂,自行實(shí)現(xiàn)一套加解密算法聪黎。
脫敏表配置:用于告訴ShardingSphere數(shù)據(jù)表里哪個(gè)列用于存儲(chǔ)密文數(shù)據(jù)(cipherColumn)、哪個(gè)列用于存儲(chǔ)明文數(shù)據(jù)(plainColumn)以及用戶(hù)想使用哪個(gè)列進(jìn)行SQL編寫(xiě)(logicColumn)妨马。
如何理解
用戶(hù)想使用哪個(gè)列進(jìn)行SQL編寫(xiě)(logicColumn)
挺举?
我們可以從Encrypt-JDBC存在的意義來(lái)理解。Encrypt-JDBC最終目的是希望屏蔽底層對(duì)數(shù)據(jù)的脫敏處理烘跺,也就是說(shuō)我們不希望用戶(hù)知道數(shù)據(jù)是如何被加解密的、如何將明文數(shù)據(jù)存儲(chǔ)到plainColumn脂崔,將密文數(shù)據(jù)存儲(chǔ)到cipherColumn滤淳。換句話(huà)說(shuō),我們不希望用戶(hù)知道plainColumn和cipherColumn的存在和使用砌左。所以脖咐,我們需要給用戶(hù)提供一個(gè)概念意義上的列,這個(gè)列可以脫離底層數(shù)據(jù)庫(kù)的真實(shí)列汇歹,它可以是數(shù)據(jù)庫(kù)表里的一個(gè)真實(shí)列屁擅,也可以不是,從而使得用戶(hù)可以隨意改變底層數(shù)據(jù)庫(kù)的plainColumn和cipherColumn的列名产弹∨筛瑁或者刪除plainColumn,選擇永遠(yuǎn)不再存儲(chǔ)明文,只存儲(chǔ)密文胶果。只要用戶(hù)的SQL面向這個(gè)邏輯列進(jìn)行編寫(xiě)匾嘱,并在脫敏規(guī)則里給出logicColumn和plainColumn、cipherColumn之間正確的映射關(guān)系即可早抠。
為什么要這么做呢霎烙?答案在文章后面,即為了讓已上線(xiàn)的業(yè)務(wù)能無(wú)縫蕊连、透明悬垃、安全地進(jìn)行數(shù)據(jù)脫敏遷移。
查詢(xún)屬性的配置:當(dāng)?shù)讓訑?shù)據(jù)庫(kù)表里同時(shí)存儲(chǔ)了明文數(shù)據(jù)甘苍、密文數(shù)據(jù)后尝蠕,該屬性開(kāi)關(guān)用于決定是直接查詢(xún)數(shù)據(jù)庫(kù)表里的明文數(shù)據(jù)進(jìn)行返回,還是查詢(xún)密文數(shù)據(jù)通過(guò)Encrypt-JDBC解密后返回羊赵。
脫敏處理過(guò)程
舉個(gè)栗子趟佃,假如數(shù)據(jù)庫(kù)里有一張表叫做t_user,這張表里實(shí)際有兩個(gè)字段pwd_plain昧捷,用于存放明文數(shù)據(jù)闲昭、pwd_cipher,用于存放密文數(shù)據(jù)靡挥,同時(shí)定義logicColumn為pwd序矩。那么,用戶(hù)在編寫(xiě)SQL時(shí)應(yīng)該面向logicColumn進(jìn)行編寫(xiě)跋破,即INSERT INTO t_user SET pwd = '123'簸淀。ShardingSphere接收到該SQL,通過(guò)用戶(hù)提供的脫敏配置毒返,發(fā)現(xiàn)pwd是logicColumn租幕,于是便對(duì)邏輯列及其對(duì)應(yīng)的明文數(shù)據(jù)進(jìn)行脫敏處理∨◆ぃ可以看出ShardingSphere將面向用戶(hù)的邏輯列與面向底層數(shù)據(jù)庫(kù)的明文列和密文列進(jìn)行了列名以及數(shù)據(jù)的脫敏映射轉(zhuǎn)換劲绪。如下圖所示:
這也正是Encrypt-JDBC核心意義所在,即依據(jù)用戶(hù)提供的脫敏規(guī)則盆赤,將用戶(hù)SQL與底層數(shù)據(jù)表結(jié)構(gòu)割裂開(kāi)來(lái)贾富,使得用戶(hù)的SQL編寫(xiě)不再依賴(lài)于真實(shí)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。而用戶(hù)與底層數(shù)據(jù)庫(kù)之間的銜接牺六、映射颤枪、轉(zhuǎn)換交由ShardingSphere進(jìn)行處理。為什么我們要這么做淑际?還是那句話(huà):為了讓已上線(xiàn)的業(yè)務(wù)能無(wú)縫畏纲、透明扇住、安全地進(jìn)行數(shù)據(jù)脫敏遷移。
為了讓讀者更清晰了解到Encrypt-JDBC的核心處理流程霍骄,下方圖片展示了使用Encrypt-JDBC進(jìn)行增刪改查時(shí)案狠,其中的處理流程和轉(zhuǎn)換邏輯梭伐,如下圖所示勃蜘。
五罐氨、解決方案詳解
在了解了ShardingSphere脫敏處理流程后,即可將脫敏配置米间、脫敏處理流程與實(shí)際場(chǎng)景進(jìn)行結(jié)合强品。所有的設(shè)計(jì)開(kāi)發(fā)都是為了解決業(yè)務(wù)場(chǎng)景遇到的痛點(diǎn)。那么面對(duì)之前提到的業(yè)務(wù)場(chǎng)景需求屈糊,又應(yīng)該如何使用ShardingSphere這把利器來(lái)滿(mǎn)足業(yè)務(wù)需求呢的榛?
新上線(xiàn)業(yè)務(wù)
業(yè)務(wù)場(chǎng)景分析:新上線(xiàn)業(yè)務(wù)由于一切從零開(kāi)始,不存在歷史數(shù)據(jù)清洗問(wèn)題逻锐,所以相對(duì)簡(jiǎn)單夫晌。
解決方案說(shuō)明:選擇合適的加密器,如AES后昧诱,只需配置邏輯列(面向用戶(hù)編寫(xiě)SQL)和密文列(數(shù)據(jù)表存密文數(shù)據(jù))即可晓淀,邏輯列和密文列可以相同也可以不同。建議配置如下(Yaml格式展示):
encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd:
cipherColumn: pwd
encryptor: aes_encryptor
使用這套配置盏档,Encrypt-JDBC只需將logicColumn和cipherColumn進(jìn)行轉(zhuǎn)換凶掰,底層數(shù)據(jù)表不存儲(chǔ)明文,只存儲(chǔ)了密文蜈亩,這也是安全審計(jì)部分的要求所在懦窘。如果用戶(hù)希望將明文、密文一同存儲(chǔ)到數(shù)據(jù)庫(kù)稚配,只需添加plainColumn配置即可畅涂。整體處理流程如下圖所示:
已上線(xiàn)業(yè)務(wù)改造
業(yè)務(wù)場(chǎng)景分析:由于業(yè)務(wù)已經(jīng)在線(xiàn)上運(yùn)行,數(shù)據(jù)庫(kù)里必然存有大量明文歷史數(shù)據(jù)〉来ǎ現(xiàn)在的問(wèn)題是如何讓歷史數(shù)據(jù)得以加密清洗毅戈、如何讓增量數(shù)據(jù)得以加密處理、如何讓業(yè)務(wù)在新舊兩套數(shù)據(jù)系統(tǒng)之間進(jìn)行無(wú)縫愤惰、透明化遷移。
解決方案說(shuō)明:在提供解決方案之前赘理,我們先來(lái)頭腦風(fēng)暴一下:首先宦言,既然是舊業(yè)務(wù)需要進(jìn)行脫敏改造,那一定存儲(chǔ)了非常重要且敏感的信息商模。這些信息含金量高且業(yè)務(wù)相對(duì)基礎(chǔ)重要奠旺。如果搞錯(cuò)了蜘澜,整個(gè)團(tuán)隊(duì)KPI就再見(jiàn)了。所以不可能一上來(lái)就停業(yè)務(wù)响疚,禁止新數(shù)據(jù)寫(xiě)入鄙信,再找個(gè)加密器把歷史數(shù)據(jù)全部加密清洗,再把之前重構(gòu)的代碼部署上線(xiàn)忿晕,使其能把存量和增量數(shù)據(jù)進(jìn)行在線(xiàn)加密解密装诡。如此簡(jiǎn)單粗暴的方式,按照歷史經(jīng)驗(yàn)來(lái)談践盼,一定涼涼鸦采。
那么另一種相對(duì)安全的做法是:重新搭建一套和生產(chǎn)環(huán)境一模一樣的預(yù)發(fā)環(huán)境,然后通過(guò)相關(guān)遷移洗數(shù)工具把生產(chǎn)環(huán)境的存量原文數(shù)據(jù)加密后存儲(chǔ)到預(yù)發(fā)環(huán)境咕幻,而新增數(shù)據(jù)則通過(guò)例如MySQL主從復(fù)制及業(yè)務(wù)方自行開(kāi)發(fā)的工具加密后存儲(chǔ)到預(yù)發(fā)環(huán)境的數(shù)據(jù)庫(kù)里渔伯,再把重構(gòu)后可以進(jìn)行加解密的代碼部署到預(yù)發(fā)環(huán)境。這樣生產(chǎn)環(huán)境是一套以明文為核心的查詢(xún)修改的環(huán)境肄程;預(yù)發(fā)環(huán)境是一套以密文為核心加解密查詢(xún)修改的環(huán)境锣吼。在對(duì)比一段時(shí)間無(wú)誤后,可以夜間操作將生產(chǎn)流量切到預(yù)發(fā)環(huán)境中蓝厌。此方案相對(duì)安全可靠玄叠,只是時(shí)間、人力褂始、資金诸典、成本較高,主要包括:預(yù)發(fā)環(huán)境搭建崎苗、生產(chǎn)代碼整改狐粱、相關(guān)輔助工具開(kāi)發(fā)等。除非無(wú)路可走胆数,否則業(yè)務(wù)開(kāi)發(fā)人員一般是從入門(mén)到放棄肌蜻。
業(yè)務(wù)開(kāi)發(fā)人員最希望的做法是:減少資金費(fèi)用的承擔(dān)、最好不要修改業(yè)務(wù)代碼必尼、能夠安全平滑遷移系統(tǒng)蒋搜。于是,ShardingSphere的脫敏功能模塊便應(yīng)用而生判莉《雇欤可分為三步進(jìn)行:
1. 系統(tǒng)遷移前
假設(shè)系統(tǒng)需要對(duì)t_user的pwd字段進(jìn)行脫敏處理,業(yè)務(wù)方使用Encrypt-JDBC來(lái)代替標(biāo)準(zhǔn)化的JDBC接口券盅,此舉基本不需要額外改造(我們還提供了SpringBoot帮哈,SpringNameSpace,Yaml等接入方式锰镀,滿(mǎn)足不同業(yè)務(wù)方需求)娘侍。另外咖刃,提供一套脫敏配置規(guī)則,如下所示:
encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd:
plainColumn: pwd
cipherColumn: pwd_cipher
encryptor: aes_encryptor
props:
query.with.cipher.column: false
依據(jù)上述脫敏規(guī)則可知憾筏,首先需要在數(shù)據(jù)庫(kù)表t_user里新增一個(gè)字段叫做pwd_cipher嚎杨,即cipherColumn,用于存放密文數(shù)據(jù)氧腰,同時(shí)我們把plainColumn設(shè)置為pwd枫浙,用于存放明文數(shù)據(jù),而把logicColumn也設(shè)置為pwd容贝。由于之前的代碼SQL就是使用pwd進(jìn)行編寫(xiě)自脯,即面向邏輯列進(jìn)行SQL編寫(xiě),所以業(yè)務(wù)代碼無(wú)需改動(dòng)斤富。通過(guò)Encrypt-JDBC膏潮,針對(duì)新增的數(shù)據(jù),會(huì)把明文寫(xiě)到pwd列满力,并同時(shí)把明文進(jìn)行加密存儲(chǔ)到pwd_cipher列焕参。此時(shí),由于query.with.cipher.column設(shè)置為false油额,對(duì)業(yè)務(wù)應(yīng)用來(lái)說(shuō)叠纷,依舊使用pwd這一明文列進(jìn)行查詢(xún)存儲(chǔ),卻在底層數(shù)據(jù)庫(kù)表pwd_cipher上額外存儲(chǔ)了新增數(shù)據(jù)的密文數(shù)據(jù)潦嘶,其處理流程如下圖所示:
新增數(shù)據(jù)在插入時(shí)涩嚣,就通過(guò)Encrypt-JDBC加密為密文數(shù)據(jù),并被存儲(chǔ)到了cipherColumn掂僵。而現(xiàn)在就需要處理歷史明文存量數(shù)據(jù)航厚。由于A(yíng)pache ShardingSphere目前并未提供相關(guān)遷移洗數(shù)工具,此時(shí)需要業(yè)務(wù)方自行將pwd中的明文數(shù)據(jù)進(jìn)行加密處理存儲(chǔ)到pwd_cipher锰蓬。
2. 系統(tǒng)遷移中
新增的數(shù)據(jù)已被Encrypt-JDBC將密文存儲(chǔ)到密文列幔睬,明文存儲(chǔ)到明文列;歷史數(shù)據(jù)被業(yè)務(wù)方自行加密清洗后芹扭,將密文也存儲(chǔ)到密文列麻顶。也就是說(shuō)現(xiàn)在的數(shù)據(jù)庫(kù)里即存放著明文也存放著密文,只是由于配置項(xiàng)中的query.with.cipher.column=false舱卡,所以密文一直沒(méi)有被使用過(guò)「ㄉ觯現(xiàn)在我們?yōu)榱俗屜到y(tǒng)能切到密文數(shù)據(jù)進(jìn)行查詢(xún),需要將脫敏配置中的query.with.cipher.column設(shè)置為true轮锥。在重啟系統(tǒng)后宛瞄,我們發(fā)現(xiàn)系統(tǒng)業(yè)務(wù)一切正常,但是Encrypt-JDBC已經(jīng)開(kāi)始從數(shù)據(jù)庫(kù)里取出密文列的數(shù)據(jù),解密后返回給用戶(hù)份汗;而對(duì)于用戶(hù)的增刪改需求,則依舊會(huì)把原文數(shù)據(jù)存儲(chǔ)到明文列蝴簇,加密后密文數(shù)據(jù)存儲(chǔ)到密文列杯活。
雖然現(xiàn)在業(yè)務(wù)系統(tǒng)通過(guò)將密文列的數(shù)據(jù)取出,解密后返回熬词;但是旁钧,在存儲(chǔ)的時(shí)候仍舊會(huì)存一份原文數(shù)據(jù)到明文列,這是為什么呢互拾?答案是:為了能夠進(jìn)行系統(tǒng)回滾歪今。因?yàn)橹灰芪暮兔魑挠肋h(yuǎn)同時(shí)存在,我們就可以通過(guò)開(kāi)關(guān)項(xiàng)配置自由將業(yè)務(wù)查詢(xún)切換到cipherColumn或plainColumn颜矿。也就是說(shuō)寄猩,如果將系統(tǒng)切到密文列進(jìn)行查詢(xún)時(shí),發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò)骑疆,需要回滾田篇。那么只需將query.with.cipher.column=false,Encrypt-JDBC將會(huì)還原箍铭,即又重新開(kāi)始使用plainColumn進(jìn)行查詢(xún)泊柬。處理流程如下圖所示:
3. 系統(tǒng)遷移后
由于安全審計(jì)部門(mén)要求,業(yè)務(wù)系統(tǒng)一般不可能讓數(shù)據(jù)庫(kù)的明文列和密文列永久同步保留诈火,我們需要在系統(tǒng)穩(wěn)定后將明文列數(shù)據(jù)刪除兽赁。即我們需要在系統(tǒng)遷移后將plainColumn,即pwd進(jìn)行刪除冷守。那問(wèn)題來(lái)了刀崖,現(xiàn)在業(yè)務(wù)代碼都是面向pwd進(jìn)行編寫(xiě)SQL的,把底層數(shù)據(jù)表中的存放明文的pwd刪除了教沾,換用pwd_cipher進(jìn)行解密得到原文數(shù)據(jù)蒲跨,那豈不是意味著業(yè)務(wù)方需要整改所有SQL,從而不使用即將要被刪除的pwd列授翻?還記得我們Encrypt-JDBC的核心意義所在嗎或悲?
這也正是Encrypt-JDBC核心意義所在,即依據(jù)用戶(hù)提供的脫敏規(guī)則堪唐,將用戶(hù)SQL與底層數(shù)據(jù)庫(kù)表結(jié)構(gòu)割裂開(kāi)來(lái)巡语,使得用戶(hù)的SQL編寫(xiě)不再依賴(lài)于真實(shí)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。而用戶(hù)與底層數(shù)據(jù)庫(kù)之間的銜接淮菠、映射男公、轉(zhuǎn)換交由ShardingSphere進(jìn)行處理。
是的合陵,因?yàn)橛衛(wèi)ogicColumn存在枢赔,用戶(hù)的編寫(xiě)SQL都面向這個(gè)虛擬列澄阳,Encrypt-JDBC就可以把這個(gè)邏輯列和底層數(shù)據(jù)表中的密文列進(jìn)行映射轉(zhuǎn)換。于是遷移后的脫敏配置即為:
encryptRule:
encryptors:
aes_encryptor:
type: aes
props:
aes.key.value: 123456abc
tables:
t_user:
columns:
pwd: # pwd與pwd_cipher的轉(zhuǎn)換映射
cipherColumn: pwd_cipher
encryptor: aes_encryptor
props:
query.with.cipher.column: true
其處理流程如下:
至此踏拜,已在線(xiàn)業(yè)務(wù)脫敏整改解決方案全部敘述完畢碎赢。我們提供了Java、Yaml速梗、SpringBoot肮塞、SpringNameSpace多種方式供用戶(hù)選擇接入,力求滿(mǎn)足業(yè)務(wù)不同的接入需求姻锁。該解決方案目前已在京東數(shù)科不斷落地上線(xiàn)枕赵,提供對(duì)內(nèi)基礎(chǔ)服務(wù)支撐。
六位隶、中間件脫敏服務(wù)優(yōu)勢(shì)
1. 自動(dòng)化&透明化數(shù)據(jù)脫敏過(guò)程拷窜,用戶(hù)無(wú)需關(guān)注脫敏中間實(shí)現(xiàn)細(xì)節(jié)。
2. 提供多種內(nèi)置钓试、第三方(AKS)的脫敏策略装黑,用戶(hù)僅需簡(jiǎn)單配置即可使用。
3. 提供脫敏策略API接口弓熏,用戶(hù)可實(shí)現(xiàn)接口恋谭,從而使用自定義脫敏策略進(jìn)行數(shù)據(jù)脫敏。
4. 支持切換不同的脫敏策略挽鞠。
5. 針對(duì)已上線(xiàn)業(yè)務(wù)疚颊,可實(shí)現(xiàn)明文數(shù)據(jù)與密文數(shù)據(jù)同步存儲(chǔ),并通過(guò)配置決定使用明文列還是密文列進(jìn)行查詢(xún)信认〔囊澹可實(shí)現(xiàn)在不改變業(yè)務(wù)查詢(xún)SQL前提下,已上線(xiàn)系統(tǒng)對(duì)加密前后數(shù)據(jù)進(jìn)行安全嫁赏、透明化遷移其掂。
七、適用場(chǎng)景說(shuō)明
1. 用戶(hù)項(xiàng)目使用Java語(yǔ)言進(jìn)行編程潦蝇。
2. 后端數(shù)據(jù)庫(kù)為MySQL款熬、Oracle、PostgreSQL攘乒、SQLServer贤牛。
3. 用戶(hù)需要對(duì)數(shù)據(jù)庫(kù)表中某個(gè)或多個(gè)列進(jìn)行脫敏(數(shù)據(jù)加密&解密)。
4. 兼容所有常用SQL则酝;
八殉簸、限制條件
1. 用戶(hù)需要自行處理數(shù)據(jù)庫(kù)中原始的存量數(shù)據(jù)、洗數(shù)。
- 使用脫敏功能+分庫(kù)分表功能般卑,部分特殊SQL不支持武鲁,請(qǐng)參考SQL使用規(guī)范。
3. 脫敏字段無(wú)法支持比較操作椭微,如:大于小于洞坑、ORDER BY、BETWEEN蝇率、LIKE等
4. 脫敏字段無(wú)法支持計(jì)算操作,如:AVG刽沾、SUM以及計(jì)算表達(dá)式
九本慕、后續(xù)
本篇文章介紹了如何使用ShardingSphere產(chǎn)品之一的Encrypt-JDBC進(jìn)行接入,接入形式還可以選擇使用SpringBoot侧漓、SpringNameSpace等锅尘,這種形態(tài)的接入端主要面向JAVA同構(gòu),并與業(yè)務(wù)代碼共同部署在生產(chǎn)環(huán)境中布蔗。面向異構(gòu)語(yǔ)言藤违,ShardingSphere還提供Encrypt-Proxy客戶(hù)端。Encrypt-Proxy是一款實(shí)現(xiàn)MySQL纵揍、PostgreSQL的二進(jìn)制協(xié)議的服務(wù)器端產(chǎn)品顿乒,用戶(hù)可獨(dú)立部署Encrypt-Proxy服務(wù),并且像使用普通MySQL泽谨、PostgreSQL數(shù)據(jù)庫(kù)一樣璧榄,使用例如Navicat第三方數(shù)據(jù)庫(kù)管理工具、JAVA連接池吧雹、命令行的方式訪(fǎng)問(wèn)這臺(tái)具有脫敏功能的虛擬數(shù)據(jù)庫(kù)服務(wù)器
骨杂。
脫敏功能屬于A(yíng)pache ShardingSphere分布式治理的功能范疇。事實(shí)上雄卷,Apache ShardingSphere這個(gè)生態(tài)還擁有其他更強(qiáng)大的能力搓蚪,例如數(shù)據(jù)分片、讀寫(xiě)分離丁鹉、分布式事務(wù)妒潭、監(jiān)控治理等。您甚至可以選擇任意多種功能模塊進(jìn)行疊加使用鳄炉,例如同時(shí)使用數(shù)據(jù)脫敏+數(shù)據(jù)分片杜耙,或是數(shù)據(jù)分片+讀寫(xiě)分離,再或者是監(jiān)控治理+數(shù)據(jù)分片等拂盯。除了在功能層面的疊加選擇佑女,ShardingSphere還提供了各種接入端形式,例如Sharding-JDBC或Sharding-Proxy等以滿(mǎn)足大家不同場(chǎng)景需求。
十团驱、寫(xiě)在最后
ShardingSphere從最初的僅支持分庫(kù)分表功能摸吠,到現(xiàn)在已形成包括數(shù)據(jù)分片、分布式治理嚎花、分布式事務(wù)等核心功能為主的生態(tài)圈寸痢。這也標(biāo)識(shí)著它不僅僅是一款分布式數(shù)據(jù)庫(kù)中間件,不僅僅擁有分庫(kù)分表的能力紊选,更是形成以數(shù)據(jù)分片啼止、分布式治理、分布式事務(wù)為核心的全方位解決方案生態(tài)體系兵罢,歡迎大家在官網(wǎng)了解更多內(nèi)容献烦,在gitHub關(guān)注我們?!