服务的防火墙管理 xinetd, TCP Wrappers

一般来说,系统的防火墙分析主要可以透过封包过滤或者是透过软件分析,我们的 Linux 默认有提供一个软件分析的工具, 那就是 /etc/hosts.deny, /etc/hosts.allow 这两个可爱的配置文件!另外,如果有安装 tcp wrappers 套件时, 我们甚至可以加上一些额外的追踪功能呢!底下就让我们分别来谈谈这些玩意儿吧!


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 来控管的就是:

  1. 来源 IP 或/与 整个网域的 IP 网段;
  2. 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 写在这里,内容有点像这样:

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 两个文件呢?其实只要有一个文件存在就够了, 不过,为了配置方便起见,我们存在两个文件,其中需要注意的是:

  • 写在 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 都写在同一个文件内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:

  1. 允许进入的写在 /etc/hosts.allow 当中;
  2. 不许进入的则写在 /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 为例子来说明好了,现在假设一个比较安全的流程来配置,就是:

  1. 只允许 140.116.0.0/255.255.0.0 与 203.71.39.0/255.255.255.0 这两个网域,及 203.71.38.123 这个主机可以进入我们的 rsync 服务器;
  2. 此外,其他的 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 配置让所有其他来源不可登陆

TCP_wrappers_管理TCP Wrappers 特殊功能

那么有没有更安全的配置?例如,当有其他人扫瞄我的 rsync port 时,我就将他的 IP 记住,以做为未来的查询与认证之用呢? 是有的!只是,那就得要有额外的动作参数加在第三栏了,而且你还需要安装了 TCP Wrappers 软件才行。要确定有没有安装 TCP Wrappers 可以使用『 rpm -q tcp_wrappers 』来查询喔。至于更加细部的主要动作则有:

  • spawn (action)
    可以利用后续接的 shell 来进行额外的工作,且具有变量功能,主要的变量内容为: %h (hostname), %a (address), %d (daemon)等等;
  • twist (action)
    立刻以后续的命令进行,且运行完后终止该次联机的要求 (DENY)

为了达成追踪来源目标的相关信息的目的,此时我们需要 safe_finger 这个命令的辅助才行。而且我们还希望客户端的这个恶意者能够被警告。 整个流程可以是这样的:

  1. 利用 safe_finger 去追踪出对方主机的信息 (包括主机名、用户相关信息等);
  2. 将该追踪到的结果以 email 的方式寄给我们本机的 root ;
  3. 在对方屏幕上面显示不可登陆且警告他已经被记录的信息

由于是抵挡的机制,因此我们这个 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 所写的信息,你可以看到上面这四行共有三个冒号来隔开成四个咚咚,这四个咚咚的意义是:

  1. rsync: 指的就是 rsync 这个服务的程序啰;
  2. ALL: 指的是来源,这个范围指的当然是全部的所有来源啰,因为是 ALL 嘛!
  3. spawn (echo "security notice from host $(/bin/hostname)" ; echo ; /usr/sbin/safe_finger @%h ) | /bin/mail -s "%d-%h security" root &: 由于要将一些侦测的数据送给 root 的邮件信箱,因此需要使用数据流汇整的括号( ),括号内的重点在于 safe_finger 的项目,他会侦测到客户端主机的相关信息,然后使用管线命令将这些数据送给 mail 处理, mail 会将该信息以标头为 security 的字样寄给 root 啦!由于 spawn 只是中间的过程,所以还能够有后续的动作哩!
  4. twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" ): 这个动作会将 Warning 的字样传送到客户端主机的屏幕上! 然后将该联机中断。

在上面的例子中,第三行的 root 那个账号,可以写成你的个人账号或者其他 e-mail ,这样就能够寄到你常用的 email 啰, 这样也比较好管理啰。如此一来,当未经允许的计算机尝试登陆你的主机时,对方的屏幕上就会显示上面的最后一行,并且将他的 IP 寄到 root ( 或者是你自己的信箱 )那里去!

转载自:http://vbird.dic.ksu.edu.tw/linux_basic/0560daemons_3.php