前面的例子里有个问题,像/dev/null这样的文件谁都可以写,在每一个域里面专门写出一条允许策略语句是很浪费资源的。此外,假设进程处在下面这个域里:
进程执行/bin/bash,进程的新域是
如果再次执行/bin/bash,进程的新域变为
有必要区分上面这三个域吗?显然没有必要。
Tomoyo通过异常来规范策略语句,减少资源浪费。异常相关的策略语句的伪文件接口是/sys/kernel/security/tomoyo/exception_policy。异常(exception)这个词有些词不达意,但作者又找不到一个更合适的词来表达。下面看一下具体的异常策略语句。
1.域定义相关的异常
(1)域保持
域保持就是让进程的域保持原样,不会因为执行文件而变化。举个例子:
这意味着通过ssh登录而产生的shell进程固定在域“<kernel>/usr/sbin/sshd/bin/bash”中再执行文件进程的域不再发生变化。在此基础上,策略语句的语法可以变化为:
上面语句没有列出一个完整域名,只有域名中最后一级所执行文件的全路径名,意思是在执行了/bin/bash的进程中,再执行任何文件都不会发生域转换了。
上面语句的意思是在/bin/bash进程中执行/bin/bash不会发生域转换,执行别的文件仍然可以引起域的变化。
(2)域初始化
根据前面的介绍,进程的域就是进程执行文件的历史。当然,有些历史是进程从祖先进程处继承来的。有时候进程的域中包含太多的历史信息实在没有必要,域初始化语句就是用来删除不必要的历史信息的。举个例子:
这条语句导致执行/usr/sbin/sshd将会转换到这个域中
除了最后一个执行文件的记录外,还有一个用“<”和“>”包裹的“<kernel>”。用“<”和“>”包裹的是Tomoyo的名字空间,下文会有讲述。
any也可以替换为域名或路径名:
这条语句导致在系统启动过程启动的ssh服务进程处在初始化的域中,而其他方式启动的ssh进程则不是。
(3)创建名字空间
首先看一下什么是Tomoyo的名字空间(namespace)。名字空间的形式是用“<”和“>”包裹的一个字符串。一个名字空间会关联一组策略、异常以及9.3.3节要提到的轮廓。Tomoyo缺省的名字空间是“<kernel>”。创建新名字空间的语句是“reset”语句:
上述语句的含义是:在任意域中执行/usr/sbin/sshd导致域转换到新的名字空间“</usr/sbin/sshd>”,也就是说,sshd进程的新域是“</usr/sbin/sshd>”。假设sshd进程创建了子进程,并在子进程中执行/bin/bash,那么子进程的域就是“</usr/sbin/sshd>/bin/bash”。
(4)异常的异常
为了增加灵活性,Tomoyo又提供了3个no开头的异常策略语句:no_keep_domain、no_initialize_domain、no_reset_domain,来抵消keep_domain、initialize_domain、reset_domain的作用。举几个例子:
上述异常策略语句表示在ssh登录产生的shell中,如果shell进程(创建的子进程)执行了/bin/cat,那么cat进程所在的域是“<kernel>/usr/sbin/sshd/bin/bash/bin/cat”。shell进程执行其他文件时,其所在的域是“<kernel>/usr/sbin/sshd/bin/bash”。(www.xing528.com)
上述异常策略语句表示,如果一个进程的域的最后一个字段是“/bin/mail”,也就是说,该进程所执行的文件是/bin/mail,那么当该进程执行/usr/sbin/sendmail时,新的域是“…/bin/mail/usr/bin/sendmail”。反之,如果进程的域的最后一个字段不是“/bin/mail”,那么进程执行/usr/sbin/sendmail后的新域就是“<kernel>/usr/sbin/sendmail”。
上述异常策略语句表示,如果一个进程的域的最后一个字段是“/bin/mail”,那么当该进程执行/usr/sbin/sendmail时,新的域是“…/bin/mail/usr/sbin/sendmail”。反之,如果进程的域的最后一个字段不是“/bin/mail”,那么进程执行/usr/sbin/sendmail后的新域就是“</usr/sbin/ sendmail>”。
2.其他异常
异常策略语句的另一个作用是提供归类功能,减少策略语句数量,节约内核内存,节省策略制定者的时间和精力。
(1)聚合
Tomoyo是基于路径的,一条典型的访问控制策略是:
这条语句的意思是允许执行/bin/less。less和more功能相同,能不能对两者一视同仁呢?于是产生了聚合语句:
上述异常策略语句表示在策略文件中“/bin/less”和“/bin/more”同义,凡是对“/bin/less的操作许可,默认也存在于“/bin/more”之上。
(2)路径组、数字组和地址组
1)路径组
总是写全路径名太麻烦了,引入正则表达式会方便些。于是有了路径组:
在策略中使用path_group所定义的“HOME-DIR-FILE”需要前缀“@”:
2)数字组
同理,数字组的出现是为了避免在策略文件中反复输入同一个数字:
使用的策略:
3)地址组
再看为网络地址而设的地址组:
使用的策略
(3)访问控制组
前面提到有些操作许可在每个域都应该具备,比如“file write/dev/null”。如果每个域都为这种通用的操作许可写一条策略语句,那就很浪费资源了。访问控制组就用来定义通用的操作许可。
下面看一个例子:
策略会在每一个域下面声明这个域使用的访问控制组,下面看一个例子:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。