約束(constraints),是SELinux很有用的特新双仍,它的使用十分普遍。很多時(shí)候桌吃,用戶覺得約束是一種添加到黑名單上朱沃,并使其受限的方法。當(dāng)然前提是默認(rèn)允許茅诱,約束它告訴人們的是在指定情況下這是不允許的逗物。但是在SELinux中,這種感覺是不準(zhǔn)確的瑟俭。SELinux中翎卓,約束更像是過濾器,它遵循白名單的方法摆寄。SELinux中的約束(constraints)是在指定的情況下允許某些操作失暴,不匹配要求的操作則被禁止。
但是話又說回來微饥,如果沒有針對操作定義約束(constraints)锐帜,SELinux是允許操作執(zhí)行的(當(dāng)然需通過其他檢查,比如類型強(qiáng)制規(guī)則)畜号。
約束(constraints)和類型強(qiáng)制(TE)的區(qū)別
類型強(qiáng)制使用安全上下文中的類型字段(第三部分)。不同于類型強(qiáng)制允瞧,約束則在規(guī)則中使用整個(gè)上下文简软,比起域(domains)對于操作更加有針對性蛮拔。比如以下例子:
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ì)被拒絕肛跌。哪怕通過其他的類型強(qiáng)制規(guī)則明確運(yùn)行此操作。
SELinux中的約束
SELinux使用約束來修整它的策略察郁。它的很多特性都是通過約束(constraints)來實(shí)現(xiàn)的衍慎,基于用戶訪問控制(User-based access control)便是其中之一。MLS和MCS很多的規(guī)則也是通過約束來實(shí)現(xiàn)的皮钠。修改約束需要認(rèn)真斟酌稳捆。很多情況下,如果需要修改麦轰,它將會(huì)放入發(fā)布版本的基礎(chǔ)策略中一起構(gòu)建乔夯。
羅列約束
可以使用seinfo工具來顯示系統(tǒng)中的約束。但是它立刻返回的是完全展開的輸出款侵,使用的是數(shù)學(xué)表達(dá)式上的語法末荐。如下所示:
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í)很有可能是約束的限制
- 約束使用白名單方法甲脏,滿足約束則被允許