SELinux(Security-Enhanced Linux) 是美国国家安全局(NAS)对于强制访问控制的实现,是 Linux® 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。本文是一篇翻译稿件,主要介绍了怎样通过SELinux从而加强网络安全,原文地址如下:http://securityblog.org/brindle/2007/05/28/secure-networking-with-selinux/
在过去的一年中付出了相当多的努力后使得SELinux对网络支持得更好,感谢伟大的SELinux社区,随着支持的进一步发展,它变得对人们越来越有用,人们愿意尝试使用它并提出反馈意见,最终将变得更加有用,受众也更加广泛,因为在SELinux中网络支持还在不断发展(已经有一部分其它想法正在讨论中,可能今后会被包括进来),我将保持本文的更新,请随时关注。
在SELinux中的网络支持包括很多事情,过去SELinux通过对象类的方式实现细粒度的网络访问控制,这些对象类是网络接口,网络地址和一些套接字对象类(如tcp_socket,udp_socket,rawip_socket等)。
SELinux策略直接标记出了不同种类的网络对象包括接口(使用netifcon),互联网节点(使用nodecon)和端口(使用portcon),策略的语法结构看起来象下面这样:
netifcon eth0 system_u:object_r:external_netif_t system_u:object_r: external_packet_t nodecon 192.168.1.1 255.255.255.255 system_u:object_r:external_node_t; portcon tcp 21 system_u:object_r:ftp_port_t ; 这些被标记了的对象使用正常的SELinux规则就可以访问了: allow ftpd_t external_netif_t : netif {tcp_send tcp_recv }; allow ftpd_t external_node_t : node { tcp_send tcp_recv }; allow ftpd_t ftp_port_t : tcp_socket { send_msg recv_msg name_bind }; |
策略和规则结合起来实际上指定了ftpd_t绑定到端口21,在端口21上发送和接收tcp消息,在eth0(它的ip地址是192.168.1.1)网卡接口上发送和接收tcp消息,这些规则工作得很好,唯一的问题是它们不能在一条规则中进行描述,因此它们不是连接在一起的。这就意味着如果有另外一套规则指出ftpd_t只能在内部接口上发送和接收dns(名称解析服务)数据包,依靠上面的规则他们也能在外部接口上发送和接收dns数据包,注意这些访问控制也可以用在我稍后要介绍的在SELinux中通过echo 1 > /selinux/compat_net使用的compat_net选项上。这些对象的标签最后都将增加到libsemanage中,使用semanage命令可以改变它们,但这个命令不能修改策略。
在2006年顶级SELinux开发者研讨会期间,我们讨论了如何使网络标记变得更容易、更多地支持典型的网络约束和大部分重要的精密地绑定接口、地址和端口的方法,幸运地是在Linux中netfilter已经支持这些内容以及一些额外的好处,例如网络连接跟踪可以更精确地限制诸如使用动态端口的ftp这些事情。
可能会想到向iptables中增加一条域分类符来控制更容易一些,因此可能会写一条规则和SELinux域一样定义端口、网络地址、网络接口实现仅允许ftp数据包到达ftpd_t。这可能会用到分布式SELinux策略,但是,可以从SELinux安全服务器移动一部分策略到iptables策略和子系统中去,但我们并不欢迎这样做,因为我们喜欢单一的,集中的,可分析的SELinux策略,实际上让我们使用netfilter和iptables来标记数据包,然后用SELinux规则描述同意或拒绝访问,让我们看看这都是如何使用的:
iptables -A INPUT -t mangle -p tcp --dport 21 -j SECMARK --selctx system_u:object_r:ftp_packet_t
这条语句标记了经过端口21的数据包为ftp_ packet_t,SELinux规则只是简单地允许ftpd_t发送和接收这种类型的数据包:
allow ftpd_t ftp_packet_t : packet { send recv };
但是这相对于传统的网络控制而言并没有做出更新颖的事情来,让我们再来看看更有趣的内容:
iptables -A INPUT -t mangle -p tcp --dport 21 -i eth0 -s 192.168.0.1/24 -j SECMARK –selctx system_u:object_r:ftp_packet_t
这条语句标记了在eth0上,来自192.168.0.1/24,端口21的数据包为ftp_packet_t,因此这就体现了netfilter支持集中处理的好处,另一个iptables规则如下:
iptables -A INPUT -t mangle -m state --state RELATED,ESTABLISHED -j CONNSECMARK –restore
它将为与此相关的数据包进行拷贝,因此当ftp客户端尝试通过相关端口(传输时端口是动态指定的)传输一个文件时将接收到相同的标签,它将运用netfilter的连接跟踪特性来允许ftp仅仅接收与其连接有关的数据包,但这并不需要新增加策略规则或对策略进行修改,因为我们正在对标签进行修改。
这将转变netfilter已经存在的功能,使其能够更精确地指定哪个域能访问哪个数据包,因此它允许你相对于进程而不是机器控制防火墙的功能,如果你在同一台机器上运行有一些不同安全属性的服务那它就有用了,例如:允许你有一个内部的Apache实例访问公司的机密数据,而另外一个外部的Apache实例提供静态的web内容到internet上。
大多数人都在思考在SELinux中为什么不仅仅是提供对网络的支持,而是要在防火墙规则条目中进行网络访问控制,下面的SELinux网络支持就是标记网络通讯。
共6页: 1 [2] [3] [4] [5] [6] 下一页 | ||||||||
|