列數據屏蔽安全問題
在 Linux 上的 Db2 v11.5.7 中,我有一個簡單的表:
create table admin.patient_data ( patientid int not null primary key, patient_name varchar(10), illness varchar(15), doctor_name varchar(10) ); insert into admin.patient_data values (1, 'Alice', 'illness A', 'DOCTOR1'); insert into admin.patient_data values (2, 'Bob', 'illness B', 'DOCTOR2'); select * from admin.patient_data;
結果:
PATIENTID PATIENT_NAME ILLNESS DOCTOR_NAME ----------- ------------ --------------- ---------- 1 Alice illness A DOCTOR1 2 Bob illness B DOCTOR2
ILLNESS 列是敏感數據。我希望僅當列 DOCTOR_NAME 與 Db2 登錄使用者匹配時才顯示此列。
create mask admin.patient_data on admin.patient_data for column illness return case when doctor_name = USER then illness else 'Masked data' end enable; alter table admin.patient_data activate column access control;
現在使用者 DOCTOR1 連接到數據庫並檢查數據:
select * from admin.patient_data
它被退回:
PATIENTID PATIENT_NAME ILLNESS DOCTOR_NAME ----------- ------------ --------------- ----------- 1 Alice illness A DOCTOR1 2 Bob Masked data DOCTOR2
在行 PATIENTID=2 列 ILLNESS 預計將被屏蔽。
但是醫生受過教育,所以他/她知道所有的疾病,現在瞄準“疾病B”
db2 "select * from admin.patient_data where illness = 'illness B'"
它得到:
PATIENTID PATIENT_NAME ILLNESS DOCTOR_NAME ----------- ------------ --------------- ----------- 2 Bob Masked data DOCTOR2
欄位 ILLNESS 仍按預期標記,但現在因為有條件的 DOCTOR1 知道患者 Bob 患有“疾病 B”。
我希望最終使用者可以按條件返回的值進行過濾。即:“疾病A”和“標記數據”。
有沒有一些簡單的解決方案來防止這種情況?我希望最後一個 select 語句不會返回任何記錄。
這是按設計工作™:
啟用的列遮罩的應用不會干擾語句中其他子句的操作,例如
WHERE
、GROUP BY
、HAVING
、SELECT DISTINCT
和ORDER BY
。最終結果表中返回的行保持不變,只是結果行中的值可能被列遮罩屏蔽。如果要阻止對特定行的訪問,則需要啟動行訪問控制並定義所需的行權限。
屏蔽是在流程的後期完成的,在將數據返回給最終使用者之前,在執行 WHERE 條件之後。
如果要求是嚴格在數據庫級別(而不是應用程序級別)進行屏蔽,就像所有醫生都必須有權訪問所有患者姓名一樣,那麼我看不到其他選擇,然後重新設計 ER 模型。這種扼殺了應用於現有表格之上的主要“行銷”思想掩蔽。
第一種選擇是使用視圖而不是數據屏蔽,應用程序訪問視圖而不是表。
第二種選擇是將敏感數據和非敏感數據分隔在單獨的表中。就像在“患者”表中具有“患者 ID”、“患者姓名”、“醫生姓名”以及在具有“患者 ID”和“疾病”欄位的單獨表中單獨的患者-疾病關係。或者在“患者”表中具有“患者 ID”、“患者姓名”、“醫生姓名”和新欄位“疾病 ID”,在新疾病表中具有疾病 ID 和疾病。然後在列遮罩旁邊還使用這兩個單獨的表中的行訪問控制。