S008SELinux的約束操作

weixin_33866037發表於2016-10-18

約束(constraints),是SELinux很有用的特新,它的使用十分普遍。很多時候,使用者覺得約束是一種新增到黑名單上,並使其受限的方法。當然前提是預設允許,約束它告訴人們的是在指定情況下這是不允許的。但是在SELinux中,這種感覺是不準確的。SELinux中,約束更像是過濾器,它遵循白名單的方法。SELinux中的約束(constraints)是在指定的情況下允許某些操作,不匹配要求的操作則被禁止。

但是話又說回來,如果沒有針對操作定義約束(constraints),SELinux是允許操作執行的(當然需通過其他檢查,比如型別強制規則)。
約束(constraints)和型別強制(TE)的區別

型別強制使用安全上下文中的型別欄位(第三部分)。不同於型別強制,約束則在規則中使用整個上下文,比起域(domains)對於操作更加有針對性。比如以下例子:

CODE SELinux object identity change constraint

constrain dir_file_class_set{create relabelto relabelfrom}  
(  
        u1 == u2  
        or t1 ==can_change_object_identity  
);  

上面看到的是一條約束,它描述瞭如果兩個上下文中的SELinux部分一致(u1==u2)或者如果域被分配了can_change_object_identity屬性,則域可以建立、重打標籤目錄和檔案。這裡的屬性可以使用seinfo工具進行查詢:

user $seinfo -acan_change_object_identity –x  

如果不滿足這些限制,操作將會被拒絕。哪怕通過其他的型別強制規則明確執行此操作。

SELinux中的約束

SELinux使用約束來修整它的策略。它的很多特性都是通過約束(constraints)來實現的,基於使用者訪問控制(User-based access control)便是其中之一。MLS和MCS很多的規則也是通過約束來實現的。修改約束需要認真斟酌。很多情況下,如果需要修改,它將會放入釋出版本的基礎策略中一起構建。
羅列約束

可以使用seinfo工具來顯示系統中的約束。但是它立刻返回的是完全展開的輸出,使用的是數學表示式上的語法。如下所示:

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 } ==  || );  

需要記住

  1. 約束是SELinux策略中完整的部分
  2. 當某些操作被拒絕時,即使有相應的TE規則也被拒絕。此時很有可能是約束的限制
  3. 約束使用白名單方法,滿足約束則被允許

參考連結

  1. SELinux/Tutorials/Putting constraints on operations

相關文章