UnixAgain

热爱Unix及相关的一切

博客园 首页 联系 订阅 管理

经常听人说装完Fedora之后的第一件事就是把SELinux和iptables关掉,甚至搜索一下这两个东西,多数博客都是教用户如何关闭它们而不是如何正确的使用它们。

正好这段时间对这两者有了一些肤浅的认识,在这里说一下。

首先我们要摆正态度,要知道现在大行其道的OpenStack的nova-network所用的IP地址内外网映射(NAT)就是用iptables实现的,而且表现非常优异。而SELinux则是NSA(美国国家安全局)斥巨资开发的。它们如果真的像多数人所说的,应该上来就关掉,那么就不会有那多年的发展了。

言归正传,下面来对它们二者做一个简单的介绍。

iptables

先来弄清楚iptables和netfilter的关系。iptables防火墙由Netfilter项目(http://www.netfilter.org)开发,自2001年1月在Linux2.4内核发布以来就是Linux的一部分了。

Netfilter是由Linux提供的所有包过滤和包修改设施的官方项目名称,但这个术语同时也指Linux内核中的一个框架,它可以用于在不同的阶段将函数挂接(hook)进网络栈。另一方面,iptables使用Netfilter框架旨在将对数据包进行操作(如过滤)的函数挂接进网络栈。

所以,你可以认为Netfilter提供了一个框架,而iptables在它之上建立了防火墙功能。

同时iptables还指同名的用户层工具,它解析命令行并将防火墙策略传递给内核。术语表(table)、链(chain)、匹配(match)、目标(target)只有在iptables的上下文中才有意义。

使用iptables进行包过滤

iptables一共有四张表,称为filter, nat, mangle, raw。filter用于过滤,nat用于网络地址转换,mangle用于给数据包做标记以修改分组数据的特定规则,raw表则独立于Netfilter连接跟踪子系统。

因此,如果你的目标是保护主机安全,那么着重考虑的是filter表,而如果像OpenStack那样,目的是做网络地址转换,就用NAT表,而mangle则用于QoS(服务质量控制),如对打上某个标记的分组数据分配较多带宽等等。

每个表都有自己的一组内置链,用于还可以对链进行自定义。

对filter表来说,最重要的是内置链INPUT/OUTPUT/FORWARD。顾名思义,INPUT应用于外部网络进入到本地主机的数据包,OUPTU则应用于从本地主机发送到外部网络的数据包。FORWARD则可以理解为将本地主机作为路由器,数据包从本地主机经过,但目标位于本地主机的下游。

<!-- 先去吃个饭,回来再写,或说现在正发高烧38.5度,还坐在宿舍写博客 -->

对于NAT来说,最重要的就是搞清楚PREROUTING和POSTROUTING链了。这个可以这么简单的理解,数据包从外部流入,在进入主机前给它PREROUTING,也就是“预路由”,即改变分组数据的目标地址或端口号。通常所说的端口转发就是在这里了。

举个简单的例子,在OpenStack的网络管理中,通常一个虚拟机会有一个外网IP和一个内网IP,那么节点的iptables规则里面就会有类似这样的语句

iptables -t nat -A PREROUTING -d 115.12.XX.XX -j DNAT --to-destination 192.168.1.111
iptables -t nat -A POSTROUTING -s 192.168.1.111 -j SNAT --to-source 115.12.XX.XX

 这条语句的意思就是目标地址为虚拟机外部地址115.12.XX.XX的数据包会被iptables重定向(修改数据包的目的地址)到192.168.1.111,同时,从192.168.1.111发出的数据包,iptables会将其源地址修改为115.12.XX.XX。从内部这里没有涉及端口,如果有端口,再加上--dport和--sport即可。

详细的流程可以参考http://www.opsers.org/security/iptables-related-concepts-and-processes-the-packet-figure.html

下面就说一下基本的命令吧,要说复杂iptables还真复杂,不过正常使用的话下面这些也差不多够了。

1 -t    指定表名
2 -A   新增规则(ADD)
3 -I    插入规则,需要指定插入的位置
4 -D    删除规则,只需要指定位置,不需要再重新写一遍当前规则
5 -L    列出当前所有规则
6 -V   显示当前iptables版本号

注意一点,如果不指定表名,则默认是filter表。

另外指出发行版的一点不同,在RHEL系(CentOS/Fedora)上,可以使用

service iptables restart
或
systemctl restart iptables.service

来重启iptables服务以加载默认的规则,而在Debian系(Ubuntu一众)则没有iptables这个服务,如果需要清空所有iptables规则,则需要

1 iptables -t filter -F
2 iptables -t filter -X
3 iptables -t nat -F
4 iptables -t nat -X
5 iptables -P INPUT ACCPET
6 iptables -P OUTPUT ACCEPT
7 iptables -P FORWARD ACCEPT

这样等同于所有规则都没有生效,也即关闭了iptables。另外Debian系提供了ufw作为简单的防火墙控制工具。

SELinux

这个恐怕是让更多人头疼的东西。我更是听说红帽有些工程师在解决问题时也是 先关掉这东西。

首先明白一点,SELinux是干什么用的,同样是为了计算机的安全,那么它和iptables的功能有重叠吗?

答案是没有。

它们的定位是不同的。iptables是防火墙,防范来自网络的入侵和实现网络地址转发、QoS等功能,而SELinux则可以理解为是作为Linux文件权限控制(即我们知道的rwx)的补充存在的。

我们知道,Linux的文件权限主要是rwx三类,即读、写、执行。撇开那些特殊的如s/u/t位不提,这三个权限控制真的能保证系统的绝对安全吗?

以Apache Http服务器为例(好像在说SELinux的时候那些前辈总是喜欢拿这个来举例子)。当一台服务器上跑着HTTP服务,我们访问这台服务器时是以apache用户来访问系统上的文件的,在HTTP的DocumentRoot目录下的文件对我们来说是可读的,而同样,单纯看rwx的权限,/etc/passwd这个敏感文件对apache用户也是可读的,因为它的权限位是-rw-r--r--,也就是对o(thers)是可读的,因此可以这样认为,网络攻击者如果可以以apache用户登录系统,它就可以查看/etc/passwd文件,知道系统中有哪些用户等等信息。但如果开启了SELinux就不会出现这种情况。为什么呢?

你可以用ls -Zl来查看SELinux有关的信息(前提是开启了SELinux服务)

 可以看到,在默认的HTTPDocumentRoot目录下的文件有

system_u:object_r:httpd_sys_content_t:s0

 这样的安全上下文,其中的类型字段httpd_sys_content_t即表明这是http的内容文件,可以被http程序访问。显然其他目录下的文件没有同样的类型字段。这也就是为什么当你手动修改了DocumentRoot目录之后虽然在iptables里已经开放了网络访问,但仍然无法打开网页的原因了——因为apache用户对你新指定的目录下的文件没有读取的权限,因此SELinux是建立在Linux标准的权限控制基础上的增强型Linux。

还需要注意一点,当你复制一个文件到另一个目录时,新复制的文件会继承目标目录的SELinux上下文,而如果是移动文件则会保留源文件的SELinux上下文(context)。

例如需要让新目录可以被apache访问,需要对新目录执行

chcon -R -t httpd_sys_content_t /srv/www

其中-R是recursive即递归执行,-t是指定类型,这个类型可以用

semanage fcontext -l | grep '/var/www'

 来获得。

要给一个目录下的所有文件设置安全上下文,可以用

semanage -a -t public_content_t '/srv/ww(/.*)'

注意,这里用的是正则表达式而不是用"*"作为通配符。

 

写这篇文章的目的不是具体介绍这两个工具具体怎么用,因为那是参考手册的工作,而我想说的是其实它们远没有你想像的那么难,不要听别人说它们有多复杂,只把它们当成普通的命令来学习来用也就好了。我身边的一位很厉害的网络工程师对iptables玩的炉火纯青,却对SELinux一无所知。我是不太理解,如果按照一般的学习的心态来看待两种技术(或者说工具)其复杂度也差不多,只要理解了它们的用途或者说目的,就可以很得心应手的使用它们了。

 

参考:

[1]. Linux防火墙(Linux Firewalls Attack Detection and Response with iptables, psad, and fwsnot)

[2]. 鸟哥的Linux私房菜(服务篇)http://vbird.dic.ksu.edu.tw/linux_server/0210network-secure_4.php#selinux

posted on 2014-01-01 17:09  UnixAgain  阅读(4910)  评论(1编辑  收藏  举报