NSA:Configuring the SELinux Policy

 

http://www.nsa.gov/research/_files/selinux/papers/policy2/t1.shtml

配置SELinux策略

策略語言和策略示例(Example Policy)配置

策略配置文件使用的是簡單聲明語言。策略示例採用這種語言,來示範SELinux如何達到某種安全目的,這給了用戶一個起點。
本節使用示例配置來告訴你什麼是策略語言。同時告訴你如何邏輯地分離上下文配置。關於MLS、附加的策略聲明支持本節當中沒有涉及。

策略語言的完整語法明確規定於policy_parse.y yacc文件中(包含在checkpolicy命令的源碼包中)。本節包含了這一語法的摘要,旨在其可讀性,並忽略了一些過時了的元素。策略配置的源文件位於/etc/selinux/(targeted|strict)/src/policy目錄。由於m4宏在策略示例中廣泛的使用,本節會描述一些通用的宏。這些宏定義可以在policy/macros/global_macros.te或者policy/macros/core_macros.te文件中找到,除非特別說明。

一個策略配置文件包含了以下幾個頂級組成部分:Flask定義, TE、RBAC的聲明和規則, 用戶聲明, 約束定義, 以及安全上下文的規範。
Flask的定義在Flask Definitions這節中已做過討論。
TE、RBAC的聲明和規則指明瞭TE、RBAC模型的策略邏輯。
用戶聲明定義了用戶,爲特定的角色認證用戶。
約束定義指明瞭權限的附加約束,可以將用戶標識、TE、RBAC模型聯繫起來。
安全上下文規範爲某些實體提供安全上下文,如初始化SID、未標籤的文件系統、網絡對象。
一個策略的頂級:
policy -> flask te_rbac users opt_constraints contexts

TE和RBAC配置一覽

TE和RBAC配置文件聲明瞭角色、域、類型,爲TE和RBAC模型定義了標籤、訪問向量(Access Vector)規則。策略語言允許TE和RBAC配置自由地混合編寫。TE和RBAC聲明和規則如下所示:
te_rbac -> te_rbac_statement | te_rbac te_rbac_statement
te_rbac_statement -> te_statement | rbac_statement
te_statement -> attrib_decl |
                type_decl |
                type_transition_rule |
                type_change_rule |
                te_av_rule |
                te_assertion
rbac_statement -> role_decl |
                  role_dominance |
                  role_allow_rule
TE聲明可以是一個屬性聲明、類型聲明、類型過渡規則、類型變化規則、訪問向量規則,或者是一個命題。
RBAC聲明可以是一個角色聲明、role dominance聲明,或者是一個角色允許規則。

TE聲明

屬性聲明

類型屬性是一個標識符,用於標識一組具有相似屬性的類型。每個類型可以有多個屬性,每個屬性可以和多個類型關聯。在類型聲明中定義了屬性與類型的聯繫,這將在下節探討。若在類型定義中使用了某個屬性,該屬性應該明確的聲明過。屬性定義的語法如下:
attrib_decl -> ATTRIBUTE identifier ';'
一些屬性聲明的例子如下所示:
attribute domain;
attribute privuser;
attribute privrole;

類型聲明

TE配置語言要求定義每個類型。每個類型聲明爲類型指明瞭一個Primary Name,和可選的別名、屬性。類型聲明的預防如下:
type_decl -> TYPE identifier opt_alias_def opt_attr_list ';'
opt_alias_def -> ALIAS aliases | empty
aliases -> identifier | '{' identifier_list '}'
identifier_list -> identifier | identifier_list identifier
opt_attr_list -> ',' attr_list | empty
attr_list -> identifier | attr_list ',' identifier
在TE配置中,可以使用別名替換Primary Name。運行期間,策略示例總是在返回SID給安全上下文時,使用Primary Name來表示類型。一個應用程序可以在需要一個上下文的SID時,使用Primary Name或者其別名來標識類型。Primary Name和別名存在於同一個名字空間中,且必須各自唯一。
也可以使用typealias和typeattribute關鍵字來在單獨的一行聲明別名。語法如下:
typealias_decl -> TYPEALIAS identifier ALIAS aliases ';'
typeattribute_decl -> TYPEATTRIBUTE identifier attr_list ';'
一些在策略示例中與shell守護進程相關的類型聲明如下:
type sshd_t, domain, privuser, privrole, privlog, privowner;
type sshd_exec_t, file_type, exec_type, sysadmfile;
type sshd_tmp_t, file_type, sysadmfile, tmpfile;
type sshd_var_run_t, file_type, sysadmfile, pidfile;
sshd_t類型是一個守護進程的域。sshd_exec_t類型是sshd可執行文件的類型。sshd_tmp_t類型是臨時文件及PID文件的類型,它由守護進程分別生成。每個類型都有一些關聯的屬性在TE配置文件的規則中使用。

TE過渡規則
TE過渡規則指明瞭進程新的域和新的文件類型。換句話說,定義TE過渡規則需要指明一對類型及一個類。對一個進程來說,作爲第一個類型,也被稱爲源類型;第二個類型,即可執行文件的類型,也被稱爲目標類型。對於一個對象來說,源類型是創建對象本身進程的域,目標類型是對象本身的類,這就好像目錄對於目錄中文件的關係。一個進程或對象的TE過渡規則語法如下:
type_transition_rule -> TYPE_TRANSITION source_types target_types ':' classes new_type ';'
source_types -> set
target_types -> set
classes -> set
new_type -> identifier
set -> '*' | identifier | '{' identifier_list '}' | '~' identifier | '~' '{' identifier_list '}'
TE過渡規則的源/目標類型可以是一組的類型。波浪號(~)可以表示一個補集。*號可以代表所有的類型或類。如果多條規則需要給出一對類型和類,編譯器將給出一個警告,並且使用最後一條規則。
一些來自策略示範中的TE過渡規則如下,它們與shell的守護進程相關:
type_transition initrc_t sshd_exec_t:process sshd_t;
type_transition sshd_t tmp_t:{ dir file lnk_file
                               sock_file fifo_file } sshd_tmp_t;
type_transition sshd_t shell_exec_t:process user_t;
initrc_t類型是init進程運行/etc/rc.d腳本時進入的域。
第一條規則指明瞭該域在執行類型爲sshd_exec_t的程序時,應該過渡成sshd_t域。tmp_t類型是/tmp目錄的類型。
第二條規則指明瞭當sshd_t域在tmp_t類型的目錄中創建了一個文件,這個新文件應被標記爲sshd_tmp_t類型。
shell_exec_t類型是shell程序的類型。最後一條規則指明瞭sshd_t域應該在執行shell_exec_t類型的程序時過渡到user_t域。
TE過渡規則在定義一個新類型時,通常需要一組關聯的類,例如所有文件的類。表2中是一組爲關聯類預定義的宏,可以如下使用它們:
type_transition sshd_t tmp_t:notdevfile_class_set sshd_tmp_t;
type_transition cardmgr_t tmp_t:devfile_class_set cardmgr_dev_t;

表二:類的宏(Class Macros)
dir_file_class_set      所有目錄及文件的類
file_class_set          所有文件的類,不包括目錄
notdevfile_class_set    非設備文件的類
devfile_class_set       設備文件的類
socket_class_set        所有套接字的類
dgram_socket_class_set  數據報套接字的類
stream_socket_class_set 流套接字的類
unpriv_socket_class_set 無特權套接字的類,不包括rawip、netlink、packet、key

由於每個過渡規則需要一組相應的訪問向量規則來認證操作,宏支持自動將TE標記規則和TE訪問規則展開來,代替直接定義TE過渡規則。domain_auto_trans宏定了域的過渡,file_type_auto_trans宏爲文件定義過渡。
domain_auto_trans宏將當前域、程序的域、新的域作爲其參數。
file_type_auto_trans宏將父目錄類型,新文件類型,以及可選的一組類(默認爲非設備文件類)作爲其參數。
在之前小節中展示過一組初始化過渡類型使用了這些宏,它們在示例策略中定義,如下:
domain_auto_trans(initrc_t, sshd_exec_t, sshd_t)
file_type_auto_trans(sshd_t, tmp_t, sshd_tmp_t)
domain_auto_trans(sshd_t, shell_exec_t, user_t)

TE變化規則

除了支持TE過渡規則,TE配置語言也允許TE變化規則。這些規則不被內核使用,但是security-aware applications可以通過調用security_compute_relabel函數使用這些規則。一個TE變化規則定義了用於重標記進程安全上下文操作新的類型、對象的當前類型、對象的類。在示例策略中,這些規則定義了當系統的守護進程爲用戶會話重標記終端設備時的使用類型。其語法同TE過渡規則相似,除了使用type_change關鍵字。一些TE變化的示例如下:
type_change user_t tty_device_t:chr_file user_tty_device_t;
type_change sysadm_t tty_device_t:chr_file sysadm_tty_device_t;
type_change user_t sshd_devpts_t:chr_file user_devpts_t;
type_change sysadm_t sshd_devpts_t:chr_file sysadm_devpts_t;
前兩條規則定義了用戶和管理員使用常規終端設備登錄時的類型。當創建一個本地用戶會話時,登錄進程使用前兩條規則。
後兩條規則定義了用戶和管理員使用由sshd最初分配的遠程登錄設備登錄時的類型。

TE訪問向量規則

TE訪問向量規則定義了一組基於一對類型和類的權限。這些規則定義了TE訪問矩陣。規則可以定義各種訪問向量,包括allowed、auditallow、auditdeny向量。訪問向量規則的語法爲:
te_av_rule -> av_kind source_types target_types ':' classes permissions ';'
av_kind -> ALLOW | AUDITALLOW | DONTAUDIT
source_types -> set
target_types -> set
classes -> set
permissions -> set
set -> '*' | identifier | nested_id_set | '~' identifier | '~' nested_id_set | identifier '-' identifier
nested_id_set -> '{' nested_id_list '}'
nested_id_list -> nested_id_element | nested_id_list nested_id_element
nested_id_element -> identifier | '-' identifier | nested_id_set
比較TE過渡規則,該語法是允許多條TE訪問向量規則的簡潔規範,通過幾組可選的源類型、目標類型、類、權限。類屬性名可以在任何類型字段使用。波浪號字符和型號字符可以用在任何字段。也可以使用減號字符表示在某個集合中去掉某個類型或類型的屬性。例如file_type - shadow_t將通配所有含file_type屬性的類型,除了shadow_t。self標識符可以用在目標類型的字段,表明規則應該被應用在每個源類型和本身之間。
一些在策略示例中和shell守護進程相關的訪問向量規則如下:
allow sshd_t sshd_exec_t:file { read execute entrypoint };
allow sshd_t sshd_tmp_t:file { create read write getattr setattr link unlink rename };
allow sshd_t user_t:process transition;
第一條規則定義了sshd_t域可以讀、執行、進入(entrypoint)sshd_exec_t類型的文件。
第二條規則定義了域可以創建和訪問sshd_tmp_t類型的文件;
第三條規則定義了域可以過渡到user_t域;
比較TE過渡規則,類的宏可以用在TE訪問向量的類字段。使用這個宏來屏蔽非計劃的訪問時需要注意,例如在規則中使用file_class_set宏而不是notdevfile_class_set宏將會允許所有文件的類,包括設備文件。SELinux爲每個類定義了大量細粒化的權限,宏也定義了通用的權限的組織。一些宏列在了表三表四表五里。
在TE過渡規則中使用權限字段:
allow sshd_t sshd_tmp_t:notdevfile_class_set create_file_perms;
allow sshd_t sshd_tmp_t:dir create_dir_perms;

表三:文件權限宏
stat_file_perms調用stat函數或訪問文件
x_file_perms執行文件
r_file_perms讀文件
rx_file_perms讀和執行文件
rw_file_perms讀和寫文件
ra_file_perms讀和插入文件
link_file_perms鏈接、取消鏈接或重命名文件
create_file_perms創建、訪問、刪除文件
r_dir_perms讀和搜索目錄
rw_dir_perms讀和修改目錄
ra_dir_perms讀和增加入口給目錄
create_dir_perms創建、訪問、刪除目錄
mount_fs_perms掛載和卸載文件系統

表四:套接字權限的宏
rw_socket_perms使用套接字
create_socket_perms創建和使用套接字
rw_stream_socket_perms使用流套接字
create_stream_socket_perms創建和使用流套接字

表五:IPC權限宏
r_sem_perms讀信號量
rw_sem_perms創建和使用信號量
r_msgq_perms讀消息隊列
rw_msgq_perms創建和使用消息隊列
r_shm_perms讀共享內存
rw_shm_perms Permissions創建和使用共享內存
使用宏還能自動展開:
domain_auto_trans(sshd_t, shell_exec_t, user_t)
domain_trans(sshd_t, shell_exec_t, sysadm_t)

表六:宏接口
general_domain_access
general_proc_read_access
base_file_read_access
uses_shlib
can_network
domain_trans and domain_auto_trans
file_type_trans and file_type_auto_trans
can_exec
can_exec_any
can_unix_connect
can_unix_send
can_sysctl
can_create_pty
can_create_other_pty

TE訪問向量命題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章