Jeddak-DPSQL 首次開(kāi)源!基于差分隱私的 SQL 代理保護(hù)能力

1. 背景
火山引擎對(duì)于用戶敏感數(shù)據(jù)尤為重視,在火山引擎提供的數(shù)據(jù)分析產(chǎn)品中,廣泛采用差分隱私技術(shù)對(duì)用戶敏感信息進(jìn)行保護(hù)。此類數(shù)據(jù)產(chǎn)品通常構(gòu)建于 ClickHouse 等數(shù)據(jù)引擎之上,以 SQL 查詢方式來(lái)執(zhí)行計(jì)算邏輯,且查詢邏輯往往較為復(fù)雜,因此對(duì)差分隱私的應(yīng)用提出了以下要求:
- 零改造、零感知:最大程度避免影響業(yè)務(wù)現(xiàn)有查詢方式,最好做到業(yè)務(wù)零感知、零改造;
- 良好、靈活的適配性:能夠適配不同數(shù)據(jù)引擎的查詢語(yǔ)法,以及能夠處理包含多層嵌套、多重計(jì)算、多表連接等情形的復(fù)雜 SQL 語(yǔ)句;
- 安全性與可用性平衡:能夠根據(jù)業(yè)務(wù)數(shù)據(jù)質(zhì)量要求,計(jì)算合理的隱私預(yù)算,在安全性和數(shù)據(jù)可用性之間保持平衡;
針對(duì)以上需求,火山引擎安全研究團(tuán)隊(duì)開(kāi)發(fā)了 Jeddak-DPSQL:一種基于差分隱私的 SQL 代理工具。Jeddak-DPSQL 能夠兼容多種數(shù)據(jù)引擎和SQL方言,內(nèi)嵌多種差分噪聲擾動(dòng)算法,具備隱私預(yù)算管理能力,并且能夠與底層數(shù)據(jù)引擎結(jié)合,在數(shù)據(jù)分析師無(wú)感的情況下,對(duì) SQL 語(yǔ)句進(jìn)行自動(dòng)化分析和結(jié)果加噪處理。作為數(shù)據(jù)安全和隱私合規(guī)治理的標(biāo)準(zhǔn)能力之一,Jeddak-DPSQL 已經(jīng)在抖音集團(tuán)相關(guān)業(yè)務(wù)中得到了普遍應(yīng)用與驗(yàn)證。
在實(shí)際解決公司內(nèi)部面臨的問(wèn)題風(fēng)險(xiǎn)后,我們決定對(duì) Jeddak-DPSQL 進(jìn)行開(kāi)源,希望能夠?yàn)橥瑯用媾R該類問(wèn)題的企業(yè)和個(gè)人提供一定參考和幫助,同時(shí)也希望能夠有更多的外部開(kāi)發(fā)者能夠一起對(duì)該開(kāi)源項(xiàng)目進(jìn)行共建,完善 Jeddak-DPSQL 產(chǎn)品功能,共同構(gòu)建更完備的應(yīng)用生態(tài)。
2. 全面了解 Jeddak-DPSQL
2.1 Jeddak-DPSQL 介紹
Jeddak-DPSQL 采用中心化差分隱私 (Centralized Differential Privacy,簡(jiǎn)稱 CDP,適用于數(shù)據(jù)管理者可信的場(chǎng)景) 模式,以中間件的形式接收 SQL 統(tǒng)計(jì)查詢請(qǐng)求,返回滿足差分隱私的查詢結(jié)果。一個(gè)典型的查詢請(qǐng)求處理流程如下:
- 首先,核心服務(wù)接受客戶提交的 SQL 查詢語(yǔ)句,對(duì)該語(yǔ)句進(jìn)行解析和重寫,以便于計(jì)算隱私噪聲(如將 AVG 計(jì)算改為 SUM/COUNT);
- 然后,核心服務(wù)調(diào)用元數(shù)據(jù)管理服務(wù),計(jì)算重寫后的 SQL 查詢所對(duì)應(yīng)的數(shù)據(jù)表敏感度,同時(shí)在數(shù)據(jù)庫(kù)上執(zhí)行重寫后的 SQL 查詢,得到原始的查詢結(jié)果;
- 最后,核心服務(wù)調(diào)用隱私預(yù)算管理服務(wù)得到為該查詢分配的隱私預(yù)算,并結(jié)合敏感度在原始的查詢結(jié)果中添加噪聲并返回。

2.2 Jeddak-DPSQL 解決的問(wèn)題
案例背景
假設(shè)有一個(gè)數(shù)據(jù)庫(kù) business,存儲(chǔ)用戶消費(fèi)數(shù)據(jù),使用 clickhouse 引擎,其中一個(gè)表 user 存儲(chǔ)用戶信息,表中存在以下列:uid,name,age,sex,city,代表用戶id、姓名、年齡、性別、城市。
查詢需求
我們要查詢用戶數(shù)量和平均年齡的城市分布,使用 SQL 語(yǔ)句 1:
SELECT COUNT(*) AS cnt,AVG(age) as agev, city
FROM business.user
group by city風(fēng)險(xiǎn)
如果不應(yīng)用隱私保護(hù)技術(shù),可能面臨差分攻擊的風(fēng)險(xiǎn),比如攻擊者通過(guò)某渠道得知張三的 uid 為 803719,構(gòu)造下面的 SQL 語(yǔ)句 2:
SELECT COUNT(*) AS cnt,AVG(age) as agev, city
FROM business.user
WHERE uid != 803719
group by city通過(guò)執(zhí)行上面的 SQL 語(yǔ)句1和 SQL 語(yǔ)句2,可分別得到兩個(gè)查詢結(jié)果:

那么就可以通過(guò)比較兩次查詢結(jié)果得知張三所在的城市是北京,年齡大約 61 歲(120008x49.3276 = 5919706.62,120007x49.3275 = 5919645.29,5919706.62 - 5919645.29 約等于 61)
以上是一個(gè)簡(jiǎn)單的例子,現(xiàn)實(shí)場(chǎng)景中,攻擊者可能通過(guò)背景知識(shí)構(gòu)造更多樣、更復(fù)雜的查詢語(yǔ)句達(dá)到竊取隱私的目的。
因此,在上述 SQL 查詢場(chǎng)景下,可以通過(guò)接入 Jeddak-DPSQL 對(duì) SQL 進(jìn)行分析和重寫,最終執(zhí)行重寫后的 SQL 能夠保證返回給使用者的數(shù)據(jù)滿足差分隱私要求,進(jìn)而達(dá)到對(duì)個(gè)人隱私保護(hù)的效果。
2.3 Jeddak-DPSQL 在火山引擎的應(yīng)用驗(yàn)證
- Jeddak-DPSQL已接入火山引擎的增長(zhǎng)分析(finder)、A/B 測(cè)試等產(chǎn)品,間接服務(wù)300+外部客戶,日均處理查詢請(qǐng)求 200+。Jeddak-DPSQL服務(wù)不僅幫助業(yè)務(wù)滿足了隱私保護(hù)和業(yè)務(wù)合規(guī)的需求,同時(shí)也成為創(chuàng)新型隱私計(jì)算技術(shù)應(yīng)用的典范案例。
- 開(kāi)放隱私計(jì)算 OpenMPC 對(duì)外公布了“隱私計(jì)算 2021 年度優(yōu)秀應(yīng)用案例 TOP 10”。火山引擎 云安全憑借“融合 差分隱私 的火山引擎 DPSQL 服務(wù)”案例,成功入選 TOP 10。
3. 如何使用 Jeddak-DPSQL
git 開(kāi)源項(xiàng)目地址: https://github.com/bytedance/Jeddak-DPSQL
3.1 下載
git clone https://github.com/bytedance/Jeddak-DPSQL3.2 快速部署
完成 Jeddak-DPSQL 下載后,按照 README 中的部署引導(dǎo)部分完成服務(wù)部署,整個(gè)部署過(guò)程包括以下步驟:
- 服務(wù)依賴包安裝:進(jìn)入項(xiàng)目根目錄,使用 pip install -r requirements.txt 安裝服務(wù)所需完整 pip 包
- MetaData 存儲(chǔ)準(zhǔn)備:在使用DPSQL 時(shí),需要維護(hù)源數(shù)據(jù)表的 MetaData 信息,為后續(xù)加噪計(jì)算敏感度作準(zhǔn)備。Jeddak-DPSQL 使用 Mysql 對(duì)相應(yīng)元數(shù)據(jù)信息進(jìn)行存儲(chǔ),因此需要用戶提前在自己的Mysql數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的表
- 隱私預(yù)算消耗存儲(chǔ)準(zhǔn)備:使用 Jeddak-DPSQL 系統(tǒng)過(guò)程,可以記錄對(duì)表級(jí)別的數(shù)據(jù)查詢時(shí)的隱私預(yù)算消耗。主要通過(guò)Mysql進(jìn)行記錄,因此需要用戶提前在自己的Mysql數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的表
- 數(shù)據(jù)庫(kù)連接配置:Jeddak-DPSQL 中使用數(shù)據(jù)庫(kù)主要有 Mysql 和 Redis,因此需要對(duì)這兩個(gè)數(shù)據(jù)庫(kù)連接地址進(jìn)行配置
- 服務(wù)啟動(dòng):完成上述配置后可以在項(xiàng)目根目錄運(yùn)行 bootstrap.sh 腳本啟動(dòng)服務(wù)
3.3 正式使用
完成 Jeddak-DPSQL 部署后,按照 README 中的快速開(kāi)始部分可以進(jìn)行功能體驗(yàn),整個(gè)過(guò)程如下:
- 選擇要測(cè)試的數(shù)據(jù)源(Hive 或 ClickHouse),導(dǎo)入要進(jìn)行查詢測(cè)試的原始數(shù)據(jù)集
- 初始化metadata和隱私預(yù)算
1. 生成 metadata
2. 啟動(dòng)dpsql服務(wù)后, 調(diào)用接口 /api/v1/metadata/generate,生成metadata,可參考:
def meta_generate():
args = {
"db_config": {
"host": <hive_host>,
"database": <hive_dbname>,
"username": <hive_username>,
"password": <hive_password>
},
"table_name": "us_accidents_dec21_updated",
"db_type": db_type
}
route_path = "/api/v1/metadata/generate"# local service, host:127.0.0.1, port:5000url = "http://%s:%s/%s" % (host, port, route_path)
headers = {"content-type": "application/json"}
r = requests.post(url, jsnotallow=args, headers=headers)
if __name__ == '__main__':
meta_generate()3. 確認(rèn)metadata 生成完成
4. 調(diào)用
/api/v1/metadata/get接口,確認(rèn) metadata 生成完成
def meta_get():
args = {
"prefix": <hive_host>,
"db_name": <hive_dbname>,
"table_name": "us_accidents_dec21_updated"
}
route_path = "/api/v1/metadata/get"# local service, host:127.0.0.1, port:5000url = "http://%s:%s/%s" % (host, port, route_path)
headers = {"content-type": "application/json"}
r = requests.get(url, jsnotallow=args, headers=headers)
print(r.text)- 調(diào)用隱私保護(hù)查詢接口,獲得經(jīng)過(guò)差分隱私保護(hù)的查詢結(jié)果
def query_sql_noise(sql, data_source):
key = {
"sql": sql,
"dbconfig": {
"reader": data_source,
"host": <hive_host>,
"database": <hive_dbname>,
"port": <hive_port>
},
"queryconfig": {
"traceid": "traceid",
}
}
route_path = "/api/v1/query"url = "http://%s:%s/%s" % (host, port, route_path)
headers = {"content-type": "application/json"}
r = requests.post(url, jsnotallow=key, headers=headers)
return res
if __name__ == "__main__":
sql = "select count(severityc) from menu_page group by severity"
section = "hivereader"
res = query_sql_noise(sql, section)
print(res)更多接口使用方式可以參考項(xiàng)目 README 中的 API Documentation 部分
4. 后續(xù)計(jì)劃
由于當(dāng)前是 Jeddak-DPSQL 的首個(gè)開(kāi)源版本,因此還存在很多不完善的地方,希望大家能夠多多諒解。Jeddak-DPSQL 計(jì)劃進(jìn)行長(zhǎng)期維護(hù),歡迎大家使用,也希望有更多的外部開(kāi)發(fā)者能夠一起對(duì)該開(kāi)源項(xiàng)目進(jìn)行共建,完善產(chǎn)品功能,構(gòu)建更完備的應(yīng)用生態(tài)。
5. 關(guān)于安全研究
火山引擎安全研究部門的愿景是創(chuàng)新突破前沿安全理論技術(shù),賦能數(shù)字經(jīng)濟(jì)。部門當(dāng)前以數(shù)據(jù)安全中心私有化單品-可信隱私計(jì)算產(chǎn)品 Jeddak 為載體,從可信計(jì)算、聯(lián)邦學(xué)習(xí)、多方安全計(jì)算、差分隱私、密文計(jì)算、共識(shí)計(jì)算等方向著手,開(kāi)展隱私計(jì)算技術(shù)的前沿研究和應(yīng)用探索。基于這些領(lǐng)域最新前沿理論技術(shù),創(chuàng)新研發(fā)、突破瓶頸,實(shí)現(xiàn)數(shù)據(jù)全生命周期安全與隱私保護(hù),以及可信隱私計(jì)算等應(yīng)用服務(wù)落地:賦能業(yè)務(wù)、保駕護(hù)航;更進(jìn)一步打破數(shù)據(jù)孤島,推動(dòng)數(shù)據(jù)多源融合與流通交易,發(fā)揮數(shù)據(jù)價(jià)值。


























