今天來理解存取控制 (Access Control) 的概念,並透過一個簡單案例,示範醫師、病人、管理員如何用不同角色來存取資料,確保醫療數據的隱私與安全。
為什麼需要存取控制?
加密可以確保資料被竊時無法解讀,但 誰能合法讀取資料 仍是一大挑戰。舉例:
病人只能查看自己的病歷。
醫師可以查看自己患者的病歷,但不能看所有病人的紀錄。
管理員可以管理帳號,但不一定能讀取病歷。
這些狀況下就需要存取控制 與 身分驗證。
一、存取控制常見模式
DAC(自主存取控制):資料擁有者決定誰可以存取。
MAC(強制存取控制):由系統或法規決定,例如軍事或醫療資料分級。
RBAC(角色存取控制):依角色分配權限,醫療系統最常見。因為醫師、病人、管理員的角色清楚。
二、案例分享
2020 年某美國醫院因為缺乏嚴格的角色存取控管,導致某位員工未經授權存取數百位病人的病歷。事件曝光後,不僅醫院聲譽受損,還被依 HIPAA 法規重罰數十萬美元。
這顯示出光有帳號密碼不夠,必須搭配角色分級管理。
三、簡單程式示範
# DAC:資料由擁有者決定誰可以存取
medical_records = {
"alice": {"owner": "alice", "data": "Alice's medical record"},
"bob": {"owner": "bob", "data": "Bob's medical record"}
}
# 每個人可以設定允許的使用者
permissions = {
"alice": ["doctor"], # Alice 允許醫師看她的病歷
"bob": [] # Bob 不允許其他人看
}
def dac_access(user, target):
if user == target: # 本人
return True
if user in permissions.get(target, []):
return True
return False
# 測試
print("DAC 測試:")
print(" 醫師存取 Alice?", dac_access("doctor", "alice"))
print(" 醫師存取 Bob?", dac_access("doctor", "bob"))
print(" Alice 存取自己?", dac_access("alice", "alice"))
以上程式碼執行結果如下
# MAC:根據安全等級控制
# 等級:1=低, 2=中, 3=高
users = {
"patient": 1,
"nurse": 2,
"doctor": 3,
"admin": 3
}
medical_records = {
"record1": {"level": 1, "data": "一般病歷"},
"record2": {"level": 2, "data": "手術紀錄"},
"record3": {"level": 3, "data": "精神疾病病歷"}
}
def mac_access(user, record):
return users[user] >= medical_records[record]["level"]
# 測試
print("\nMAC 測試:")
print(" 醫師看手術紀錄?", mac_access("doctor", "record2"))
print(" 病人看精神疾病病歷?", mac_access("patient", "record3"))
print(" 護士看一般病歷?", mac_access("nurse", "record1"))
MAC依照「資料等級」與「使用者等級」決定存取,使用者不能自行改變規則。執行結果如下
# RBAC:依角色分配權限
permissions = {
"patient": ["view_own_record"],
"doctor": ["view_patient_record", "update_patient_record"],
"admin": ["manage_users"]
}
users = {
"alice": {"role": "patient"},
"bob": {"role": "doctor"},
"carol": {"role": "admin"}
}
def rbac_access(user, action):
role = users[user]["role"]
return action in permissions.get(role, [])
# 測試
print("\nRBAC 測試:")
print("Alice 看自己病歷?", rbac_access("alice", "view_own_record"))
print("Alice 更新病人病歷?", rbac_access("alice", "update_patient_record"))
print("Bob 看病人病歷?", rbac_access("bob", "view_patient_record"))
print("Carol 管理使用者?", rbac_access("carol", "manage_users"))
執行結果如下
以上三種存取控制的程式碼範例輸出結果會顯示哪些操作被允許、哪些被拒絕。存取控制比加密更進一步,確保資料不只是安全儲存,還要「正確的人才能看」,透過這些程式碼可以模擬病人、醫師、管理員的權限差異。