約束(constraints),是SELinux很有用的特新,它的使用十分普遍。很多時(shí)候,用戶覺(jué)得約束是一種添加到黑名單上,并使其受限的方法。當(dāng)然前提是默認(rèn)允許,約束它告訴人們的是在指定情況下這是不允許的。但是在SELinux中,這種感覺(jué)是不準(zhǔn)確的。SELinux中,約束更像是過(guò)濾器,它遵循白名單的方法。SELinux中的約束(constraints)是在指定的情況下允許某些操作,不匹配要求的操作則被禁止。
但是話又說(shuō)回來(lái),如果沒(méi)有針對(duì)操作定義約束(constraints),SELinux是允許操作執(zhí)行的(當(dāng)然需通過(guò)其他檢查,比如類型強(qiáng)制規(guī)則)。
約束(constraints)和類型強(qiáng)制(TE)的區(qū)別
類型強(qiáng)制使用安全上下文中的類型字段(第三部分)。不同于類型強(qiáng)制,約束則在規(guī)則中使用整個(gè)上下文,比起域(domains)對(duì)于操作更加有針對(duì)性。比如以下例子:
CODE SELinux object identity change constraint
constrain dir_file_class_set{create relabelto relabelfrom}
(
u1 == u2
or t1 ==can_change_object_identity
);
上面看到的是一條約束,它描述了如果兩個(gè)上下文中的SELinux部分一致(u1==u2)或者如果域被分配了can_change_object_identity屬性,則域可以創(chuàng)建、重打標(biāo)簽?zāi)夸浐臀募_@里的屬性可以使用seinfo工具進(jìn)行查詢:
user $seinfo -acan_change_object_identity –x
如果不滿足這些限制,操作將會(huì)被拒絕。哪怕通過(guò)其他的類型強(qiáng)制規(guī)則明確運(yùn)行此操作。
SELinux中的約束
SELinux使用約束來(lái)修整它的策略。它的很多特性都是通過(guò)約束(constraints)來(lái)實(shí)現(xiàn)的,基于用戶訪問(wèn)控制(User-based access control)便是其中之一。MLS和MCS很多的規(guī)則也是通過(guò)約束來(lái)實(shí)現(xiàn)的。修改約束需要認(rèn)真斟酌。很多情況下,如果需要修改,它將會(huì)放入發(fā)布版本的基礎(chǔ)策略中一起構(gòu)建。
羅列約束
可以使用seinfo工具來(lái)顯示系統(tǒng)中的約束。但是它立刻返回的是完全展開(kāi)的輸出,使用的是數(shù)學(xué)表達(dá)式上的語(yǔ)法。如下所示:
user $seinfo --constrain
constrain{ file } { create relabelfrom relabelto }
( u1 u2 == t1 { logrotate_t policykit_auth_t sysadm_t lvm_t rpm_t xdm_t krb5kdc_tnewrole_t portage_t
local_login_trpm_script_t sysadm_passwd_t policykit_t portage_sandbox_t groupadd_t kpropd_tpasswd_t
updpwd_tchfn_t cupsd_t gssd_t httpd_t slapd_t sshd_t udev_t virtd_t puppetmaster_trestorecond_t
setfiles_tkadmind_t sulogin_t useradd_t } == || );
需要記住
- 約束是SELinux策略中完整的部分
- 當(dāng)某些操作被拒絕時(shí),即使有相應(yīng)的TE規(guī)則也被拒絕。此時(shí)很有可能是約束的限制
- 約束使用白名單方法,滿足約束則被允許