Security

列數據屏蔽安全問題

  • April 28, 2022

在 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 語句不會返回任何記錄。

這是按設計工作™

啟用的列遮罩的應用不會干擾語句中其他子句的操作,例如WHEREGROUP BYHAVINGSELECT DISTINCTORDER BY。最終結果表中返回的行保持不變,只是結果行中的值可能被列遮罩屏蔽。

如果要阻止對特定行的訪問,則需要啟動行訪問控制並定義所需的行權限。

屏蔽是在流程的後期完成的,在將數據返回給最終使用者之前,在執行 WHERE 條件之後。

如果要求是嚴格在數據庫級別(而不是應用程序級別)進行屏蔽,就像所有醫生都必須有權訪問所有患者姓名一樣,那麼我看不到其他選擇,然後重新設計 ER 模型。這種扼殺了應用於現有表格之上的主要“行銷”思想掩蔽。

第一種選擇是使用視圖而不是數據屏蔽,應用程序訪問視圖而不是表。

第二種選擇是將敏感數據和非敏感數據分隔在單獨的表中。就像在“患者”表中具有“患者 ID”、“患者姓名”、“醫生姓名”以及在具有“患者 ID”和“疾病”欄位的單獨表中單獨的患者-疾病關係。或者在“患者”表中具有“患者 ID”、“患者姓名”、“醫生姓名”和新欄位“疾病 ID”,在新疾病表中具有疾病 ID 和疾病。然後在列遮罩旁邊還使用這兩個單獨的表中的行訪問控制。

引用自:https://dba.stackexchange.com/questions/311346