必威电竞|足球世界杯竞猜平台

最小權(quán)限原則
來源:互聯(lián)網(wǎng)

最小權(quán)限原則(最早由 Saltzer 和 Schroeder 提出),是指每個(gè)程序和系統(tǒng)用戶都應(yīng)該具有完成任務(wù)所必需的最小權(quán)限集合。

它要求計(jì)算環(huán)境中的特定抽象層的每個(gè)模塊只能訪問當(dāng)下所必需的信息或者資源。

概述

計(jì)算機(jī)科學(xué)以及其它領(lǐng)域中,最小權(quán)限原則是要求計(jì)算環(huán)境中的特定抽象層的每個(gè)模塊如進(jìn)程、用戶或者計(jì)算機(jī)程序只能訪問當(dāng)下所必需的信息或者資源。

它賦予每一個(gè)合法動(dòng)作最小的權(quán)限,就是為了保護(hù)數(shù)據(jù)以及功能避免受到錯(cuò)誤或者惡意行為的破壞。

最小權(quán)限原則也稱為最少權(quán)限原則。

歷史

最小權(quán)限原則大約在1970年代中期開始出現(xiàn),人們通常認(rèn)為Peter J. Denning的“容錯(cuò)操作系統(tǒng)”一書,是這個(gè)概念的首次提出者,實(shí)際上,在當(dāng)時(shí)許多論文中,已經(jīng)用其它不同名字提到了這個(gè)原則,如Saltzer與Schroeder的計(jì)算機(jī)系統(tǒng)信息保護(hù)。

Saltzer與Schroeder的原始表述是

系統(tǒng)的每個(gè)程序或者用戶應(yīng)該使用完成工作所需的最小權(quán)限工作。

相關(guān)問題

最小權(quán)限原則限制代碼運(yùn)行所需的安全權(quán)限,有一個(gè)非常重要的原因,就是降低你的代碼在被惡意用戶利用時(shí),造成的損失。如果你的代碼僅僅使用最小權(quán)限來執(zhí)行,惡意用戶就難以使用它造成損失。如果你需要用戶使用管理員權(quán)限來執(zhí)行代碼,任何代碼中的安全缺陷,都會(huì)通過利用該缺陷的惡意用戶,潛在造成更大的損失。

編寫特權(quán)程序時(shí)的問題

??1.程序需要該權(quán)限嗎?

??如果程序不需要任何特殊權(quán)限來運(yùn)行,它不應(yīng)該是個(gè)特權(quán)程序。

??2.程序需要所有權(quán)限嗎?

??我們只給予程序完成任務(wù)所需的最小權(quán)限集合。

??許多操作系統(tǒng)不向我們提供多種選擇;我們可以選擇包含所有 Root 權(quán)限的集合,或者不包含任何權(quán)限的集合。多數(shù) Unix 系統(tǒng)就是這樣,你要么是root 要么不是,沒有中間值。

??多數(shù)現(xiàn)代Unix 系統(tǒng)(和 Windows)引入了更多選擇。這些系統(tǒng)將 Root 權(quán)限劃分為多種字權(quán)限。使用這種自粒度,我們就可以更好應(yīng)用最小權(quán)限原則。

??3.程序現(xiàn)在需要權(quán)限嗎?

??程序通常偶爾不需要特定權(quán)限,它們?cè)谶@個(gè)時(shí)候就變得不必要了。我們應(yīng)該暫時(shí)禁用它們來滿足最小權(quán)限原則。這么做的好處就是,放置程序犯下意外的錯(cuò)誤,使之不能對(duì)需要禁用權(quán)限的事情造成損失。下面的圖像展示了這個(gè)要點(diǎn)。

??稍后,禁用的權(quán)限可能就必要了,我們之后可以開啟它。

??要記住,開啟或禁用權(quán)限可以在特定場(chǎng)景下降低損失,當(dāng)攻擊者不能像漏洞程序注入代碼的時(shí)候。如果攻擊者可以向漏洞程序注入代碼,注入的代碼自己就能夠開啟權(quán)限。

??4.程序在未來需要權(quán)限嗎?

??如果權(quán)限不再需要了,它就是不必要的,應(yīng)該永久溢出,所以最小權(quán)限集合應(yīng)基于未來的需求來調(diào)整。

Unix中的最小權(quán)限原則

??Unix 為我們提供了什么機(jī)制,來實(shí)現(xiàn)最小權(quán)限原則?

??實(shí)用的系統(tǒng)調(diào)用:setuid(),seteuid(),setgid(),和setegid()。

??seteuid(uid):它為調(diào)用進(jìn)程設(shè)置有效 UID。

??如果調(diào)用進(jìn)程的有效 UID 是超級(jí)用戶,uid參數(shù)可以是任何東西。這通常由超級(jí)用戶用來暫時(shí)讓渡/獲取權(quán)限。但是,進(jìn)程的超級(jí)用戶權(quán)限并沒有丟失,進(jìn)程可以拿回來。

??如果調(diào)用進(jìn)程的有效 UID 不是超級(jí)用戶,UID 參數(shù)只能是有效 UID,真實(shí) UID,以及保存的 UID。這通常由特權(quán)程序使用來恢復(fù)他的權(quán)限(原始的特權(quán)有效 UID 保存在保存的 UID 中)。

??setuid(uid):它設(shè)置了當(dāng)前進(jìn)程的有效 UID。如果調(diào)用者的有效 UID 是 root,也會(huì)設(shè)置真實(shí)和保存的 UID。

??如果調(diào)用進(jìn)程的有效 UID 是超級(jí)用戶,真實(shí)、有效和保存的 UID 全部會(huì)設(shè)為uid參數(shù)。之后,程序就不能夠拿回 Root 權(quán)限(假設(shè) UID 不是 Root)。這用于永久讓渡高權(quán)限的訪問權(quán)。

??想要暫時(shí)放棄 Root 權(quán)限的 Set-Root-UID 程序,假設(shè)身份是非 Root 用戶,之后不能使用setuid來拿回權(quán)限。你可以使用seteuid調(diào)用來完成它。

??如果調(diào)用進(jìn)程的有效 UID 不是超級(jí)用戶,但是 UID 是調(diào)用進(jìn)程的真實(shí) UID 或者保存的 UID,那么有效 UID 會(huì)設(shè)置為uid。這類似于seteuid。

??示例(在 Fedora 中):進(jìn)程使用有效 UID = 0 來運(yùn)行,真實(shí) UID= 500,在調(diào)用它們之后,有效和真實(shí) UID 是什么?

??setuid(500); setuid(0);:答案:500/500(第一個(gè)調(diào)用生成 500/500,第二個(gè)調(diào)用失敗)。

??seteuid(500); setuid(0);:答案:0/500(第一個(gè)調(diào)用生成 500/500,第二個(gè)調(diào)用生成 0/500)。

??seteuid(600); setuid(500);:答案:500/500(第一個(gè)調(diào)用生成 600/500,第二個(gè)調(diào)用生成 500/500)。

??seteuid(600); setuid(500); setuid(0);:答案:0/500(第一個(gè)調(diào)用生成 600/500,第二個(gè)調(diào)用生成 500/500,第三個(gè)調(diào)用生成 0/500)。

參考資料 >

生活家百科家居網(wǎng)