答案:内容摘要: 本文扼要地介绍, 在系统里设定 inetd 服务, 以增进系统安全的方法, 我们把焦点放在 IPFWADM 这个系统管理工具, 以及 inetd 服务的设定上面。
首先, 我们必须厘清什麽是 inetd。 简单地说, inetd 是一个伺服程式, 用以控制主机连上网路时, 所提供的各项服务。 您有可能会遇到一部电脑, 其预设状况并未设定好 inetd 来控制所有的服务, 因此, 第一件事, 便是找出 /etc/inetd.conf 档案, 并检查有哪些现存的服务由它控制 ( 也就是没有 “#“ 符号开头的那几行内容 )。 给您的第一个忠告就是, 除非真的需要这项服务, 不然千万别启动它, 那些从未使用的伺服程式里, 可能藏有臭虫, 避免有人利用此类漏洞入侵的最好方法, 就是不要用它。 假设读者手边有一份 inet.conf 档案的内容, 接下来我就解译一下里头的意义。
举例来说, 下面这一行:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a第一个字是所提供的服务名称 ( 本例中指的是 “ftp“, 我们可以另外在 /etc/services 档案里, 查出它所连结的是哪一个埠号 )。
第二个栏位是所开启的 socket 类型,它可以是: stream ( 如本例即是 )、 dgram、 raw、 rdm、 或 seqpacket。
接下来的栏位是所使用的通讯协定, 您必须先在 /etc/protocols 档案中宣告, 在前例中, 我们假定您已经在此档里宣告了 TCP 通讯协定。
在通讯协定之後, 接著是 wait/nowait 的栏位。 除了 datagram (dgram) 类型之外的 socket, 其他都应该是 nowait, 至於 datagram 类型的 socket, 如果伺服程式支援多执行绪, 那麽我们应该设定 nowait, 如果伺服程式仅支援单一执行绪, 那麽请设定为 wait。 原因是多执行绪系统, 当其收到连线要求时, 它会启动一个新的 process, 然後再把原本的 socket 释放掉, 让 inetd 可以继续 listen 其他的连线要求, 因此要使用 nowait。 在单一执行绪系统的场合, 则需要设定为 wait, 因为伺服程式会一直守著同一个 socket, 而不能另外产生 process 以供连结。 除此之外, 还有一些格式上的变化, 我们可以写成 nowait.50 -- 代表短时间内, 最多可以启动 50 个伺服程式 ( 从另一个角度来看, 或者可以说, 是接受这麽多个连线要求 )。 其预设值是 40 个。
第五个栏位, 指明了伺服程式, 是以哪位使用者的名称来执行, 在这个例子中, ftp 是以 root 这个使用者名称来执行。
第六个以及接下来的栏位, 便是执行的程式与其所接的参数了。 在我们的例子当中, 伺服程式 tcpd 被启动, 後头接了伺服程式 in.ftpd 与 -l -a 为参数。 接下来, 我们就要来谈谈最有趣的部份, TCPD 的设定问题。
嗯, tcpd 是个用来过滤连线要求的伺服程式, 它会根据哪个伺服程式即将被启动, 来决定做哪些事, 以向提出这些连线要求的 IP 位址, 做出回应的动作。 而究竟会怎麽做决定, 则视 /etc/hosts.allow 与 /etc/hosts.deny 这两个档案如何设定。
原则上, /etc/hosts.deny 档案是用来指定拒绝向哪些主机提供服务, 而 /etc/hosts.allow 档案则是用来指定允许向哪些 机提供服务。
这两个档案的设定格式如下:
DAEMON: IP[: OPTION1 [: OPTION2 ]]上述的 DAEMON, 可以是想要启动的伺服程式名称, 如前例中所示的 in.ftpd, 或者是 ALL 这个字, 它代表著所有的伺服程式。
IP 可以是某个特定的 IP, 或是某个 URL, 或是某一范围的 IP ( 或 URL ), 或者是等一下会解释到的万用字。
为了能够指定某一范围的 IP 位址, 例如说, 我们可以这样写: `123.32, 这个表示方式, 代表了 123.32.XXX.XXX 的所有 IP, 同样地, 像 `.ml.org 可以用来指定某一范围的 URL, 它代表所有 ml.org 底下的子网路。
以 IP/MASK 之格式来指定某一范围的 IP, 则是更为传统的方法, 举例来说, 从 127.0.0.0 到 127.0.255.255, 此一范围的 IP 可被指定为 127.0.0.0/255.255.0.0
前面提到的万用字有:
ALL 代表档案里, 所有可能的数值都是允许的LOCAL 会符合到所有名称里没有 ^?^?的主机UNKNOWN 代表所有名称或 IP 位址为未知的主机KNOWN 代表所有名称及 IP 位址均为已知的主机PARANOID 代表所有名称与 IP 位址并不一致的主机前面提到的选项有:
allow 不管 hosts.allow 与 hosts.deny 档案里的设定为何, 符合此一设定条件者, 都接受其连线要求。 这个选项设定, 应该置於该行的最後面。 deny 类似上面的选项设定, 不过, 它是用来指定拒绝连线的条件。 spawn 当收到连线要求时, 会启动一个命令壳的指令, 譬如说, 可以在每次有人想要从外面, 连进我的机器时, 执行一个哔声通知。 twist 这个和 spawn 选项类似, 不过, 当命令壳指令执行完毕後,连线状态便会中断。 此一选项, 同样必须置於设定行的最後面。上述的最後两个选项,还可以配合适当的扩充字元给 tcpd 使用, 这些扩充字元有:
%a 客户端主机的位址 %c 客户端的资讯 ( 可能是像 user@machine, 或是其他由客户端所得的资讯 ) %d %h 在可以取得的情况下, 这会代表客户端的名称或 IP 位址 %n 客户端的名称 %p 伺服程式的 PID %s 伺服端的资讯 ( 例如 daemon@machine 或只有 daemon 之资讯, 视情况而定 ) %u 客户端使用者的名称 %% 这是表示 % 这个字元配合这些扩充字元与选页, 您已经可以做很多事了, 例如, 我知道有人设定成, 一旦有人想要经由 telnet 连进他的主机, 便自动送出一个 teardrop 攻击 :)
附注: teardrop 是一种 Dos ( Denial of Service, 会造成系统重新开机, 或重新起始化的攻击方式 )。 它是因为 TCP 封包重组时的臭虫而起, 多数的作业系统都有这个问题 ( 或者说, 以往的作业系统是如此, 因为许多的核心程式已经针对此问题, 加以修正了 ), 在 InterNet 上的资料, 是透过 TCP/IP 通讯协定来传送 ( 此一通讯定, 在其他类型的网路上也可以看到, 譬如像 intranet 就是 ), 实际上, 它是两种通讯协定: TCP 负责将资料, 加以分割成一段段的封包, 然後再把它传给 IP 通讯协定, 由它送往目的地; 一旦资料送达目的主机後, TCP 通讯协定会检查, 是否所有封包都完整, 然後再将它们重组成原本的资料。 然而, 上述 ( 以及许多根据此一原理 ) 的攻击方式, 利用多数的作业系统, 在重组封包之前, 不会检查封包过小的问题, 因此, 这样的机器在重组封包後, 就会发生错乱的状况。 显然地, 对此在下并不确定怎样才是完整的解释, 因此欢迎大家提出各式批评与指教。 好的, 经过上述的简短解释後, 让我们继续...
范
例:
#hosts.allowALL: 127.0.0.1 # 允许 localhost 进入做所有事
in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & ) # 让所有人都可以透过 ftp 进入, # 但会启动一个声音档 ( 因此它可以警告我 )
in.telnetd: ALL: twist ( teardrop %h %h ) # 所有人想要透过 telnet 的话, # 送回一个teardrop 的攻击
#fin
#hosts.deny
ALL: `.bsa.org # 禁止来自 bsa.org 网域的所有连线
in.fingerd: ALL # 禁止所有的 fingerd 服务 :)
#fin
关於 tcpd, 我想说的就是这些了, 因为所学有限, 可能讲得不够好。 在下的建议是, 试著去实验一些设定项目, 并且熟读线上手册 ( tcpd, host_acess(5) 的 manual pages ), 相信读者可以学得比我所教的还要多。接下来, 让我们进入
I
PFWADM
工具程式的部分。
首先, 不可或缺的是, 要把核心程式中, 有关 IP Firewalling 的支援加入 ( Networking -> Network firewalls + IP: firewalling )。 接下来, 重新编译及系统重新开机後, 我们就准备好可以使用这个工具了。IPFWADM 可以让我们管理某些程式 ( 这些应用程式, 并不限於我在本文中所介绍的 ), 其 TCP、 UDP、 ICMP 封包的进出状况。 简单地说, 管理员可以规定哪些封包才允许进入, 可以指定的条件包括: 来自於某个 IP、 或某段 IP 范围的主机, 哪一个特定的埠号, 哪一种特定的通讯协定, 或是上述各种条件的组合... 同样地, 对於准备送往主机外的封包, 我们也可以具有相同程度的管理控制。
ipfwadm 有几种主要的参数:
-A 指定记录 (accounting) 之处理方式 -I 指定准备进入主机内的封包 (incoming packets) 之处理方式 -O 指定准备送往主机外的封包 (outgoing packets) 之处理方式 -F 指定封包转送 (forwarding) 之处理方式 -M 用来进行 IP masquareding 的管理 本文中, 我只打算介绍 -I 与 -O 参数, 它们两者都具有相同的语法。
这些参数的选项有:
-a 在表单後面加进一个或多个处理方式 -i 在表单前面加入一个或多个处理方式 -d 从表单里面删除一个或多个处理方式 -l 显示表单上面的处理方式 -f 删除表单上面所有的处理方式 -p 指定哪些封包一定被 acceppted (a)、 denied (d) 或 rejected (r) -c 检查某个封包准备进入时, 其应用哪些处理方式 -h 辅助说明 重要的参数有:
-P 指定某个表单上, 处理方式所作用到的通讯协定。 这里的通讯协定, 可以是 TCP、 UDP、 ICMP 或 all ( 表示所有的通讯协定 ) -S 指定封包的来源位址。 其格式为: ADDRESS[/MASK] [PORT] 举例来说, 像这样 123.32.34.0/255.255.255.250 25 便代表从 123.32.34.0 到 123.32.34.5 的 IP 范围 -D 指定封包的目的位址, 其格式与 -S 相同原则上, 这些都是最基本的参数, 因此, 想要让所有从我的电脑发出的封包, 能够到达我自己的电脑, 可以这样设定处理方式:i
pfwadm -I -i a -S 127.0.0.1
还想要挡掉来自於 123.34.22.XXX 的封包, 可以这样设定:i
pfwadm -I -a d -S 123.34.22.0/255.255.255.0
接下来, 如果除了 111.222.123.221 这个 IP 之外, 我想要挡掉所有其他对於 netbios 埠号的连线要求, 可以这样设定:i
pfwadm -I -a a -P tcp -S 111.222.123.221 139 ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139
就这些!