一般来说,系统的防火墙分析主要可以透过封包过滤或者是透过软件分析,我们的 Linux 默认有提供一个软件分析的工具, 那就是
/etc/hosts.deny, /etc/hosts.allow 这两个可爱的配置文件!另外,如果有安装 tcp wrappers 套件时, 我们甚至可以加上一些额外的追踪功能呢!底下就让我们分别来谈谈这些玩意儿吧!
/etc/hosts.allow, /etc/hosts.deny 管理
我们在前面几章知道了要管制 at 的使用可以透过修订 /etc/at.{allow|deny} 来管理,至于 crontab 则是使用 /etc/cron.{allow|deny} 来管理的。那么有没有办法透过个什么机制,就能够管理某些程序的网络使用呢? 就有点像管理某些程序是否能够接受或者是拒绝来自因特网的联机的意思啦!有的!那就是
/etc/hosts.{allow|deny} 啰。
任何以 xinetd 管理的服务,都可以透过 /etc/hosts.allow, /etc/hosts.deny 来配置防火墙。那么什么是防火墙呢?
简单的说,就是针对来源 IP 或网域进行允许或拒绝的配置, 以决定该联机是否能够成功达成连接的一种方式就是了。其实我们刚刚修改 /etc/xinetd.d/rsync 里头的 no_access, only_from 也可以进行这方面的防火墙配置。不过,
使用 /etc/hosts.allow, /etc/hosts.deny 则更容易集中控管,在配置与查询方面也较为方便! 那么就让我们谈谈这两个文件的配置技巧吧!
其实 /etc/hosts.allow 与 /etc/hosts.deny 也是
/usr/sbin/tcpd 的配置文件,而这个 /usr/sbin/tcpd 则是用来分析进入系统的 TCP 网络封包的一个软件,TCP 是一种面向连接的网络联机封包,包括 www, email, ftp 等等都是使用 TCP 封包来达成联机的喔。 所以啰,顾名思义,这个套件本身的功能就是在分析 TCP 网络数据封包啦!而 TCP 封包的文件头主要记录了来源与目主机的 IP 与 port ,
因此藉由分析 TCP 封包并搭配 /etc/hosts.{allow,deny} 的守则比对,就可以决定该联机是否能够进入我们的主机啦。 所以啦,我们要使用 TCP Wrappers 来控管的就是:
来源 IP 或/与 整个网域的 IP 网段;
port (就是服务啦,前面有谈到启动某个端口是 daemon 的责任啊)
基本上只要一个服务受到 xinetd 管理,或者是该服务的程序支持 TCP Wrappers 函式的功能时,那么该服务的防火墙方面的配置就能够以 /etc/hosts.{allow,deny} 来处理啰。换个方式来说,只要不支持 TCP Wrappers 函式功能的软件程序就无法使用 /etc/hosts.{allow,deny} 的配置值啦,这样说,有没有比较清楚啊。不过,那要如何得知一个服务的程序有没有支持 TCP Wrappers 呢,你可以这样简单的处理喔。
范例一:测试一下达成 sshd 及 httpd 这两个程序有无支持 TCP Wrappers 的功能
[root@www ~]# ldd $(which sshd httpd)
/usr/sbin/sshd:
libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002abcbfaed000)
libpam.so.0 => /lib64/libpam.so.0 (0x00002abcbfcf6000)
....(中间省略)....
/usr/sbin/httpd:
libm.so.6 => /lib64/libm.so.6 (0x00002ad395843000)
libpcre.so.0 => /lib64/libpcre.so.0 (0x00002ad395ac6000)
....(底下省略)....
# 重点在于软件有没有支持 libwrap.so 那个函式库啰
ldd (library dependency discovery) 这个命令可以查询某个程序的动态函式库支持状态,因此透过这个 ldd 我们可以轻松的就查询到 sshd, httpd 有无支持 tcp wrappers 所提供的 libwrap.so 这个函式库文件。从上表的输出中我们可以发现, sshd 有支持但是 httpd 则没有支持。因此我们知道 sshd 可以使用 /etc/hosts.{allow,deny} 进行类似防火墙的抵挡机制,但是 httpd 则没有此项功能喔!
配置文件语法
这两个文件的配置语法都是一样的,基本上,看起来应该像这样:
<service(program_name)> : <IP, domain, hostname> : <action>
<服务 (亦即程序名称)> : <IP 或领域 或主机名> : < 动作 >
# 上头的 < > 是不存在于配置文件中的喔!
重点是两个,
第一个是找出你想要管理的那个程序的文件名,第二个才是写下来你想要放行或者是抵挡的 IP 或网域呢。 那么程序的文件名要如何写呢?其实就是写下档名啦!举例来说上面我们谈到过 rsync 配置文件内不是有 server 的参数吗? rsync 配置文件内 /usr/bin/rsync 为其参数值,那么在我们这里就得要写成 rsync 即可喔!依据 rsync 的配置文件数据,我们将抵挡的 127.0.0.100, 127.0.0.200, 及放行的 140.116.0.0/16 写在这里,内容有点像这样:
[root@www ~]# vim /etc/hosts.deny
rsync : 127.0.0.100 127.0.0.200 : deny
当然也可以写成两行,亦即是:
[root@www ~]# vim /etc/hosts.deny
rsync : 127.0.0.100 : deny
rsync : 127.0.0.200 : deny
这样一来,对方就无法以 rsync 进入你的主机啦!方便吧!不过,既然如此,为什么要配置成 /etc/hosts.allow 及 /etc/hosts.deny 两个文件呢?
其实只要有一个文件存在就够了, 不过,为了配置方便起见,我们存在两个文件,其中需要注意的是:
写在 hosts.allow 当中的 IP 与网段,为默认『可通行』的意思,亦即最后一个字段 allow 可以不用写;
而写在 hosts.deny 当中的 IP 与网段则默认为 deny ,第三栏的 deny 亦可省略;
这两个文件的判断依据是:
(1) 以 /etc/hosts.allow 为优先,而 (2) 若分析到的 IP 或网段并没有记录在 /etc/hosts.allow ,则以 /etc/hosts.deny 来判断。
也就是说,
/etc/hosts.allow 的配置优先于 /etc/hosts.deny 啰!基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个文件内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:
允许进入的写在 /etc/hosts.allow 当中;
不许进入的则写在 /etc/hosts.deny 当中。
此外,我们还可以使用一些特殊参数在第一及第二个字段喔!内容有:
ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时;
KNOWN:代表为可解析的 IP, domain 等等信息时;
再强调一次,那个
service_name 其实是启动该服务的程序,举例来说, /etc/init.d/sshd 这个 script 里面, 实际上启动 ssh 服务的是 sshd 这个程序,所以,你的 service_name 自然就是 sshd 啰! 而 /etc/xinetd.d/telnet (你的系统可能尚未安装) 内有个 server 的配置项目, 那个项目指到 in.telnetd 这个程序来启动的喔!要注意的很!(请分别使用 vi 进这两支 scripts 查阅) 好了,我们还是以 rsync 为例子来说明好了,现在假设一个比较安全的流程来配置,就是:
只允许 140.116.0.0/255.255.0.0 与 203.71.39.0/255.255.255.0 这两个网域,及 203.71.38.123 这个主机可以进入我们的 rsync 服务器;
此外,其他的 IP 全部都挡掉!
这样的话,我可以这样配置:
[root@www ~]# vim /etc/hosts.allow
rsync: 140.116.0.0/255.255.0.0
rsync: 203.71.39.0/255.255.255.0
rsync: 203.71.38.123
rsync: LOCAL
[root@www ~]# vim /etc/hosts.deny
rsync: ALL <==利用 ALL 配置让所有其他来源不可登陆
转自:
http://vbird.dic.ksu.edu.tw/linux_basic/0560daemons_3.php