问题描述:
在CentOS5.5下安装Asterisk-1.4.35, mISDN-1.1.9, chan_misdn后,Asterisk启动时,message中提示:
[Sep 15 13:33:54] WARNING[9792] loader.c: Error loading module 'chan_misdn.so': /usr/lib/libsuppserv.so:cannot restore segment prot after reloc: Permission denied
看看文件权限,也不作无谓尝试了,先把selinux改为宽容模式:
setenforce 0
再次尝试,发现chan_misdn正常装载,定位是SELinux的问题,恢复强制模式
setenforce 1
常规做法是禁用SELinux,但这样太没技术含量了,经过研究,按以下方法分析和操作:
1.运行audit2why < /var/log/audit/audit.log
输出
type=AVC msg=audit(1284526550.664:61): avc: denied { execmod } for pid=9269 comm="asterisk" path="/usr/lib/libsuppserv.so" dev=md1 ino=2172848 scontext=user_u:system_r:initrc_t:s0 tcontext=system_u:object_r:lib_t:s0 tclass=file
Was caused by:
Missing or disabled TE allow rule.
Allow rules may exist but be disabled by boolean settings; check boolean settings.
You can see the necessary allow rules by running audit2allow with this audit message as input.
再结合ps aux -Z | grep asterisk 可以确定asterisk的主体标识是initrc_t
2.运行sesearch -a | grep initrc | grep execmod
一般会得到以下的结果:
allow initrc_t textrel_shlib_t : file { ioctl read getattr lock execute execmod };
对比上面红字,会有结论就是:
initrc_t lib_t {execmod}这规则是不存在的,所以会加载失败。
3.对策
修改libsuppserv.so的安全上下文(Security Context),让它符合步骤2的查询结果
chcon -t texrel_shlib_t /usr/lib/libsuppserv.so
或者
按照命令 audit2allow < /var/log/audit/audit.log 的执行结果处理,增加execmod(但个人感觉这个影响太大)
尾声:按照上面的分析步骤,在CLI中运行若干次module load chan_misdn后,共有三个文件需要处理:
chcon -t texrel_shlib_t /usr/lib/libsuppserv.so
chcon -t texrel_shlib_t /usr/lib/libmISDN.so
chcon -t texrel_shlib_t /usr/lib/libisdnnet.so
完全搞定~~~
参考链接:
鸟哥的...强烈推荐
http://linux.vbird.org/linux_basic/0440processcontrol.php
杂文,有类似做法但没分析,而且好象会弹窗,自己决定点不点
http://www.phpfans.net/article/htmls/201006/Mjg5MDc2.html