如何在SELinux中为新的后台程序编写策略
2012-12-17 22:50
288 查看
如何在SELinux中为新的后台程序编写策略
原贴:http://www.sep14.cn/selinux-policy-howto.htmlwriting new policy for a daemon in
red hat selinux guide, 给出了一般的步骤或者说一种方法学,这里打算翻译一些这一段,算是一种自我回顾总结,也希望对从事类似工作的人有所帮助。另外,SEBSD虽然是对 SELinux的ports,但是在Freebsd上进行配置与Red Hat还是有一些区别的,经过实践,我将SEBSD上有所不同的以[区别]附在旁边。
为新后台程序(daemon)编写策略这一节为从头编写新的策略文件提供一种可以遵循的总体方法。尽管这样比在local.te文件中增加几条规则要复杂的多,然而两者的概念是一致的。将应用程序置于TE规则之下,分析***C的拒绝信息,反复增加规则直至权限问题得到解决。新策略书写步骤
在Red Hat Enterprise Linux上配置好后台程序. 也就是说该程序在 /etc/init.d/ 下有启动脚本,并且可以使用
chkconfig 进行配置管理. 比如, 该配置步骤假定你将使用 service 命令控制daemon的启动和关闭. [FreeBSD中启动脚本的路径为/etc/rc.d/,并且不提供chkconfi和service命令]在本步骤中, 我们将为一个虚拟的
foo 软件包书写策略并和 foo 后台进程关联. 当开发自己的策略是请使用真实的后台进程名称.
创建文件 $SELINUX_SRC/domains/program/foo.te. [FreeBSD中$SELINUX_SRC相当于路径/etc/security/sebsd/policy]
在foo.te文件中调用宏daemon_domain为该daemon创建域:
daemon_domain(foo) |
在文件 file.fc 中放置初始的配置列表. 也可以在稍后添加,这取决于 foo 程序的需要.
/usr/bin/foo -- system_u:object_r:foo_exec_t /var/run/foo.pid -- system_u:object_r:foo_var_run_t /etc/foo.conf -- system_u:object_r:foo_conf_t |
标记文件 foo :
restorecon /usr/bin/foo /var/run/foo.pid /etc/foo.conf |
启动daemon, service foo start.
[FreeBSD适当的编写脚本完成]
检查审计日志中的拒绝信息:
grep "avc: denied" /var/log/messages > /tmp/avc_denials cat /tmp/avc_denials |
seaudit 查看日志信息, 如同
Section 6.2 Using seaudit for Audit Log Analysis 中的解释一样。
[audit2allow工具可以在/usr/src/contrib/sebsd/policycoreutils 中找到,make install clean可以成功. seaudit没有在sebsd/FreeBSD下找到对应工具]
使用 audit2allow 开始第一轮策略文件配置.
audit2allow -l -i /var/log/messages -o /etc/selinux/targeted/src/policy/domains/program/foo.te |
[audit2allow的使用可以查看其帮助或提示]
查看 foo_t 域是否尝试创建网络套结字, 也就是说, ***C拒绝信息中的 udp_socket 或 tcp_socket 对象类:
avc: denied { create } for pid=7279 exe=/usr/bin/foo scontext=root:system_r:foo_t tcontext=root:system_r:foo_t tclass=udp_socket |
can_network(foo_t) |
启动 daemon.
读取 ***C 消息.
根据***C消息书写策略, 使用 audit2allow 和自己的判断, 尽可能的使用宏.
加载新策略.
回到开始, 启动 daemon …
如果域试图访问 port_t, 这从***C日志信息中的 tclass=tcp_socket 或 tclass=udp_socket 可以体现, 需要决定
foo 应该使用的端口号. 要诊断该信息, 在 foo.te 加入以下规则:
allow foo_t port_t:tcp_socket name_bind; auditallow foo_t port_t:tcp_socket name_bind; |
对剩余的***C拒绝信息重复以上过程. 当新策略配置消除了这些拒绝信息后, 可以再为 foo_t 域对这些特定的端口进行需要的配置.
daemon 启动后, 确定 foo 所使用的端口号. 查看***C允许信息并确认daemon连接到了那些端口:
lsof | grep foo.*TCP foo 2283 root 3u IPv6 3192 TCP *:4242 (LISTEN) |
删除一般的 port_t 规则, 替换为基于 foo_t 域所使用端口的特定规则.
type foo_port_t, port_type; allow foo_t foo_port_t:tcp_socket name_bind; |
ifdef(`foo.te', `portcon tcp 4242 system_u:object_r:foo_port_t') |
Software ,
Programming
Trackback URI
Comments RSS
Print This Post
相关文章推荐
- 如何在SELinux中为新的后台程序编写策略
- SELinux策略语言--类型强制(编写TE规则)
- SELinux策略语言--类型强制(编写TE规则)
- 如何设置SELinux 策略规则
- 【网摘】如何编写Linux Daemon后台程序(守护进程)
- 移动端优先策略下的css如何编写
- 设置SELinux 策略规则 ? 在Kernel Log 中出现"avc: denied" 要如何处理?
- SELinux策略语言--类型强制(编写TE规则)
- 如何编写Linux Daemon后台程序(守护进程)
- SELinux策略语言--类型强制(编写TE规则)
- 如何设置SELinux 策略规则 ? 在Kernel Log 中出现"avc: denied" 要如何处理?
- 如何用IED编写股票的量化策略?
- 如何编写Linux Daemon后台程序(守护进程)
- 如何设置SELinux 策略规则 ? 在Kernel Log 中出现"avc: denied" 要如何处理?
- selinux-编写策略
- SELinux策略语言--类型强制(编写TE规则)
- SELinux策略语言--类型强制(编写TE规则)
- 如何编写Linux Daemon后台程序(守护进程)
- 从【SELINUX】策略中学习【LSM】编写规则
- 如何编写异常安全的C++代码