selinux 参考策略的安装以及编写自己的策略模块。
实验环境
- 需要使用python3,2不可以。
- Fedora30或centos7
参考策略安装过程
- https://github.com/TresysTechnology/refpolicy/wiki
- 大体是按照上面的wiki,但是wiki年久失修,有一些错误。
可以在主目录下
# cd ~
# git clone https://github.com/SELinuxProject/refpolicy.git
添加contibuted模块(policy / modules / contrib)
# git submodule init
# git submodule update
编辑build.conf文件以反映要构建的策略, NAME = refpolicy, DISTRO选项需要取消注释并设置为redhat,DIRECT_INITRC应设置为y
# vim ~/refpolicy/src/policy/build.conf
在策略构建位置安装源。
# cd ~/refpolicy
# sudo make install-src
此命令会将整个源文件复制到/etc/selinux/refpolicy/src/policy下
# cd /etc/selinux/refpolicy/src/policy
# make bare
# make conf
# make install
构建初始策略/ booleans.conf和policy / modules.conf文件
此过程还将构建policy / modules / kernel / corenetwork.te / corenetwork.if文件(如果尚未存在)。这些将基于corenetwork.te.in和corenetwork.if.in配置文件的内容(对于这个简单的配置,这些文件不会被编辑)。
# make load
构建策略,将模块添加到存储并安装二进制内核策略及其支持配置文件。
# vim /etc/selinuc/config
编辑/etc/selinuc/config,修改SELINUX=permissive,SELINUXTYPE=refpolicy
需要使用新策略重新启动系统,并在引导时重新标记,以完成交换。
# touch /.autorelabel
# shutdown -r now
构建和安装头文件
代码语言:javascript复制# cd /etc/selinux/refpolicy/src/policy
# make install-headers
生成一个build.conf文件,该文件表示master build.conf文件的内容,并将其放在/ usr / share / selinux / refpolicy / include目录中。
生成反映源的XML文档集,并将其放在/ usr / share / selinux / refpolicy / include目录中。
将用于构建的开发Makefile从策略标头复制到/ usr / share / selinux / refpolicy / include目录。
将支持宏.spt文件复制到/ usr / share / selinux / refpolicy/ include / support目录。这还将包含一个all_perms.spt文件,该文件将包含允许解析所有类和权限的宏。
将模块接口文件(.if)复制到以下相关模块目录:/usr/share/selinux/refpolicy/include/modules
编写自己的策略模块
代码语言:javascript复制cd ~
mkdir myapp
创建四个文件,分别添加下面的内容。
vim myapp.te
vim myapp.if
vim myapp.fc
vim Makefile
↓myapp.te
代码语言:javascript复制policy_module(myapp,1.0)
# Private type declarations
type myapp_t;
type myapp_exec_t;
type myapp_log_t;
type myapp_tmp_t;
domain_type(myapp_t)
domain_entry_file(myapp_t, myapp_exec_t)
logging_log_file(myapp_log_t)
files_tmp_file(myapp_tmp_t)
allow myapp_t myapp_log_t:file append_file_perms;
allow myapp_t myapp_tmp_t:file manage_file_perms;
files_tmp_filetrans(myapp_t,myapp_tmp_t,file)
↓myapp.fc
代码语言:javascript复制/usr/bin/myapp -- gen_context(system_u:object_r:myapp_exec_t,s0)
↓myapp.if
代码语言:javascript复制## <summary>Myapp example policy</summary>
## <desc>
## <p>
## More descriptive text about myapp. The desc
## tag can also use p, ul, and ol
## html tags for formatting.
## </p>
## <p>
## This policy supports the following myapp features:
## <ul>
## <li>Feature A</li>
## <li>Feature B</li>
## <li>Feature C</li>
## </ul>
## </p>
## </desc>
########################################
## <summary>
## Execute a domain transition to run myapp.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to transition.
## </summary>
## </param>
interface(`myapp_domtrans',`
gen_requires(`
type myapp_t, myapp_exec_t;
')
domtrans_pattern($1,myapp_exec_t,myapp_t)
')
########################################
## <summary>
## Read myapp log files.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to read the log files.
## </summary>
## </param>
interface(`myapp_read_log',`
gen_requires(`
type myapp_log_t;
')
logging_search_logs($1)
allow $1 myapp_log_t:file read_file_perms;
')
↓Makefile
代码语言:javascript复制AWK ?= gawk
NAME ?= $(shell $(AWK) -F= '/^SELINUXTYPE/{ print $$2 }' /etc/selinux/config)
SHAREDIR ?= /usr/share/selinux
HEADERDIR := $(SHAREDIR)/$(NAME)/include
include $(HEADERDIR)/Makefile
代码语言:javascript复制cd ~/myapp
make
要加载模块,您必须以允许运行的角色以root身份运行semodule。然后运行semodule -i以将模块插入正在运行的策略中:
semodule -i myapp.pp
查看是否有myapp模块
semodule -l | grep myapp
错误记录
修改selinux导致无法开机
代码语言:javascript复制在Grub启动菜单上按e进入编辑模式,在启动项
“kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet”
后面加上 enforcing=0 ,然后启动即可。