这样,在/etc/selinux/refpolicy/src/policy下生成很多的以pp为后缀的文件,这些就是SELinux模块。接下来我们修改/etc/sysconfig/selinux,设成SELINUXTYPE=refpolicy,然后reboot.
启动后,确认策略的适用情况, 现在的版本是20。
[fu@python ~]$ /usr/sbin/sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
Policy version: 20
Policy from config file: refpolicy
5.2给程序定制domain
开发程序策略的一般步骤
1.给文件,端口之类的object赋予type 标签
2.设置 Type Enforcement (Domain 迁移,访问许可)
3.策略加载
4.permissive模式下运行程序
5.确认日志,用audit2allow生成访问许可
6.重复1,2,3,4,5动作,直到没有违反的日志出现
7.切换到enforcing模式,正式运用
因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。
接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。
[fu@python azureus]$ ps -efZ|grep azureus
user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus
接下来我们在追加3个文件。
1)azureus.fc
在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。
[root@python apps]# more azureus.fc
/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)
2)azureus.te
[root@python apps]# more azureus.te
policy_module(azureus,1.0.0)
type azureus_t;
type azureus_exec_t;
role user_r types azureus_t;
require {
type user_t;
};
domain_type(azureus_t)
domain_entry_file(azureus_t, azureus_exec_t)
domain_auto_trans(user_t, azureus_exec_t, azureus_t)
3)azureus.if
实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。
[root@python apps]# more azureus.if
# policy/modules/apps/azureus.if
## Myapp example policy
##
## Execute a domain transition to run azureus.
##
##
## Domain allowed to transition.
##
interface(`azureus_domtrans',`
gen_requires(`
type azureus_t, azureus_exec_t;
')
domain_auto_trans($1,azureus_exec_t,azureus_t)
allow $1 azureus_t:fd use;
allow azureus_t $1:fd use;
allow $1 azureus_t:fifo_file rw_file_perms;
allow $1 azureus_t:process sigchld;
')
在/etc/selinux/refpolicy/src/policy/policy/module.conf 里加入下面一行
[root@python policy]# tail -1 modules.conf
azureus = module
确认/etc/selinux/refpolicy/src/policy里MONOLITHIC=n
最后make , make load
[root@python policy]# pwd
/etc/selinux/refpolicy/src/policy
[root@python policy]# make;make load
正常终了后,我们可以用 semodule命令来确认 azureus.pp下载下去了没有。
[root@python policy]# semodule -l |grep azureus
azureus 1.0.0
看样子是没有问题。好了我们再看看 /home/fu/azureus/azureus的security context,我们刚才在azureus.fc里是期望它是 user_u:object_r:azureus_exec_t ,可是它这个时候还是继承了默认的 user_u:object_r:user_home_t ,如果不是我们期望的文件标签的话,domain是无法从user_t迁移到azureus_t的,因为relabel的话,会对整个文件系统进行重新设标签,很花时间,所以我们用在上面介绍过文件标签更改的命令chcon命令来改标签。
[root@python azureus]# chcon -t azureus_exec_t azureus
再看看这次的新标签,果然如我们期望的,变成azureus_exec_t了。
[root@python policy]# ls -lZ /home/fu/azureus/
-rwxr-xr-x fu fu user_u:object_r:azureus_exec_t azureus
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
接下来退出ROOT用户,以用户fu登录,运行azureus命令。
[root@python azureus]# ps -efZ|grep azureus
user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus
user_u:user_r:azureus_t fu 8717 8703 4 23:24 pts/1 00:01:29 java -Djava.ext.dirs=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/ext -Xms16m -Xmx128m -cp /home/fu/azureus/Azureus2.jar:/home/fu/azureus/swt.jar -Djava.library.path=/home/fu/azureus -Dazureus.install.path=/home/fu/azureus org.gudy.azureus2.ui.swt.Main
user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus
高兴吧! 成功了。
在这里我只是演示如何让domain迁移,至于azureus的严格的access vector的设置我都忽略了。
5.3 给自己增加个专用的ROLE
在这里我们要增加一个叫madia的ROLE,在追加时要对一些文件进行修改。
5.3.1 /etc/selinux/refpolicy/src/policy/policy/modules/kernel下的文件修改
1) kernel.te
[root@python kernel]# vi kernel.te
在role user_r 的下面加上一行
role madia_r;
2) domain.te
[root@python kernel]# vi domain.te
在 role user_r types domain; 的下面加上一行
role madia_r type domain;
5.3.2 /etc/selinux/refpolicy/src/policy/policy/modules/system下的文件修改
[root@python system]# vi userdomain.te
在第5行追加madia_r,如下所示:
role sysadm_r, staff_r, user_r,madia_r;
在unpriv_user_template(user)下面加上下面的一行。
unpriv_user_template(madia)
5.3.3 /etc/selinux/refpolicy/src/policy/policy下的文件修改
1)user
users和策略1.X里的users差不多。定义用户能利用的ROLE。
[root@python policy]# vi users
gen_user(madia, madia, madia_r, s0, s0)
2)rolemap
[root@python policy]# vi rolemap
在user_r user user_t下面加上一行
madia_r madia madia_t
5.3.4 重新make 策略
[root@python policy]# make load
5.3.5 /etc/selinux/refpolicy/seusers 文件的修改
Seusers是系统一般用户和SELinux的用户映射。
[root@python refpolicy]# vi seusers
madia:madia
5.3.6 /etc/selinux/refpolicy/contexts下的文件修改
1)default_type
决定用户登录时的默认ROLE。
[root@python refpolicy]# vi contexts/default_type
madia_r:madia_t
2)default_contexts
决定用户登录时的默认security context
[root@python refpolicy]# vi contexts/default_contexts
system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t
5.3.7 以madia用户重新登录
最后以用户madia登录,查看是不是 进入madia_t了。
[madia@python ~]$ id
uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t
以上我们可以看出,madia用户确实是进入了madia_t 运行了。
我们在以上的操作中,实际上还有修改遗漏的地方,每当重新make的时候,seusers都会回到原来的设定,有兴趣的朋友可以自己找出哪里还需要修改。