黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

FreeBSD 5.0中強(qiáng)制訪問(wèn)控制機(jī)制的使用與源代碼

系統(tǒng) 2960 0

本文主要講述 FreeBSD 5.0 操作系統(tǒng)中新增的重要安全機(jī)制,即強(qiáng)制訪問(wèn)控制機(jī)制( MAC )的使用與源代碼分析,主要包括強(qiáng)制訪問(wèn)控制框架及多級(jí)安全( MLS )策略兩部分內(nèi)容。這一部分講述要將 MAC 框架與 MLS 策略用起來(lái),應(yīng)該做的一些工作,以及如何有效使用它們的問(wèn)題。

?

強(qiáng)制訪問(wèn)控制(英文縮寫(xiě) MAC )是實(shí)現(xiàn)操作系統(tǒng)安全的一個(gè)重要的方法,現(xiàn)在幾乎所有的安全操作系統(tǒng)都采用強(qiáng)制訪問(wèn)控制作為其核心安全機(jī)制之一。強(qiáng)制訪問(wèn)控制是對(duì)操作系統(tǒng)的各種客體(如文件、 socket 、系統(tǒng) FIFO SCD IPC 等)進(jìn)行細(xì)粒度的訪問(wèn)控制,即當(dāng)用戶或用戶程序訪問(wèn)系統(tǒng)的某個(gè)客體時(shí),強(qiáng)制訪問(wèn)控制機(jī)制對(duì)這種訪問(wèn)的安全性進(jìn)行檢查。與自主訪問(wèn)控制不同,強(qiáng)制訪問(wèn)控制對(duì)用戶及用戶程序的行為進(jìn)行限制,從而達(dá)到更高的安全級(jí)別。

?

強(qiáng)制訪問(wèn)控制是一種機(jī)制,它對(duì)用戶與用戶程序?qū)腕w的訪問(wèn)進(jìn)行檢查,但什么樣的訪問(wèn)是安全的呢?這就需要引入安全策略的概念。安全策略可以認(rèn)為是一組檢查條件,它為每次訪問(wèn)的主體(用戶或用戶程序)和被訪問(wèn)的客體(如文件等)定義一個(gè)安全標(biāo)記,再根據(jù)主體和客體的安全標(biāo)記來(lái)決定這次訪問(wèn)是否安全。目前已經(jīng)開(kāi)發(fā)出多種安全策略,其中 MLS 用得最多。 MLS 是多級(jí)安全的意思,它最早用于軍事領(lǐng)域。它的基本思想是定義一些安全級(jí),如從低到高分普通、機(jī)密、絕密等安全級(jí),要求高安全級(jí)別的信息不能泄露給低安全級(jí)別的用戶,這樣就要求低安全級(jí)的主體不能讀高安全級(jí)的客體,同時(shí)高安全級(jí)的主體不能寫(xiě)低安全級(jí)的客體。詳情請(qǐng)參見(jiàn)有關(guān)資料。

?

Linux 一樣, FreeBSD 系統(tǒng)是開(kāi)放源代碼的操作系統(tǒng),而且 FreeBSD 的結(jié)構(gòu)清晰,安全性好,所以使用也很廣泛。從 5.0RC2 版開(kāi)始, FreeBSD 內(nèi)核開(kāi)始引入強(qiáng)制訪問(wèn)控制機(jī)制。它在內(nèi)核中實(shí)現(xiàn)了一個(gè)靈活通用 MAC 框架,這個(gè)框架對(duì) FreeBSD 內(nèi)核中幾乎所有的核心對(duì)象進(jìn)行了訪問(wèn)控制,并且這個(gè)框架設(shè)計(jì)合理、接口簡(jiǎn)潔,使得我們可以很方便地開(kāi)發(fā)各種安全策略模塊并將之掛接到系統(tǒng),從而按我們自己的策略對(duì)系統(tǒng)進(jìn)行安全控制。另外,系統(tǒng)還提供了包括 MLS 策略模塊在內(nèi)的多個(gè)策略模塊供我們選用。

?

本文從使用與源代碼的分析這兩方面詳細(xì)講述 FreeBSD 系統(tǒng)中的強(qiáng)制訪問(wèn)控制機(jī)制,內(nèi)容主要包括 MAC 框架和 MLS 策略,相信會(huì)對(duì)對(duì)此部分內(nèi)容感興趣的朋友有所啟發(fā)。

1 FreeBSD 5.0中強(qiáng)制訪問(wèn)控制機(jī)制的使用

FreeBSD 5.0 RC2 版本發(fā)布時(shí),內(nèi)核源代碼中已經(jīng)包含了 MAC 框架和一些 MAC 策略模塊(如 MLS 策略模塊、用于開(kāi)發(fā)及實(shí)驗(yàn)的 MAC_NONE 策略模塊、完整性模塊 MAC_BIBA 等),但是這個(gè)版本的內(nèi)核并沒(méi)有正式對(duì) MAC 提供支持,所以缺省情況下,在編譯內(nèi)核的時(shí)候沒(méi)有把實(shí)現(xiàn) MAC 框架的代碼編譯進(jìn)去。另外,我們將以 MLS 策略為例,說(shuō)明怎樣利用 MAC 框架加載策略模塊。為了讓 MLS 策略真正實(shí)用,還需要配置系統(tǒng)的擴(kuò)展文件屬性等,我們將對(duì)之進(jìn)行一定的介紹。最后我們將介紹如通過(guò)控制臺(tái)命令以及在程序中如何使用系統(tǒng)調(diào)用接口對(duì)文件或進(jìn)程的 MAC 標(biāo)記進(jìn)行操作。

1.1 重新編譯內(nèi)核

如上所述,由于 FreeBSD 5.0 RC2 版中的 MAC 框架還處于開(kāi)發(fā)階段,所以缺省情況下,內(nèi)核二進(jìn)制代碼中并沒(méi)有包括對(duì) MAC 框架的支持。要使內(nèi)核支持 MAC 框架,必須配置并重新編譯內(nèi)核,具體方法如下。

?

/usr/src/sys/i386/conf 下,把 GENERIC 文件復(fù)制成另一個(gè)文件如 yxd_kernel (不要改動(dòng) GENERIC 文件),然后在 yxd_kernel 文件中找到 makeoptions 這個(gè)部分,仿照已有的格式,添加一行(詳細(xì)信息請(qǐng)參見(jiàn) "FreeBSD Developers' Handbook" 中的 "TrustedBSD MAC FrameWork" 章節(jié)):

?

  options MAC

?

這個(gè)選項(xiàng)將打開(kāi) MAC 編譯開(kāi)關(guān),這樣編譯時(shí)將把相應(yīng)的 MAC 框架代碼編譯進(jìn)內(nèi)核。

?

另外,為了支持文件及目錄的 MAC 標(biāo)記的存儲(chǔ),必須讓內(nèi)核支持?jǐn)U展文件系統(tǒng)(缺省情況下也不支持)。要達(dá)到這個(gè)目的,必須在 yxd_kernel 中加入如下兩個(gè)編譯選項(xiàng):

?

 mac_mls_load = "YES"

?

值得注意的一點(diǎn)是,當(dāng)我們修改并重新編譯了 mac_mls.ko 這個(gè)模塊后,必須把它從 /usr/src/sys/modules/mac_mls 目錄拷貝到 /boot/kernel 目錄,因?yàn)橄到y(tǒng)啟動(dòng)的時(shí)候是從 /boot/kernel 目錄尋找模塊的。

1.3 配置擴(kuò)展文件系統(tǒng)

?

當(dāng)我們做完 1.1 1.2 兩步后, MLS 模塊就已經(jīng)在系統(tǒng)中起作用了,我們可以使用 "getfmac 文件 / 目錄名 " 來(lái)得到文件或目錄的 MAC 標(biāo)記(形如 " 文件 / 目錄名 : mls/low" ,詳細(xì)的介紹請(qǐng)參閱 1.4 節(jié)),但此時(shí)的標(biāo)記是一種偽標(biāo)記,也就是說(shuō),這個(gè)標(biāo)記是 MLS 策略給每個(gè)文件的缺省標(biāo)記,且這個(gè)標(biāo)記在關(guān)閉系統(tǒng)的時(shí)候并沒(méi)有被存儲(chǔ)。但是按照我們的需要,我們希望每個(gè)文件或目錄的 MAC 標(biāo)記應(yīng)該有 " 非易逝性 " 的標(biāo)記,也就是說(shuō)我們希望這個(gè)標(biāo)記與文件一樣被存儲(chǔ)在磁盤(pán)上。這就需要引入擴(kuò)展文件系統(tǒng),使得每個(gè)文件或目錄的 MAC 標(biāo)記存儲(chǔ)在對(duì)應(yīng)文件或目錄的擴(kuò)展屬性中。為了便于理解,下面對(duì) FreeBSD 中的擴(kuò)展文件系統(tǒng)進(jìn)行一點(diǎn)簡(jiǎn)要的介紹。

?

簡(jiǎn)單地說(shuō),擴(kuò)展文件系統(tǒng)是對(duì)現(xiàn)有文件系統(tǒng)的一種擴(kuò)充。擴(kuò)展屬性( EA , Extended Attribute )是相對(duì)于傳統(tǒng)文件系統(tǒng)的 inode 節(jié)點(diǎn)中已存儲(chǔ)的文件或目錄的標(biāo)準(zhǔn)屬性而言的,它可以為 inode 節(jié)點(diǎn)中存儲(chǔ)的文件或目錄增加額外的信息,這些信息再由系統(tǒng)根據(jù) inode 結(jié)點(diǎn)訪問(wèn)到。每個(gè)文件系統(tǒng)的擴(kuò)展屬性( EA )是一組( name value )對(duì)。一個(gè) inode 節(jié)點(diǎn)(文件或目錄)可能定義了某種屬性,也可能沒(méi)有定義。如果 inode 節(jié)點(diǎn)定義了某個(gè)屬性,則它可能包含 0 個(gè),也可能包含多個(gè)字節(jié)的這種屬性的數(shù)據(jù)。這與一般 shell 的環(huán)境變量類似。這樣,擴(kuò)展屬性機(jī)制就為 TrustedBSD 的各種安全特征( ACL MAC 和能力等),提供了存儲(chǔ)訪問(wèn)安全信息的簡(jiǎn)單方法。一些非安全應(yīng)用也可以根據(jù)需要?jiǎng)?chuàng)建擴(kuò)展屬性,例如文件的校驗(yàn)和、密鑰等。擴(kuò)展屬性可以動(dòng)態(tài)地增加新的擴(kuò)展屬性而不必改變文件系統(tǒng)在磁盤(pán)上的存儲(chǔ)格式。

?

如果使用的是 MLS 策略,那么返回的 MAC 標(biāo)記為 mls/[single_mac]([mac_range]) ,其中 mls 為策略名,后面用 "/" 與標(biāo)記數(shù)據(jù)隔開(kāi)。 [single_mac] 為單一的 MAC 標(biāo)記,可能為 "low" "high" "equal" [mac_range] 為一個(gè) MAC 標(biāo)記范圍,往往主體(進(jìn)程)有一個(gè)范圍。一個(gè) MAC 標(biāo)記的例子為: mls/low(low-high) 。

?

在應(yīng)用程序中,可以使用的系統(tǒng)調(diào)用請(qǐng)參見(jiàn) /usr/src/sys/sys/mac.h 文件中 #ifndef _KERNEL 這個(gè)塊中提供的函數(shù)原型,值得注意的是, man page 中的有些接口參數(shù)及返回值類型有誤,請(qǐng)以 mac.h 文件中的類型為準(zhǔn)。

?

下面是幾個(gè)最常用的函數(shù)的使用方法:

  • mac_get_proc , mac_get_file 的用法:

    struct mac myMac;
    char ss[60] = "mls";
    myMac.m_string = ss;
    myMac.m_buflen = 60;
    mac_get_proc(&myMac);
    mac_get_file("/tmp/test",&myMac);

  • mac_set_proc , mac_set_file 的用法:

    struct mac myMac;
    myMac.m_string = "mls/high";
    myMac.m_buflen = strlen(myMac.m_string);
    mac_set_proc(&myMac);
    mac_set_file("/tmp/test",&myMac);

1.5 小結(jié)

由于 FreeBSD 5.0RC2 版才剛剛開(kāi)始非正式地支持 MAC ,所以針對(duì)普通用戶而言,要將其真正用起來(lái),要做的工作還比較多比較煩瑣的。對(duì)于 MLS 策略而言,還有很多值得完善的地方,比如現(xiàn)有的 MLS 策略不支持對(duì)用戶設(shè)置 MAC 標(biāo)記,主體對(duì)客體訪問(wèn)的時(shí)候限制過(guò)多,還有 MLS 不支持可信進(jìn)程等等,都是下一個(gè)版本需要完善的。

?

在使用上,從我個(gè)人的使用經(jīng)驗(yàn)來(lái)看,比較不好用。當(dāng)然,這個(gè)問(wèn)題不能全怪系統(tǒng), MLS 策略導(dǎo)致易用性降低已經(jīng)是不爭(zhēng)的事實(shí),相信經(jīng)過(guò)一段時(shí)間的開(kāi)發(fā),最終會(huì)給我們一個(gè)滿意的答案。

?

但是瑕不掩玉,撇開(kāi) MLS ,單看 MAC 框架,應(yīng)該說(shuō)是設(shè)計(jì)得很完美的:良好的結(jié)構(gòu)、清晰的邏輯、非常簡(jiǎn)潔的接口,這些優(yōu)點(diǎn)應(yīng)該來(lái)說(shuō)可以給每一個(gè)對(duì)它有興趣的人一個(gè)大大的驚喜。即使是 MLS 策略,由于其作為一個(gè) KLD 模塊來(lái)實(shí)現(xiàn),所以十分便于我們對(duì)它進(jìn)行修改和擴(kuò)充,相信經(jīng)過(guò)一段時(shí)間, MLS 模塊亦會(huì)成為我們的驚喜。如果大家有興趣了解 MAC 框架及 MLS 策略的實(shí)現(xiàn),請(qǐng)接著往下閱讀。

?

本文主要講述 FreeBSD 5.0 操作系統(tǒng)中新增的重要安全機(jī)制,即強(qiáng)制訪問(wèn)控制機(jī)制( MAC )的使用與源代碼分析,主要包括強(qiáng)制訪問(wèn)控制框架及多級(jí)安全( MLS )策略兩部分內(nèi)容。這一部分較系統(tǒng)地對(duì) MAC 框架及 MLS 策略的源代碼進(jìn)行分析。

2 MAC框架與MLS策略源代碼分析

與本文相關(guān)的源代碼文件主要有兩個(gè),即 /usr/src/sys/kern/kern_mac.c /usr/src/sys/security/mac_mls/mac_mls.c 。另外還有一些頭文件如 mac.h 、 mac_policy.h 等。

2.1 MAC框架整體結(jié)構(gòu)

?

下面是 MAC 框架的示意性結(jié)構(gòu)圖,當(dāng)用戶控制臺(tái)或用戶程序通過(guò)系統(tǒng)調(diào)用對(duì)內(nèi)核對(duì)象進(jìn)行訪問(wèn)的時(shí)候,由于內(nèi)核代碼中相應(yīng)的位置插入了 MAC 框架的檢查函數(shù),于是內(nèi)核就會(huì)調(diào)用 MAC 框架的相應(yīng)檢查函數(shù)來(lái)做安全性檢查。 MAC 框架會(huì)依次調(diào)用每個(gè)掛接在 MAC 框架上的安全策略,以決定訪問(wèn)是否安全。另外,其它可能涉及到安全問(wèn)題的系統(tǒng)事件,如初始化各種安全標(biāo)記、初始化各種內(nèi)核對(duì)象等,也會(huì)通知 MAC 框架,由它做出相應(yīng)的處理。

?

從圖中我們也可以看到,安全策略作為一個(gè)獨(dú)立的 KLD 模塊,可以獨(dú)立于內(nèi)核進(jìn)行編譯,再在使用的時(shí)候掛接到 MAC 框架上。要判斷一次訪問(wèn)是否安全, MAC 框架會(huì)調(diào)用所有的安全策略,只有當(dāng)所有的安全策略均表示同意, MAC 框架才會(huì)授權(quán)這次訪問(wèn)。

FreeBSD 5.0中強(qiáng)制訪問(wèn)控制機(jī)制的使用與源代碼分析

2.2 安全標(biāo)記

?

安全標(biāo)記是由 MAC 框架和各個(gè)安全策略定義的一組數(shù)據(jù),用于描述主體或客體的安全信息,安全標(biāo)記與內(nèi)核描述主客體的其它數(shù)據(jù)一起存儲(chǔ)在內(nèi)核中。要實(shí)現(xiàn)強(qiáng)制訪問(wèn)控制,首先必須為主客體定義安全標(biāo)記。不同的策略由于判斷的依據(jù)不一樣,可能定義的標(biāo)記也不相同。作為 MAC 框架,當(dāng)安全策略向它注冊(cè)的時(shí)候,它必須把該策略使用的安全標(biāo)記附加到各個(gè)內(nèi)核對(duì)象上去,這樣當(dāng)需要調(diào)用該策略做安全性檢查的時(shí)候,才能為策略提供它們自己定義和理解的安全標(biāo)記。我們先給出 MAC 框架與 MLS 策略定義的安全標(biāo)記,再對(duì)之作進(jìn)一步的解釋。

?

MAC 框架中安全標(biāo)記的定義是這樣的:

?

struct label {
  int l_flags;
  union {
    void  *l_ptr;
    long   l_long;
  }  l_perpolicy[MAC_MAX_POLICIES];
};

?

其中 l_flags 是一個(gè)標(biāo)志,被 MAC 框架用來(lái)判斷是否初始化了整個(gè)標(biāo)記數(shù)據(jù)結(jié)構(gòu)。 l_perpolicy 數(shù)組為每個(gè)策略定義了一個(gè)聯(lián)合,這樣當(dāng)策略向 MAC 框架注冊(cè)時(shí),它們既可以用一個(gè) long 類的整數(shù)作為它們自己的安全標(biāo)記,也可以使用聯(lián)合中的指針指向一個(gè)它們自己定義的標(biāo)記數(shù)據(jù)結(jié)構(gòu)。 MLS 策略選擇了后者。

?

MLS 策略定義的安全標(biāo)記是這們的:

?

struct mac_mls_element {
  u_short mme_type;
  u_short mme_level;
  u_char mme_compartments[MAC_MLS_MAX_COMPARTMENTS >> 3];
};
struct mac_mls {
  int     mm_flags;
  struct mac_mls_element mm_single;
  struct mac_mls_element mm_rangelow, mm_rangehigh;
};

?

mac_mls 結(jié)構(gòu)中,定義了一個(gè)單一標(biāo)記( mm_single )和一個(gè)標(biāo)記范圍( mm_rangelow , mm_rangehigh ),主客體既可以使用單一標(biāo)記來(lái)標(biāo)識(shí)單一安全級(jí),也可以使用標(biāo)記范圍來(lái)標(biāo)識(shí)一個(gè)安全級(jí)范圍,還可以同時(shí)使用二者。如第 1 章中我們使用 getfmac 得到的輸出 "mls/high" 表明該文件使用的是值為 "high" 的單一安全標(biāo)記。再比如我們使用 getpmac 得到的輸出 "mls/low(low-high)" 表明進(jìn)程同時(shí)使用了單一標(biāo)記和標(biāo)記范圍。至于究竟使用的是哪種標(biāo)記,由 mm_flags 標(biāo)識(shí)。

?

mac_mls_element 定義一個(gè)標(biāo)記,它定義的標(biāo)記功能很強(qiáng)大,既支持安全類型( mme_type 變量,值為 LOW 、 HIGH EQUAL UNDEFINE ),也支持多達(dá) 256 個(gè)級(jí)別的安全級(jí)(當(dāng) mme_type 的值為 LEVEL 時(shí), mme_level 變量有效,由它定義安全級(jí)),同時(shí)還使用 mme_compartments 數(shù)組支持域( field ),后續(xù)章節(jié)將具體講述 MLS 策略是怎樣使用它所定義的標(biāo)記的。

?

當(dāng)用戶試圖打開(kāi)一個(gè)文件時(shí),內(nèi)核就會(huì)試圖打開(kāi)一個(gè) vnode ,在打開(kāi)之前會(huì)調(diào)用這個(gè)函數(shù),用于檢查主體是否有權(quán)限打開(kāi)這個(gè) vnode 。 MAC_CHECK 宏定義如下:

?

#define MAC_CHECK(check, args...) do {         
  struct mac_policy_conf *mpc;          

  error = 0;             
  MAC_POLICY_LIST_BUSY();          
  LIST_FOREACH(mpc, &mac_policy_list, mpc_list) {    
    if (mpc->mpc_ops->mpo_ ## check != NULL)    
      error = error_select(       
        mpc->mpc_ops->mpo_ ## check (args),  
        error);        
  }               
  MAC_POLICY_LIST_UNBUSY();         
} while (0)

?

我們可以看到,代碼中使用 LIST_FOREACH 宏來(lái)遍歷安全策略鏈表中的每個(gè)策略,然后調(diào)用其在 mpc_ops 中注冊(cè)的檢查函數(shù) mpo_##check 。 mac_policy_ops 這個(gè)結(jié)構(gòu)中定義了很多事件處理函數(shù),進(jìn)行細(xì)粒度的訪問(wèn)控制,限于篇幅,在此不一一列出。這些函數(shù)共分四類:第一類是策略本身的初始化和銷毀函數(shù);第二類是對(duì)安全標(biāo)記的操作函數(shù),包括各種內(nèi)核對(duì)象的安全標(biāo)記的初始化與銷毀函數(shù),以及獲取與設(shè)置安全標(biāo)記的接口函數(shù);第三類是對(duì)文件系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)及進(jìn)程對(duì)象的標(biāo)記進(jìn)行操作的事件處理函數(shù);第四類是檢查對(duì)各個(gè)內(nèi)核對(duì)象的訪問(wèn)是否安全的檢查函數(shù)。詳見(jiàn) mac_policy.h 。

?

2.4 安全策略的注冊(cè)

?

分析 MLS 策略,我們可以發(fā)現(xiàn),安全策略向 MAC 框架注冊(cè)是一件很簡(jiǎn)單的事情。 mac_mls.c 文件中花了大量篇幅定義了所有的事件處理函數(shù),如前所述,這些函數(shù)是安全策略的核心,用于判斷訪問(wèn)的安全性等。定義完這些函數(shù)后,在源代碼的最后,把這些函數(shù)的地址填入 mac_policy_ops 結(jié)構(gòu)中,再用一個(gè) MAC_POLICY_SET 宏把 mac_policy_ops 結(jié)構(gòu)掛接到上面提到的 mac_policy_list 鏈表中去就可以了,如下:

?

MAC_POLICY_SET(&mac_mls_ops, trustedbsd_mac_mls, "TrustedBSD MAC/MLS", MPC_LOADTIME_FLAG_NOTLATE, &mac_mls_slot);

?

mac_policy_modevent 函數(shù)的核心代碼如下:

?

case MOD_LOAD:
    if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
      mac_late) {
      printf("mac_policy_modevent: can't load %s policy "
        "after booting", mpc->mpc_name);
      error = EBUSY;
      break;
    }
    error = mac_policy_register(mpc);
    break;
  case MOD_UNLOAD:
    /* Don't unregister the module if it was never registered. */
    if ((mpc->mpc_runtime_flags & MPC_RUNTIME_FLAG_REGISTERED) != 0)
      error = mac_policy_unregister(mpc);
    else
      error = 0;
    break;

?

當(dāng)模塊被 LOAD 的時(shí)候,會(huì)調(diào)用 mac_policy_register 函數(shù),它首先檢查該模塊是否已注冊(cè),如果沒(méi)有,就會(huì)執(zhí)行下面的代碼: LIST_INSERT_HEAD(&mac_policy_list, mpc, mpc_list);

其中 mpc 為我們上面提到的 mac_policy_conf 結(jié)構(gòu)的地址,這樣到此為止,就把 MLS 策略添加到 MAC 框架的策略列表中去了。

   ?

2.5 MLS策略源代碼分析

?

根據(jù) MLS 策略,高安全級(jí)別的主體不能寫(xiě)低安全級(jí)別的客體,而低安全級(jí)別的主體則不能讀高安全級(jí)別的客體,只有主客體的安全級(jí)別相同,才能既讀又寫(xiě)。 MLS 定義了三種標(biāo)記比較函數(shù):

   ?

mac_mls_dominate_single(a,b) :用于檢查 a 的單一標(biāo)記的安全級(jí)是否高于 b 的單一標(biāo)記的安全級(jí)。這個(gè)函數(shù)主要用于對(duì)內(nèi)核變量的讀、寫(xiě)、查詢等事件進(jìn)行安全性檢查。

?

我們只解釋一下最后一個(gè) case ,即當(dāng) a 、 b 的類型均為 MAC_MLS_TYPE_LEVEL 時(shí),也就是它們都使用一個(gè)數(shù)( 0 254 )標(biāo)識(shí)它們的安全級(jí)時(shí),判斷是如何進(jìn)行的。首先:


#define MAC_MLS_BIT_TEST(b, w) ((w)[(((b) - 1) >> 3)] & (1 << (((b) - 1) & 7)))

?

我們可以看到,在比較二者安全級(jí)之前,對(duì)它們的 mme_compartments 進(jìn)行了位測(cè)試。 mme_compartments 是一個(gè) 256bit 的數(shù)據(jù)(由 uchar[32] 數(shù)組定義),每個(gè) bit 都可以設(shè)置為 1 來(lái)表示該對(duì)象屬于某一個(gè)安全域,當(dāng)然也可以設(shè)置多個(gè) bit 表示這個(gè)對(duì)象屬于多個(gè)安全域。 MLS 要求如果 a 可以訪問(wèn) b 的話, b 所屬的安全域必須要是 a 的子集,否則訪問(wèn)被拒絕。對(duì) mme_compartments 進(jìn)行測(cè)試的目的也即是要判斷 b 中設(shè)置了 1 的那些 bit a 中有否設(shè)置。

?

2.6 對(duì)MAC框架及MLS策略的擴(kuò)充

?

最后我們對(duì) MAC 框架作一點(diǎn)改進(jìn)。前面提過(guò), MAC 框架目前并不支持對(duì)用戶的安全級(jí)進(jìn)行設(shè)置,也沒(méi)有提供存儲(chǔ)用戶安全級(jí)信息的地方,我們想對(duì)之做改進(jìn),以使其更實(shí)用。我們改進(jìn)的思想是,攔截系統(tǒng)的 setuid 系統(tǒng)調(diào)用,在系統(tǒng)作 setuid 的時(shí)候(用戶登錄、運(yùn)行 su 命令等),讀入用戶安全級(jí)別信息并作相應(yīng)設(shè)置。我們做了如下工作:

  • mac_policy.h 文件中的 mac_policy_ops 結(jié)構(gòu)中增加一個(gè)新函數(shù) mpo_get_cred_from_file() ,其參數(shù)和返回值與 mpo_create_cred() 完全一樣。
  • mac_mls.c 文件中增加一個(gè)新函數(shù) mac_mls_get_cred_from_file() ,其參數(shù)和返回值與 mac_mls_create_cred() 完全一樣。在這個(gè)函數(shù)里,增加在內(nèi)核中讀寫(xiě)用戶安全級(jí)配置文件的語(yǔ)句,從而把用戶的安全級(jí)在這里讀到標(biāo)記中。然后在對(duì) mac_policy_ops 結(jié)構(gòu)的設(shè)置語(yǔ)句中,增加一條語(yǔ)句: .mpo_get_cred_from_file = mac_mls_get_cred_from_file 。
  • kern_prot.c 文件中的 setuid() 函數(shù)里 crcopy() 函數(shù)替換為我們自己的 mac_crcopy() 函數(shù),并在調(diào)用這個(gè)函數(shù)之前加一條語(yǔ)句: newcred->cr_uid = uid; 。

   ?

mac_crcopy() 函數(shù)的代碼如下:

?

void mac_crcopy(struct ucred *dest,struct ucred *src)
{
  uid_t uid = dest->cr_uid;
  KASSERT(crshared(dest) == 0,("crcopy of shared ucred"));
  bcopy(&src->cr_startcopy,&dest->cr_startcopy,
    (unsigned)((caddr_t)&src->cr_endcopy -
      (caddr_t)&src->cr_startcopy));
  uihold(dest->cr_uidinfo);
  uihold(dest->cr_ruidinfo);
  if(jailed(dest))
    prison_hold(dest->cr_prison);
#ifdef MAC
  dest->cr_uid = uid;
  mac_get_cred(src,dest);
  dest->cr_uid = src->cr_uid;
#endif
}

修改相應(yīng)的頭文件,并重新編譯內(nèi)核。

2.7 小結(jié)

?

上面分析了 MAC 框架與 MLS 策略的主要內(nèi)容,限于篇幅,我們只給出主要邏輯,如果您想要了解更為詳細(xì)的技術(shù)細(xì)節(jié),請(qǐng)閱讀其源代碼或聯(lián)系我。另外, MAC 框架和 MLS 策略還用到了一些很重要的技術(shù),如系統(tǒng)控制( sysctl )機(jī)制、鎖等,我們也沒(méi)有提到,如有興趣的讀者可以繼續(xù)鉆研。

?

SRC= http://www.fengfly.com/plus/view-34134-1.html

FreeBSD 5.0中強(qiáng)制訪問(wèn)控制機(jī)制的使用與源代碼分析


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論