contents
下一主题: tcpd 访问控制 上一层: 各种网络应用 前一主题: 各种网络应用

inetd 超级服务器

通常,服务是由所谓的守护进程执行的。守护进程是一个程序,它打开一个特定的端口,并等待传入的连接。如果发生连接,它会创建一个子进程来接受连接,而父进程继续监听进一步的请求。这种概念的缺点是,对于提供的每个服务,都必须运行一个守护进程来监听端口上的连接,这通常意味着浪费系统资源,例如交换空间。

因此,几乎所有安装都会运行一个“超级服务器”,它为多个服务创建套接字,并使用 select(2) 系统调用同时监听所有这些套接字。当远程主机请求其中一项服务时,超级服务器会注意到这一点,并派生为该端口指定的服务器。

常用的超级服务器是 inetd,即 Internet 守护进程。它在系统启动时启动,并从名为 /etc/inetd.conf 的启动文件中获取它要管理的服务列表。除了那些被调用的服务器之外,还有许多由 inetd 本身执行的简单服务,称为内部服务。它们包括 chargen,它只是生成一个字符字符串,以及 daytime,它返回系统对当天时间的理解。

此文件中的一个条目由单行组成,该行由以下字段构成

           service type protocol wait user server cmdline

每个字段的含义如下
服务 (service)
给出服务名称。服务名称必须通过在 /etc/services 文件中查找来转换为端口号。此文件将在下面的 10.3 节中描述。
类型 (type)
指定套接字类型,可以是 stream(用于面向连接的协议)或 dgram(用于数据报协议)。因此,基于 TCP 的服务应始终使用 stream,而基于 UDP 的服务应始终使用 dgram。
协议 (protocol)
命名服务使用的传输协议。这必须是在协议文件中找到的有效协议名称,也将在下面解释。
等待 (wait)
此选项仅适用于 dgram 套接字。它可以是 wait 或 nowait。如果指定 wait,则 inetd 在任何时候都只为指定的端口执行一个服务器。否则,它将在执行服务器后立即继续监听端口。这对于“单线程”服务器很有用,这些服务器读取所有传入的数据报,直到没有更多数据报到达,然后退出。大多数 RPC 服务器都属于这种类型,因此应指定 wait。相反的类型,“多线程”服务器,允许无限数量的实例并发运行;这种情况很少使用。这些服务器应指定 nowait。stream 套接字应始终使用 nowait。
用户 (user)
这是进程在其下执行的用户的登录 ID。这通常是 root 用户,但某些服务可能使用不同的帐户。在这里应用最小权限原则是一个非常好的主意,该原则指出,如果程序不需要特权帐户即可正常运行,则不应在特权帐户下运行命令。例如,NNTP 新闻服务器将以 news 身份运行,而可能构成安全风险的服务(例如 tftp 或 finger)通常以 nobody 身份运行。
服务器 (server)
给出要执行的服务器程序的完整路径名。内部服务用关键字 internal 标记。
命令行 (cmdline)
这是要传递给服务器的命令行。这包括参数 0,即命令名。通常,这将是服务器的程序名,除非程序在被不同的名称调用时行为不同。对于内部服务,此字段为空。

图: /etc/inetd.conf 文件示例

                #
                # inetd services
                ftp       stream tcp nowait root   /usr/sbin/ftpd    in.ftpd -l
                telnet    stream tcp nowait root   /usr/sbin/telnetd in.telnetd -b/etc/issue
                #finger    stream tcp nowait bin    /usr/sbin/fingerd in.fingerd
                #tftp      dgram  udp wait   nobody /usr/sbin/tftpd   in.tftpd
                #tftp      dgram  udp wait   nobody /usr/sbin/tftpd   in.tftpd /boot/diskless
                login     stream tcp nowait root   /usr/sbin/rlogind in.rlogind
                shell     stream tcp nowait root   /usr/sbin/rshd    in.rshd
                exec      stream tcp nowait root   /usr/sbin/rexecd  in.rexecd
                #
                #       inetd internal services
                #
                daytime   stream tcp nowait root internal
                daytime   dgram  udp nowait root internal
                time      stream tcp nowait root internal
                time      dgram  udp nowait root internal
                echo      stream tcp nowait root internal
                echo      dgram  udp nowait root internal
                discard   stream tcp nowait root internal
                discard   dgram  udp nowait root internal
                chargen   stream tcp nowait root internal
                chargen   dgram  udp nowait root internal

finger 服务被注释掉了,因此它不可用。这通常是出于安全原因而做的,因为它可能被攻击者用来获取您系统上用户的姓名。

tftp 也被注释掉了。tftp 实现了简单文件传输协议,该协议允许从您的系统传输任何全局可读的文件,而无需密码检查等。这对于 /etc/passwd 文件尤其有害,如果您不使用影子密码,则更是如此。

TFTP 通常被无盘客户端和 X 终端用于从引导服务器下载代码。如果出于此原因需要运行 tftpd,请确保将其范围限制为客户端将从中检索文件的那些目录,方法是将这些目录名称添加到 tftpd 的命令行中。这在示例中的第二行 tftp 行中显示。


contents
下一主题: tcpd 访问控制 上一层: 各种网络应用 前一主题: 各种网络应用

Andrew Anderson
1996 年 3 月 7 日星期四 23:22:06 EST