服务的防火墙管理 xinetd, TCP Wrappers
一般来说,系统的防火墙分析主要可以透过封包过滤或者是透过软件分析,我们的 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 来控管的就是:
基本上只要一个服务受到 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 写在这里,内容有点像这样:
Tips:
关于 IP, 网域, 网段, 还有相关的网络知识,在这个基础篇当中我们不会谈到,你只要记得底下写的 140.116.0.0/255.255.0.0 代表一个网域就是了。详细的数据请先自行参考服务器架设篇的内容!
[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 两个文件呢?其实只要有一个文件存在就够了, 不过,为了配置方便起见,我们存在两个文件,其中需要注意的是:
也就是说, /etc/hosts.allow 的配置优先于 /etc/hosts.deny ��!基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个文件内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:
此外,我们还可以使用一些特殊参数在第一及第二个字段喔!内容有:
再强调一次,那个 service_name 其实是启动该服务的程序,举例来说, /etc/init.d/sshd 这个 script 里面, 实际上启动 ssh 服务的是 sshd 这个程序,所以,你的 service_name 自然就是 sshd ��! 而 /etc/xinetd.d/telnet (你的系统可能尚未安装) 内有个 server 的配置项目, 那个项目指到 in.telnetd 这个程序来启动的喔!要注意的很!(请分别使用 vi 进这两支 scripts 查阅) 好了,我们还是以 rsync 为例子来说明好了,现在假设一个比较安全的流程来配置,就是:
[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 配置让所有其他来源不可登陆TCP Wrappers 特殊功能
那么有没有更安全的配置?例如,当有其他人扫瞄我的 rsync port 时,我就将他的 IP 记住,以做为未来的查询与认证之用呢? 是有的!只是,那就得要有额外的动作参数加在第三栏了,而且你还需要安装了 TCP Wrappers 软件才行。要确定有没有安装 TCP Wrappers 可以使用『 rpm -q tcp_wrappers 』来查询喔。至于更加细部的主要动作则有:
为了达成追踪来源目标的相关信息的目的,此时我们需要 safe_finger 这个命令的辅助才行。而且我们还希望客户端的这个恶意者能够被警告。 整个流程可以是这样的:
由于是抵挡的机制,因此我们这个 spawn 与 twist 的动作大多是写在 /etc/hosts.deny 文件中的。我们将上述的动作写成类似如下的东东:
[root@www ~]# vim /etc/hosts.deny rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;\ echo; /usr/sbin/safe_finger @%h ) | \ /bin/mail -s "%d-%h security" root & \ : twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )
上面其实是针对一个 rsync 所写的信息,你可以看到上面这四行共有三个冒号来隔开成四个咚咚,这四个咚咚的意义是:
在上面的例子中,第三行的 root 那个账号,可以写成你的个人账号或者其他 e-mail ,这样就能够寄到你常用的 email ��, 这样也比较好管理��。如此一来,当未经允许的计算机尝试登陆你的主机时,对方的屏幕上就会显示上面的最后一行,并且将他的 IP 寄到 root ( 或者是你自己的信箱 )那里去!
转载自:http://vbird.dic.ksu.edu.tw/linux_basic/0560daemons_3.php