selinux参考策略实验记录

2022-11-14 14:32:58 浏览数 (1)

selinux 参考策略的安装以及编写自己的策略模块。

实验环境

  • 需要使用python3,2不可以。
  • Fedora30或centos7

参考策略安装过程

  • https://github.com/TresysTechnology/refpolicy/wiki
  • 大体是按照上面的wiki,但是wiki年久失修,有一些错误。
代码语言:javascript复制
可以在主目录下
# 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 ,然后启动即可。

0 人点赞