自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Unix安全編程: 最小化特權(quán)

安全 網(wǎng)站安全
安全的程序必須最小化特權(quán),以降低 bug 轉(zhuǎn)化為安全缺陷的可能性。本文討論了如何通過最小化有特權(quán)的模塊、授與的特權(quán)以及特權(quán)的有效時(shí)間來最小化特權(quán)....

安全的程序必須最小化特權(quán),以降低 bug 轉(zhuǎn)化為安全缺陷的可能性。本文討論了如何通過最小化有特權(quán)的模塊、授與的特權(quán)以及特權(quán)的有效時(shí)間來最小化特權(quán)。

文章不僅討論了一些傳統(tǒng)的類 UNIX 特權(quán)機(jī)制,還討論了較新的機(jī)制,如 FreeBSD 的 jail(),Linux 安全模塊(Linux Security Modules,LSM)框架,以及 Security-Enhanced Linux(SELinux)。

2003 年 3 月 3 日,Internet Security Systems 對(duì) Sendmail 中的一個(gè)嚴(yán)重的漏洞提出了警告。所有的電子郵件都通過郵件傳輸代理(mail transfer agent,MTA)來傳輸,Sendmail 則是最流行的 MTA,所以這個(gè)警告影響了世界范圍內(nèi)的很多組織。問題在于,按通常的配置,精心設(shè)置了“from”、 “to”或者“cc”域的電子郵件消息可以讓發(fā)送者完全(root)控制任何一臺(tái)運(yùn)行著 Sendmail 的機(jī)器。更嚴(yán)重的是,一般的防火墻將 不能保護(hù)其內(nèi)部的機(jī)器免受這種攻擊。

造成這一漏洞的直接原因是,Sendmail 的一個(gè)安全檢測(cè)是有缺陷的,可以發(fā)生緩沖區(qū)溢出。不過,一個(gè)重要的作用因素是,Sendmail 經(jīng)常被安裝為一個(gè)單一的“setuid root”程序,對(duì)運(yùn)行它的系統(tǒng)有完全的控制權(quán)限。這樣,Sendmail 中的任何缺陷都可以讓攻擊者直接控制整個(gè)系統(tǒng)。

這個(gè)設(shè)計(jì)是必須的嗎?不是;Wietse Venema 的 Postfix 是一個(gè)常見的可以與之匹敵的 MTA。類似于 Sendmail,Postfix 會(huì)去做很多安全檢測(cè),不過,為了 最小化特權(quán),Postfix 設(shè)計(jì)為一組模塊。結(jié)果,Postfix 通常被認(rèn)為是比 Sendmail 更安全的程序。本文討論了如何最小化特權(quán),您可以將同樣的思想應(yīng)用到您的程序中。

最小化特權(quán)的基礎(chǔ)

實(shí)際應(yīng)用的程序會(huì)有缺陷。不是我們希望那樣,但是確實(shí)是有。復(fù)雜的需求、日程的壓力和環(huán)境的變化使得不太可能得到實(shí)用的無缺陷的程序。甚至那些通過復(fù)雜而且精確的技術(shù)正式地證明是正確的程序,也會(huì)有缺陷。為什么?其中一個(gè)原因是,驗(yàn)證必須做很多假設(shè),而且通常這些假設(shè)并不是完全正確。無論如何,出于種種原因,大部分程序沒有得到嚴(yán)格的檢驗(yàn)。而且,即使今天沒有任何缺陷(不太可能),日后維護(hù)的改變或者環(huán)境的改變都可能會(huì)引入缺陷。所以,要處理實(shí)際的問題,我們不得不以某種方式來開發(fā)安全的程序, 盡管 我們的程序中有缺陷。

盡管有這些缺陷,對(duì)安全編程來說最重要的方法是 最小化特權(quán)。特權(quán)只是允許去做并不是 每個(gè)人 都可以做的事情。在類 UNIX 系統(tǒng)中,擁有“root”用戶、其他用戶或者一個(gè)組的成員的特權(quán)是最常見的特權(quán)種類。一些系統(tǒng)讓您可以授與讀或?qū)懱囟ㄎ募奶貦?quán)。不過,不管怎么樣,要最小化特權(quán):

只為程序中需要特權(quán)的部分授與特權(quán)

只授與部分絕對(duì)需要的具體特權(quán)

將特權(quán)的有效時(shí)間或者可以有效的時(shí)間限制到絕對(duì)最小

這些其實(shí)是目標(biāo),不是絕對(duì)的。您的基礎(chǔ)組織(比如您的操作系統(tǒng)或者虛擬機(jī))可能使得嚴(yán)格完成這些并不容易,或者嚴(yán)格完成這些可能會(huì)很復(fù)雜,而導(dǎo)致在嘗試嚴(yán)格完成時(shí)引入更多缺陷。但是,你距離這些目標(biāo)越近,缺陷導(dǎo)致安全問題的可能性就越低。即使缺陷導(dǎo)致了安全問題,它導(dǎo)致的安全問題的嚴(yán)重性可能會(huì)更低。而且,如果您可以確保只有小部分程序擁有特定的特權(quán),您就可以用大量額外的時(shí)間來確保 那 一部分能抵御攻擊。這個(gè)思想并不新; Saltzer 和 Schroeder 的優(yōu)秀的 1975 論文討論了安全的原理,明確地將最小化特權(quán)作為一個(gè)原則(查看 參考資料)。有一些思想是永恒的,比如最小化特權(quán)。

接下來的三節(jié)將依次討論這些目標(biāo),包括如何在類 UNIX 系統(tǒng)中實(shí)現(xiàn)他們。然后,我們將討論 FreeBSD 和 Linux 中可用的一些特別的機(jī)制,包括對(duì) NSA 的 Security-Enhanced Linux(SELinux)的討論。

最小化有特權(quán)的模塊

如前所述,只有需要特權(quán)的部分程序才應(yīng)用擁有特權(quán)。這就是說,當(dāng)您設(shè)計(jì)您的程序時(shí),盡量將程序分解為獨(dú)立的部分,以使得只有小而獨(dú)立的部分需要特定的特權(quán)。

如果不同的部分必須同時(shí)運(yùn)行,那么在類 UNIX 系統(tǒng)中使用進(jìn)程(不是線程)。線程共享它們的安全特權(quán),有問題的線程可能會(huì)干擾進(jìn)程中所有其他線程。編寫有特權(quán)的部分時(shí),就當(dāng)作其它的程序正在攻擊它:某一天會(huì)可能!確保有特權(quán)的部分只去做盡可能少的事情;受限的功能意味著更不易被利用。

一個(gè)通常的方法是,創(chuàng)建功能極度受限的擁有特定特權(quán)(比如是 setuid 或者 setgid)命令行工具。UNIX 的 passwd 命令就是一個(gè)例子;它是一個(gè)具有特定特權(quán)的命令行工具,用于修改密碼(setuid root),但是它所能做的只是修改密碼。于是各種 GUI 工具可以要求 passwd 來做實(shí)際的更改。如果有可能,盡量完全避免創(chuàng)建 setuid 或 setgid 程序,因?yàn)楹茈y確保您正在真正保護(hù)所有輸入。不過,有時(shí)您需要?jiǎng)?chuàng)建 setuid/setgid 程序,所以,當(dāng)需要時(shí),盡可能使程序最小且最受限制。

有很多其他的方法。例如,您可以有一個(gè)具有特定特權(quán)的小的“服務(wù)器(server)”進(jìn)程;那個(gè)服務(wù)器只允許特定的請(qǐng)求,而且只是在確認(rèn)請(qǐng)求者被允許發(fā)出請(qǐng)求之后。另一個(gè)常見的方法是,使用特權(quán)啟動(dòng)一個(gè)程序,這個(gè)程序然后派生放棄所有特權(quán)的第二個(gè)進(jìn)程,而由這個(gè)進(jìn)程來做大部分工作。

要當(dāng)心這些模塊彼此之間如何通信。在很多類 UNIX 系統(tǒng)上,命令行值和環(huán)境可以被其他用戶看到,所以不是在進(jìn)程間保密地發(fā)送數(shù)據(jù)的好辦法。管道可以勝任,但是要細(xì)心地避免死鎖(一個(gè)兩端都可以刷新的簡(jiǎn)單的請(qǐng)求/響應(yīng)協(xié)議就可以勝任)。

最小化授與的特權(quán)

確保您只授與特權(quán)給確實(shí)需要的程序——到此為止。UNIX 進(jìn)行獲得特權(quán)的主要途徑是它們以哪個(gè)用戶或組的身份運(yùn)行。通常,進(jìn)程以使用它們的用戶和組身份運(yùn)行,不過,“setuid” 或 “setgid” 的程序會(huì)獲得擁有這個(gè)程序的用戶或組的特權(quán)。

悲哀的是,還是有一些不自主地給予程序“setuid root”特權(quán)的類 UNIX 系統(tǒng)上的開發(fā)者。這些開發(fā)者認(rèn)為他們使得事情對(duì)自己來說變得“容易”,因?yàn)樗麄儾槐卦偃ド钊肟紤]他們的程序確切需要什么特權(quán)。問題是,由于這些程序程序可以在大部分類 UNIX 系統(tǒng)上做差不多所有的事情,所以任何一個(gè)缺陷都可以很快成為一個(gè)安全災(zāi)難。

不要只是因?yàn)槟枰瓿梢粋€(gè)簡(jiǎn)單的任務(wù)就給出所有可能的特權(quán)。而應(yīng)該只給予程序它們所需要的特權(quán)。如果您可以,以 setgid 來運(yùn)行它們,而不要用 setuid——setgid 給予的特權(quán)更少。創(chuàng)建特定的用戶和組(不要使用 root),并根據(jù)您的需要使用它們。確保 root 所擁有的那些可執(zhí)行程序只能由 root 來寫,這樣其他人就不能修改它們。設(shè)置非常嚴(yán)格的文件權(quán)限——如果不是絕對(duì)需要,不要讓所有人都可以讀或?qū)懳募⑶沂褂媚切┨囟ǖ挠脩艉徒M。能說明所有這些的一個(gè)例子可能是游戲“top ten”分?jǐn)?shù)的標(biāo)準(zhǔn)慣例。很多程序都是“setgid games”,以使得只有游戲程序可以修改“top ten”分?jǐn)?shù),而且存儲(chǔ)這些分?jǐn)?shù)的文件的主人是 games 組(而且只有這個(gè)組可以寫)。即使攻擊者攻擊并進(jìn)入了一個(gè)游戲程序,所有他能做的事情將是修改分?jǐn)?shù)文件。無論如何,游戲開發(fā)者還是需要編寫他們的程序來防止惡意的分?jǐn)?shù)文件。

chroot() 系統(tǒng)調(diào)用是一個(gè)實(shí)用的工具——不幸的是有一些難用。當(dāng)進(jìn)程查看文件系統(tǒng)的 “root”時(shí),這個(gè)系統(tǒng)調(diào)用會(huì)修改進(jìn)程所看到的內(nèi)容。如果您計(jì)劃用它——而且它可能是實(shí)用的——要準(zhǔn)備好花一些時(shí)間來用好它。必須精心準(zhǔn)備 “new root”,這是復(fù)雜的,因?yàn)榇_切的應(yīng)用程序依賴于平臺(tái)和應(yīng)用程序的特性。您 必須 以 root 身份來進(jìn)行 chroot() 調(diào)用,而且您 應(yīng)該快速地 改變?yōu)榉?root 身份(root 用戶可以脫離 chroot 環(huán)境,所以如果它要生效,您需要解除那個(gè)特權(quán))。而且 chroot 不會(huì)改變網(wǎng)絡(luò)訪問。這可以是一個(gè)實(shí)用的系統(tǒng)調(diào)用,所有有時(shí)候需要考慮它,但是要做好付出努力的準(zhǔn)備。

 限制資源是一個(gè)經(jīng)常被遺忘的工具,這既包括存儲(chǔ)的資源也包括進(jìn)程的資源。這些限制拒絕服務(wù)攻擊尤其有用:

對(duì)存儲(chǔ)來說,您可以為每個(gè)用戶或組設(shè)置每個(gè)掛載的文件系統(tǒng)的存儲(chǔ)量或文件數(shù)的配額(限定)。在 GNU/Linux 系統(tǒng)中查看 quota(1)、quotactl(2) 和 quotaon(8) 來深入了解這一功能,不過,盡管它們不是哪里都能用,大部分類 UNIX 系統(tǒng)都包含了 quota 系統(tǒng)。在 GNU/Linux 和很多其他系統(tǒng)中,您可以設(shè)置“硬”界限(永遠(yuǎn)不能超出)和“軟”界限(可以臨時(shí)超出)。

對(duì)進(jìn)程來說,您可以設(shè)置很多限定,比如打開文件的數(shù)目、進(jìn)程的數(shù)目,等等。這種能力實(shí)際上是標(biāo)準(zhǔn)的一部分(比如單一 UNIX 規(guī)范(Single UNIX Specification)),所有它們?cè)陬?UNIX 系統(tǒng)上幾乎普遍存在;要深入了解,請(qǐng)查看 getrlimit(2)、 setrlimit(2) 以及 getrusage(2)、sysconf(3) 和 ulimit(1)。進(jìn)程永遠(yuǎn)不能超出“當(dāng)前界限”,但是它們可以將當(dāng)前界限一路上升到“上限”。不幸的是,這里有一個(gè)不合常理的術(shù)語問題可能會(huì)使您迷惑?!爱?dāng)前界限”也被稱為“軟”界限,上限也稱為 “硬”界限。這樣,您就會(huì)處在一個(gè)異乎尋常的情形,進(jìn)程 永遠(yuǎn) 不能超出進(jìn)程界限的軟(當(dāng)前)界限——而對(duì)于 quota 來說您 可以 超出軟界限。我建議為進(jìn)程界限使用術(shù)語“當(dāng)前界限”和“上限”(永遠(yuǎn)不要使用術(shù)語“軟”和“硬”),那樣就沒有任何迷惑了。

最小化特權(quán)的時(shí)間

只是當(dāng)需要的時(shí)候才給予特權(quán)——片刻也不要多給。

只要可能,使用無論什么您立即需要的特權(quán),然后 永久地 放棄它們。一旦它們被永久放棄,后來的攻擊者就不能以其他方式利用那些特權(quán)。例如,需要個(gè)別的 root 特權(quán)的程序可能以 root 身份啟動(dòng)(比如說,通過成為 setuid root)然后切換到以較少特權(quán)用戶身份運(yùn)行。這是很多 Internet 服務(wù)器(包括 Apache Web 服務(wù)器)所采用的方法。類 UNIX 系統(tǒng)不允許任何程序打開 0 到 1024 TCP/IP 端口;您必須擁有 root 特權(quán)。但是大部分服務(wù)器只是在啟動(dòng)的時(shí)候需要打開端口,以后就再也不需要特權(quán)了。一個(gè)方法是以 root 身份運(yùn)行,盡可能快地打開需要特權(quán)的端口,然后永久去除 root 特權(quán)(包括進(jìn)程所屬的任何有特權(quán)的組)。也要嘗試去除所有其他繼承而來的特權(quán);例如,盡快關(guān)閉需要特定的特權(quán)才能打開的文件。

 如果您不能永久地放棄特權(quán),那么您至少可以盡可能經(jīng)常臨時(shí)去除特權(quán)。這不如永久地去除特權(quán)好,因?yàn)槿绻粽呖梢钥刂颇某绦?,攻擊者就可以重新啟用特?quán)并利用它。盡管如此,還是值得去做。

很多攻擊只有在它們欺騙有特權(quán)的程序做一些計(jì)劃外的事情而且程序的特權(quán)被啟用時(shí)才會(huì)成功(例如,通過創(chuàng)建不合常理的符號(hào)鏈接和硬鏈接)。如果程序通常不啟用它的特權(quán),那么攻擊者想利用這個(gè)程序就會(huì)更困難。

較新的機(jī)制

到目前為止,我們所討論的原則實(shí)際上適用于幾乎所有操作系統(tǒng),而且,自 19 世紀(jì) 70 年代以來,幾乎所有的類 UNIX 系統(tǒng)的常規(guī)機(jī)制都是類似的。那并不是說它們沒有用處;簡(jiǎn)單和時(shí)間的檢驗(yàn)是它們本身的優(yōu)勢(shì)。不過,一些較新的類 UNIX 系統(tǒng)已經(jīng)增加了支持最少權(quán)限的機(jī)制,值得去了解。雖然很容易找出經(jīng)過時(shí)間檢驗(yàn)的機(jī)制,可是關(guān)于較新的機(jī)制的資料還沒有廣為人知。所以,在這里我將討論選出的一些有價(jià)值的機(jī)制:FreeBSD jail() 、Linux 安全模塊(LSM)框架和 Security-Enhanced Linux(SELinux)。

FreeBSD jail()

chroot() 系統(tǒng)調(diào)用有很多問題,如前所述。例如,它難以正確使用,root 用戶還是可以從中脫離,而且它根本不去控制網(wǎng)絡(luò)訪問。FreeBSD 開發(fā)者決定增加一個(gè)新的系統(tǒng)調(diào)用來解決這些問題,這個(gè)新的系統(tǒng)調(diào)用叫做 jail() 。這個(gè)調(diào)用類似于 chroot() ,不過盡力更易用且更用效。在一個(gè) jail 中,所有的請(qǐng)求(即使是 root 的)都被 jail 所限,進(jìn)程只能與 jail 中的其他進(jìn)程通信,而且系統(tǒng)封鎖了 root 用戶試圖從 jail 中脫離的典型途徑。jail 會(huì)被分配一個(gè)特定的 IP 地址,不能使用任何其他地址作為它自己的地址。

jail() 調(diào)用是 FreeBSD 所獨(dú)有的,這就限制了它的效用。不過,各個(gè) OSS/FS 內(nèi)核之間有很多交叉影響(cross-pollination)。例如,已經(jīng)使用 Linux 安全框架為 Linux 開發(fā)了一個(gè) jail 版本。而且, FreeBSD 5 已經(jīng)添加了一個(gè)靈活的 MAC 框架(來自 TrustedBSD 項(xiàng)目),包括一個(gè)具有類似 SELinux 基本功能的模塊。所有,將來看到更多這種情況不要感到奇怪。

Linux 安全模塊(LSM)

在 2001 年的 Linux Kernel Summit 上,Linus Torvalds 遇到了一個(gè)問題。一些不同的安全項(xiàng)目,包括 Security-Enhanced Linux(SELinux)項(xiàng)目,要求他將他們的安全方法添加到 Linux 內(nèi)核中。問題是,這些不同的方法常常是不兼容的。 Torvalds 沒有簡(jiǎn)單的方法可以判定哪個(gè)是最好的,所以他要求那些項(xiàng)目為 Linux 合作創(chuàng)建某種通用的安全框架。那樣,管理員就可以給他們特別的系統(tǒng)安裝任意他們想要的安全方法。與 Torvalds 討論了幾次以后,Crispin Cowan 建立了一個(gè)小組來創(chuàng)建這個(gè)通用的安全框架。這個(gè)框架被命名為 Linux 安全模塊(LSM)框架,現(xiàn)在是標(biāo)準(zhǔn) Linux 內(nèi)核的一部分(如 2.6 版本內(nèi)核)。

概念上講,LSM 框架特別簡(jiǎn)單。Linux 內(nèi)核仍去做它常規(guī)的安全檢測(cè);例如,如果您要寫一個(gè)文件,您仍需要對(duì)其有寫權(quán)限。

不過,不論何時(shí)如果 Linux 內(nèi)核需要判定是否應(yīng)該準(zhǔn)許訪問,它還要進(jìn)行核對(duì)——通過一個(gè)“book”去要求一個(gè)安全模塊來進(jìn)行—— 來確定動(dòng)作是否得到準(zhǔn)許。這樣,管理員可以簡(jiǎn)單地選出他想要使用的安全模塊,并像其他 Linux 內(nèi)核模塊一樣將其插入。從那時(shí)以后,那個(gè)安全模塊將判定什么是允許的。

LSM 框架設(shè)計(jì)得如此靈活,它可以實(shí)現(xiàn)很多不同種類的安全策略。實(shí)際上,一些不同的項(xiàng)目進(jìn)行合作以確保 LSM 框架足以勝任真正的工作。例如,當(dāng)內(nèi)部對(duì)象被創(chuàng)建或被刪除時(shí) LSM 引入一些調(diào)用——不是因?yàn)槟切┎僮骺赡軙?huì)中止,而是讓安全模塊可以保持對(duì)重要數(shù)據(jù)的追蹤。使用了一些不同的分析工具來確保 LSM 框架不會(huì)遺漏其目標(biāo)的任何重要異常分支。結(jié)果證明,這個(gè)項(xiàng)目比很多人想像的要困難,它的成功是來之不易的。

有必要理解 LSM 所做的基本的設(shè)計(jì)決定。基本上,LSM 框架故意設(shè)計(jì)為幾乎所有異常分支都是受限的,而不是可信的(authoritative)。一個(gè) 可信的 異常分支做出絕對(duì)最終的決定:如果異常分支認(rèn)為一個(gè)請(qǐng)求應(yīng)該被準(zhǔn)許,那么它就會(huì)被無條件準(zhǔn)許。相反, 可信的 異常分支只能增加另外的限制;它不能授與新權(quán)限。理論上,如果所有 LSM 異常分支都是可信的,LSM 框架將會(huì)更加靈活。有一個(gè)名為 capable() 的異常分支是可信任的——但是只是因?yàn)樗坏貌恢С殖R?guī)的 POSIX 能力。不過,要讓 所有 異常分支都可信,就要對(duì) Linux 內(nèi)核進(jìn)行很多根本的改變,還說不準(zhǔn)這種改變是不是會(huì)被接受。

有很多人擔(dān)心,如果大部分異常分支都可信,即使是最小的缺陷也將成為災(zāi)難;而讓異常分支受限意味著用戶將不會(huì)感到意外(不管怎樣,原來的 UNIX 權(quán)限仍正常工作)。所以 LSM 框架開發(fā)者有意選擇了限制方法,而且它的大部分開發(fā)者自信他們可以在框架內(nèi)工作。

理解 LSM 框架的其他限制也是重要的。LSM 框架設(shè)計(jì)只是用來支持訪問控制,不是審計(jì)等其他安全問題。 LSM 模塊本身不能記錄所有請(qǐng)求或它們的結(jié)果,因?yàn)樗鼈儾荒芸吹饺?。為什么?一個(gè)原因是,內(nèi)核可能沒有調(diào)用 LSM 模塊就拒絕了請(qǐng)求;如果您想審計(jì)這個(gè)拒絕就會(huì)有問題。還有,出于性能的考慮,有一些提議的用于網(wǎng)絡(luò)的 LSM 異常分支和數(shù)據(jù)域沒有被主線內(nèi)核所采用。它可以控制一些網(wǎng)絡(luò)訪問,但不足以支持“l(fā)abelled”網(wǎng)絡(luò)數(shù)據(jù)流(在這種情況下,不同的數(shù)據(jù)包有不同的由操作系統(tǒng)處理的安全標(biāo)簽)。這些都是不合適的限制,也不符合一般思想的基本原則;LSM 框架有希望終有一天得到擴(kuò)展以破除這些限制。

盡管如此,即使有這些限制,LSM 框架對(duì)給特權(quán)添加限制來說仍是非常實(shí)用。Torvalds 的目標(biāo)由 LSM 框架根本上實(shí)現(xiàn)了:“我不喜歡在不同的安全人群之間斗爭(zhēng)。我希望是間接的,讓 我跳出這場(chǎng)斗爭(zhēng),然后市場(chǎng)斗爭(zhēng)就可以決定哪個(gè)策略和實(shí)現(xiàn)最終得到 應(yīng)用?!?

所以,如果您想在 Linux 上限制授與您的程序的特權(quán),您可以創(chuàng)建完全您自己的安全模塊。如果您利用真正外來的限制,可能會(huì)需要那樣做——幸好這是可能的。不過,這很重要;不管怎樣,您還是要編寫內(nèi)核代碼。如果可能,您最好不要使用已有的 Linux 安全模塊,而是嘗試去編寫自己安全模塊。有一些可用的 LSM 模塊,不過,Security-Enhanced Linux (SELinux)是最成熟的 Linux 安全模塊之一,所以讓我們來研究這個(gè)模塊。

Security-Enhanced Linux(SELinux)的歷史

一個(gè)小歷史將有助于幫助您理解 Security-Enhanced Linux(SELinux)——而且它本身也是段有趣的歷史。美國國家安全局(National Security Agency,NSA)長時(shí)間以來就關(guān)注大部分操作系統(tǒng)中受限的安全能力。畢竟,他們的工作之一就是要確保美國國防部使用的計(jì)算機(jī)在面臨沒完沒了的攻擊時(shí)保持安全。NSA 發(fā)現(xiàn)大部分操作系統(tǒng)的安全機(jī)制,包括 Windows 和大部分 UNIX 和 Linux 系統(tǒng),只實(shí)現(xiàn)了“選擇性訪問控制(discretionary access control)”(DAC)機(jī)制。DAC 機(jī)制只是根據(jù)運(yùn)行程序的用戶的身份和文件等對(duì)象的所有者來決定程序可以做什么。NSA 認(rèn)為這是一個(gè)嚴(yán)重的問題,因?yàn)?DAC 本身對(duì)脆弱的或惡意的程序來說是一個(gè)不合格的防護(hù)者。取而代之的,NSA 長期以來一直希望操作系統(tǒng)同樣能支持“強(qiáng)制訪問控制(mandatory access control)”(MAC)機(jī)制。

MAC 機(jī)制使得系統(tǒng)管理員可以定義整個(gè)系統(tǒng)的安全策略,這個(gè)策略可以基于其他因素,像是用戶的角色、程序的可信性及預(yù)期使用、程序?qū)⒁褂玫臄?shù)據(jù)的類型等等,來限制程序可以做哪些事情。一個(gè)小例子,有了 MAC 后用戶不能輕易地將“保密的(Secret)”數(shù)據(jù)轉(zhuǎn)化為“不保密的(Unclassified)”的數(shù)據(jù)。不過,MAC 實(shí)際上可以做的比那要多得多。

NSA 已經(jīng)與操作系統(tǒng)提供商合作了多年,但是很多占有最大市場(chǎng)的提供商對(duì)于將 MAC 集成進(jìn)來沒有興趣。即使是那些集成了 MAC 的提供商也通常是將其做為“單獨(dú)的產(chǎn)品”,而不是常規(guī)產(chǎn)品。一部分原因只是因?yàn)榕f式的 MAC 不夠靈活。

于是 NSA 的研究力量盡力去使 MAC 更靈活并且并容易被包含在操作系統(tǒng)中。他們使用 Mach 操作系統(tǒng)開發(fā)了他們的思想的原型,后來發(fā)起的工作擴(kuò)展了“Fluke”研究操作系統(tǒng)。

不過,難以讓人們信服這些思想可以適用于 “真實(shí)的”操作系統(tǒng) ,因?yàn)樗羞@些工作都基于微型的“玩具級(jí)的”研究項(xiàng)目。極少可以在原型之外進(jìn)行嘗試以查看這些思想在真實(shí)的應(yīng)用程序中工作得如何。NSA 不能說服具有所有權(quán)的提供商來添加這些思想,而且 NSA 也沒有權(quán)利去修改私有的操作系統(tǒng)。這不是個(gè)新問題;多年前 DARPA 試圖強(qiáng)制它的操作系統(tǒng)研究人員使用私有的操作系統(tǒng) Windows,但遇到了很多問題(參見下面的 參考資料)。

于是,NSA 偶然發(fā)現(xiàn)了一個(gè)回想起來似乎顯而易見的想法:使用一個(gè) 不是 玩具的開放源代碼操作系統(tǒng),并實(shí)現(xiàn)他們的安全思想,以顯示(1)它可以工作,(2)它具體如何工作(通過為所有人提供源代碼)。他們選擇了主導(dǎo)市場(chǎng)的開放源代碼內(nèi)核(Linux)并在其中實(shí)現(xiàn)了他們的思想,即“security-enhanced Linux”(SELinux)。毫無意外,使用真正的系統(tǒng)(Linux)讓 NSA 研究人員可以處理他們?cè)谕婢咧袩o法處理的問題。例如,在大部分基于 Linux 的系統(tǒng)中,幾乎所有都是動(dòng)態(tài)鏈接的,所以他們不得不做一些關(guān)于程序如何執(zhí)行的深入分析(查閱他們關(guān)于“entrypoint”和 “execute”權(quán)限的文檔以獲得更多資料)。這是一個(gè)更為成功的方法;正在使用 SELinux 的人比使用先前的原型的人多得多。

SELinux 如何工作

那么,SELinux 如何工作呢?SELinux 的方法實(shí)際上非常普通。每一個(gè)重要的內(nèi)核對(duì)象,比如每個(gè)文件系統(tǒng)對(duì)象和每個(gè)進(jìn)程,都有一個(gè)關(guān)聯(lián)到它們的“安全上下文(security context)”。安全上下文可以基于軍事安全層級(jí)(如不保密的、保密的和高度保密的)、基于用戶角色、基于應(yīng)用程序(這樣,一個(gè) Web 服務(wù)器可以擁有它自己的安全上下文),或者基于很多其他內(nèi)容。當(dāng)它執(zhí)行另一個(gè)程序時(shí),進(jìn)程的安全上下文可以改變。甚至,取決于調(diào)用它的程序,一個(gè)給定的程序可以在不同的安全上下文中運(yùn)行,即使是同一個(gè)用戶啟動(dòng)了所有程序。

然后系統(tǒng)管理員就可以創(chuàng)建一個(gè)指定哪些特權(quán)授與哪個(gè)安全上下文的“安全策略(security policy)”。當(dāng)發(fā)生系統(tǒng)調(diào)用時(shí),SELinux 去檢查是否所有需要的特權(quán)都已經(jīng)授與了——如果沒有,它就拒絕那個(gè)請(qǐng)求。

例如,要?jiǎng)?chuàng)建一個(gè)文件,當(dāng)前進(jìn)程的安全上下文必須對(duì)父目錄的安全上下文的“搜索(search)”和“add_name”特權(quán),而且它需要有對(duì)于(要?jiǎng)?chuàng)建的)文件的安全上下文的“創(chuàng)建(create)”特權(quán)。同樣,那個(gè)文件的安全上下文必須有特權(quán)與文件系統(tǒng)“關(guān)聯(lián)(associated)”(所以,舉例來說,“高度保密”的文件不能寫到一個(gè)“不保密”的磁盤)。還有用于套接字、網(wǎng)絡(luò)接口、主機(jī)和端口的網(wǎng)絡(luò)訪問控制。如果安全策略為那些全部授與了權(quán)限,那么請(qǐng)求就會(huì)被 SELinux 所允許。否則,就會(huì)被禁止。如果按部就班地去做所有這些檢查將會(huì)較慢,不過有很多優(yōu)化方案(基于多年的研究)使其變得很迅速。

這一檢查完全獨(dú)立于類 UNIX 系統(tǒng)中的通常的權(quán)限位;在 SELinux 系統(tǒng)中,您必須 既 有標(biāo)準(zhǔn)的類 UNIX 權(quán)限, 又 有 SELinux 權(quán)限才能去做一些事情。不過,SELinux 檢查可以做很多對(duì)傳統(tǒng)的類 UNIX 權(quán)限來說難以完成的事情。

使用 SELinux,您可以方便地創(chuàng)建一個(gè)只能運(yùn)行特定程序并且只能在特定的上下文中寫文件的 Web 服務(wù)器。更有趣的是,如果一個(gè)攻擊者攻入了 Web 服務(wù)器并成為 root,攻擊者不會(huì)獲得整個(gè)系統(tǒng)的控制權(quán)——如果有一個(gè)好的安全策略的話。

那就有了困難:為了使 SELinux 有效,您需要有一個(gè)好的安全策略來由 SELinux 執(zhí)行。大部分用戶將需要一個(gè)他們?nèi)菀仔薷牡膶?shí)用的初始策略。幾年前我開始體驗(yàn) SELinux;那時(shí),初始策略還不成熟,有很多問題。例如,在那些以前的日子中我發(fā)現(xiàn)早期的樣例策略不允許系統(tǒng)更新硬件時(shí)鐘(最后我提交了一個(gè)補(bǔ)丁以解決這一問題)。設(shè)計(jì)好的初始安全策略類似對(duì)產(chǎn)品分類, NSA 希望由商業(yè)界來做,而且看起來是要這樣做。Red Hat、一些 Debian 開發(fā)者、Gentoo 以及其他人正在使用基本的 SELinux 框架,并且正在創(chuàng)建初始安全策略,這樣用戶可以馬上開始使用它。的確,Red Hat 計(jì)劃為所有用戶在他們的 Fedora 內(nèi)核中都啟用 SELinux,并提供簡(jiǎn)單的工具來使得非專業(yè)用戶可以通過選擇一些常見選項(xiàng)來修改他們的安全策略。Gentoo 有一個(gè)可引導(dǎo)的 SELinux LiveCD。這些團(tuán)體將使得最小化程序特權(quán)變得更簡(jiǎn)單,而不需要大量代碼。

在這里我們又回到了原處。SELinux 只有當(dāng)程序執(zhí)行時(shí)才允許發(fā)生安全傳輸,它控制進(jìn)程的權(quán)限(不是一個(gè)進(jìn)程的一部分)。所以,為了充分發(fā)揮 SELinux 的潛力,您需要將您的應(yīng)用程序分解為獨(dú)立的進(jìn)程和程序,只有一些小的有特權(quán)的組件—— 這恰恰如同如何在沒有 SELinux 的情況開發(fā)安全的程序。像 SELinux 這樣的工具讓您可以更好地控制授與的權(quán)限,并這樣創(chuàng)建一個(gè)更強(qiáng)有力的防御,但是,您仍需要將您的程序拆分為更小的組件,以使得那些控制能發(fā)揮最大的效用。

結(jié)束語

最小化特權(quán)是對(duì)各種安全問題的最重要防御。由于缺陷是不可避免的,您會(huì)希望大大降低缺陷導(dǎo)致安全問題的可能性。不過,至少一個(gè)安全的程序的 一些 部分必須有涉及安全的代碼,所以您不能只是最小化特權(quán)而忽視所有其他。甚至在您已經(jīng)最小化了那些涉及安全的部分以后,那些部分還是必須是正確的。為了是正確的,您需要避免常見的錯(cuò)誤。

 

 

 

 

責(zé)任編輯:Oo小孩兒 來源: pcdog.com
相關(guān)推薦

2021-04-13 16:00:54

加密貨幣數(shù)據(jù)貨幣

2009-08-14 10:35:25

C#最小化編寫

2018-11-16 06:05:42

2023-01-04 00:09:31

2021-09-29 10:03:52

物聯(lián)網(wǎng)安全網(wǎng)絡(luò)攻擊IOT

2022-06-01 08:00:00

開發(fā)成本功能

2013-05-31 09:26:11

云宕機(jī)SLA云應(yīng)用彈性

2015-09-18 09:23:34

云APIAPI升級(jí)云服務(wù)中斷

2017-02-08 15:13:57

2011-03-07 10:12:02

GNOME SHELL

2011-04-13 11:11:36

VC++托盤程序

2011-01-19 14:40:45

Thunderbird

2025-04-25 09:35:39

WinformWindows系統(tǒng)托盤

2011-10-31 10:21:05

2015-10-29 10:09:57

混合云影子IT SaaS

2023-04-03 10:20:16

JavaScript前端Alpine.js

2011-12-20 12:55:42

重慶雙贏俠諾

2023-10-18 11:01:07

GNOME按鈕

2011-01-18 10:35:02

Linuxsocket性能

2022-03-28 17:10:18

樹莓派服務(wù)器舊硬件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)