最小許可權原則(最早由 Saltzer 和 Schroeder 提出),是指每個程式和系統用戶都應該具有完成任務所必需的最小許可權集合。
它要求計算環境中的特定抽象層的每個模組只能訪問當下所必需的信息或者資源。
基本介紹
- 中文名:最小許可權原則
- 外文名:principle of least privilege
- 別稱:最少許可權原則
- 學科:計算機科學
概述
歷史
- 系統的每個程式或者用戶應該使用完成工作所需的最小許可權工作。
相關問題
編寫特權程式時的問題:
- 1.程式需要該許可權嗎?
- 如果程式不需要任何特殊許可權來運行,它不應該是個特權程式。
- 我們只給予程式完成任務所需的最小許可權集合。
- 許多作業系統不向我們提供多種選擇;我們可以選擇包含所有 Root 許可權的集合,或者不包含任何許可權的集合。多數 Unix 系統就是這樣,你要么是 Root 要么不是,沒有中間值。
- 多數現代 Unix 系統(和 Windows)引入了更多選擇。這些系統將 Root 許可權劃分為多種字許可權。使用這種自粒度,我們就可以更好套用最小許可權原則。
- 程式通常偶爾不需要特定許可權,它們在這個時候就變得不必要了。我們應該暫時禁用它們來滿足最小許可權原則。這么做的好處就是,放置程式犯下意外的錯誤,使之不能對需要禁用許可權的事情造成損失。下面的圖像展示了這個要點。
- 稍後,禁用的許可權可能就必要了,我們之後可以開啟它。
- 要記住,開啟或禁用許可權可以在特定場景下降低損失,當攻擊者不能像漏洞程式注入代碼的時候。如果攻擊者可以向漏洞程式注入代碼,注入的代碼自己就能夠開啟許可權。
- 如果許可權不再需要了,它就是不必要的,應該永久溢出,所以最小許可權集合應基於未來的需求來調整。
Unix中的最小許可權原則
- 實用的系統調用:setuid(),seteuid(),setgid(),和setegid()。
- seteuid(uid):它為調用進程設定有效 UID。
- 如果調用進程的有效 UID 是超級用戶,uid參數可以是任何東西。這通常由超級用戶用來暫時讓渡/獲取許可權。但是,進程的超級用戶許可權並沒有丟失,進程可以拿回來。
- 如果調用進程的有效 UID 不是超級用戶,UID 參數只能是有效 UID,真實 UID,以及保存的 UID。這通常由特權程式使用來恢復他的許可權(原始的特權有效 UID 保存在保存的 UID 中)。
- 如果調用進程的有效 UID 是超級用戶,真實、有效和保存的 UID 全部會設為uid參數。之後,程式就不能夠拿回 Root 許可權(假設 UID 不是 Root)。這用於永久讓渡高許可權的訪問權。
- 想要暫時放棄 Root 許可權的 Set-Root-UID 程式,假設身份是非 Root 用戶,之後不能使用setuid來拿回許可權。你可以使用seteuid調用來完成它。
- 如果調用進程的有效 UID 不是超級用戶,但是 UID 是調用進程的真實 UID 或者保存的 UID,那么有效 UID 會設定為uid。這類似於seteuid。
- setuid(500); setuid(0);:答案:500/500(第一個調用生成 500/500,第二個調用失敗)。
- seteuid(500); setuid(0);:答案:0/500(第一個調用生成 500/500,第二個調用生成 0/500)。
- seteuid(600); setuid(500);:答案:500/500(第一個調用生成 600/500,第二個調用生成 500/500)。
- seteuid(600); setuid(500); setuid(0);:答案:0/500(第一個調用生成 600/500,第二個調用生成 500/500,第三個調用生成 0/500)。