3. 步骤 1:我们真正需要哪些服务?

在本节中,我们将了解在刚安装的系统上运行了哪些服务,确定我们真正需要的服务,并移除其余的服务。如果您不熟悉服务器和 TCP 连接的工作原理,您可能需要先阅读附录中关于 服务器和端口 的章节。如果您不熟悉 netstat 实用程序,您可能需要事先阅读其 概述。附录中还有一个关于 端口 和相应服务的章节。您可能也想浏览一下。

我们的目标是尽可能关闭更多的服务。如果我们能够全部关闭,或者至少对外连接关闭,那就更好了。我们将使用以下经验法则来指导我们

3.1. 系统审计

那么,到底有哪些服务在我们的系统上运行呢?让我们不要想当然地认为什么 “应该” 运行,或者我们 “认为” 什么在运行。

不幸的是,没有所谓的标准 Linux 安装。各种各样的可用服务器,加上每个特定发行版的安装选项,使得提供现成的列表变得不可能。最好的办法是向您展示如何列出所有正在运行的服务,并为您指明大致的方向。

现在打开一个 xterm,并 su 到 root 用户。您需要加宽窗口,以便行不会换行。使用此命令netstat -tap |grep LISTEN。这将为我们提供一个当前所有正在运行的服务器的列表,由关键字指示LISTEN,以及启动每个特定服务的 “PID”“程序名称”

# netstat -tap |grep LISTEN
  *:exec               *:*        LISTEN    988/inetd          
  *:login              *:*        LISTEN    988/inetd          
  *:shell              *:*        LISTEN    988/inetd          
  *:printer            *:*        LISTEN    988/inetd          
  *:time               *:*        LISTEN    988/inetd          
  *:x11                *:*        LISTEN    1462/X              
  *:http               *:*        LISTEN    1078/httpd          
  bigcat:domain        *:*        LISTEN    956/named           
  bigcat:domain        *:*        LISTEN    956/named           
  *:ssh                *:*        LISTEN    972/sshd            
  *:auth               *:*        LISTEN    388/in.identd
  *:telnet             *:*        LISTEN    988/inetd          
  *:finger             *:*        LISTEN    988/inetd
  *:sunrpc             *:*        LISTEN    1290/portmap
  *:ftp                *:*        LISTEN    988/inetd
  *:smtp               *:*        LISTEN    1738/sendmail: accepting connections 
  *:1694               *:*        LISTEN    1319/rpc.mountd
  *:netbios-ssn        *:*        LISTEN    422/smbd

 

请注意,为了便于阅读,上面裁剪了前三列。如果您的列表像示例一样长,那么您还有一些工作要做!您真的需要运行如此多的服务器的可能性很小。

请注意,上面的示例只是众多可能的系统配置之一。您的系统配置可能看起来非常不同。

您不理解这其中的任何含义吗?希望您已经阅读了附录中的 netstat 教程,并且理解了它的工作原理。理解上面示例中每个服务器的确切含义以及它的作用,超出了本文档的范围。如果该服务对您很重要,您将不得不查看系统的文档(例如,安装指南、man 手册等)。例如,“exec”“login”“shell” 听起来重要吗?是的,但它们并非听起来那样。它们实际上是 rexecrloginrsh,即 “r”(代表远程)命令。这些是过时的、不必要的,事实上,如果暴露于互联网,它们非常危险。

让我们对什么是必要的和不必要的,以及因此在 bigcat 上保留什么和移除什么,做一些快速的假设。由于我们正在 bigcat 上运行桌面环境,X11 当然需要保留。如果 bigcat 是某种专用服务器,那么 X11 将是不必要的。如果物理连接了打印机,则打印机 (lp) 守护进程应保留。否则,就移除它。打印服务器听起来可能无害,但由于它们可以保持端口开放,因此也是潜在的目标。如果我们计划其他主机登录到 bigcat,则 sshd(安全 Shell 守护进程)将是必要的。如果我们的局域网中有 Microsoft 主机,我们可能需要 Samba,因此 smbd 应该保留。否则,它完全是不必要的。此示例中的其他所有内容都是可选的,对于正常运行的系统不是必需的,并且可能应该移除。看到任何您不认识的东西吗?不确定吗?那就移除它!

总结一下:由于 bigcat 是一台连接了打印机的桌面电脑,我们将需要 “x11”“printer”。 bigcat 位于具有 MS 主机的局域网上,并与它们共享文件和打印,因此需要 “netbios-ssn” (smbd)。我们还需要 “ssh”,以便我们可以从其他机器登录。对于这种情况,其他一切都是不必要的。

对此感到紧张吗?如果您愿意,您可以记录您所做的任何更改,或者使用以下命令保存您从 netstat 获取的服务器列表netstat -tap |grep LISTEN > ~/services.lst。这将把它保存在您的主目录中,文件名为 “services.lst”,以供将来参考。

这并不是说我们决定保留的服务本质上是安全的。只是我们可能需要这些服务。因此,我们将不得不通过防火墙或其他方式(如下所述)来处理这些服务。

值得注意的是,上面示例中的 telnetftp 守护进程是服务器,也称为 “监听器”。这些接受传入到您的连接。您不需要或不想要这些,仅仅是为了使用 ftptelnet 客户端。例如,您可以使用 ftp 客户端从 FTP 站点下载文件。在您这边运行 ftp 服务器根本不是必需的,并且具有严重的安全隐患。

在某些特定情况下,可能需要对上述结论进行例外处理。请参阅 下文

3.2. 危险区域(或 r00t m3 pl34s3)

以下是不应通过互联网运行的服务列表。要么禁用这些服务(见下文),卸载它们,或者如果您真的需要在本地运行这些服务,请确保它们是当前的、已打补丁的版本,并且它们受到有效的防火墙保护。如果您现在还没有防火墙,请在防火墙启动并验证工作正常之前将其关闭。这些服务本质上可能是不安全的,因此是主要的黑客目标。

这不一定是最终的列表。只是一些常见的服务,有时会在默认 Linux 安装中启动。反之,这并不意味着其他服务本质上是安全的。

3.3. 停止服务

下一步是找到我们kill列表中每个服务器的启动位置。如果从 netstat 输出中不明显,请使用 psfindgreplocate 从最后一列的 “程序名称”“PID” 信息中查找更多信息。在附录的 netstat 教程的 进程所有者 部分中有示例。如果服务名称或端口号对您来说不熟悉,您可以在/etc/services文件中找到简要说明。

怀疑我们会破坏您的系统,并且无法恢复原状吗?如果是这样,请采取这种方法:关闭上面 “危险区域” 中列出的所有内容,并运行您的系统一段时间。可以吗?尝试停止我们发现 “不必要” 的服务之一。然后,运行系统一段时间。继续重复此过程,直到达到最低限度。如果这可行,则将更改设为永久性(见下文)。

最终目标不仅仅是现在停止服务,而是确保它永久停止!因此,无论您在此处采取什么步骤,请务必在下次重启后检查。

有各种各样的地方和方法来启动系统服务。让我们看看最常见的启动方式,这可能也是您的系统的工作方式。系统服务通常由 “init” 脚本启动,或者在大多数发行版上由 inetd(或其替代品 xinetd)启动。(init 脚本的位置可能因发行版而异。)

3.3.1. 停止 Init 服务

Init 服务通常在启动过程或运行级别更改期间自动启动。有一种命名方案使用符号链接来确定在任何给定运行级别启动或停止哪些服务。脚本本身应该在/etc/init.d/(或可能是/etc/rc.d/init.d/)。Red Hat、SuSE、Mandrake、Debian、Conectiva 和大多数 Linux 发行版都使用这种 init 风格。Slackware 是一个值得注意的例外(尽管最近的版本有一个选项可以这样做)!通常在 Slackware 系统上,系统服务都在一个文件中配置/etc/rc.d/rc.inet2.

您可以获取这些脚本的列表

  # ls -l /etc/init.d/ | less 

 

或使用您的发行版提供的任何工具来执行此操作。

要立即停止正在运行的服务,作为 root 用户(在 SysVinit 风格的系统上,这几乎是所有人)

 # /etc/init.d/<$SERVICE_NAME> stop

 

其中 “$SERVICE_NAME” 是 init 脚本的名称,它通常(但不总是)与服务名称本身相同。这应该在大多数发行版上奏效。较旧的 Red Hat 版本可能使用路径/etc/rc.d/init.d/代替。

这只是现在停止了此特定服务。它将在下次重启或运行级别更改时再次重启,除非采取其他步骤。因此,对于 init 类型服务来说,这实际上是一个两步过程。

您的发行版将提供用于控制在各种运行级别启动哪些服务的实用程序。基于 Debian 的系统有 update-rc.d 用于此目的,而基于 Red Hat 的系统有 chkconfig。如果您熟悉这些工具,请立即执行,然后在下次重启后再次检查。如果您不熟悉这些工具,请查看 man 手册并立即学习!这是您需要了解的内容。对于 Debian(其中$SERVICE_NAME是 init 脚本名称)

 
  # update-rc.d -f $SERVICE_NAME remove
 
 

和 Red Hat

 
 # chkconfig $SERVICE_NAME off
 
 

这里的另一个选择是卸载软件包,如果您知道您不需要它。这是一个非常可靠、永久的修复方法。这也减轻了保持所有已安装软件包更新和最新的潜在问题(步骤 2)。并且,软件包管理系统(如 RPMDEB)使得在您改变主意时重新安装软件包非常容易。

3.3.2. Inetd

Inetd 被称为 “超级守护进程”,因为它用于生成子守护进程。inetd 本身通常会通过 init 脚本启动,并将根据其配置文件中启用的服务 “监听” 各种端口,/etc/inetd.conf。此处列出的任何服务都将受 inetd 控制。同样,netstat 输出中列出 “inetd”“程序名称” 下最后一列中的任何监听服务器,都将由 inetd 启动。您将必须调整 inetd 配置以停止这些服务。xinetd 是增强型的 inetd 替代品,配置方式不同(请参阅下面的下一节)。

下面是典型的inetd.conf的部分片段。行首带有 “#” 的任何服务都 “注释掉” 了,因此会被 inetd 忽略,并因此被禁用。

#
# inetd.conf  This file describes the services that will be available
#    through the INETD TCP/IP super server.  To re-configure
#    the running INETD process, edit this file, then send the
#    INETD process a SIGHUP signal.
#
# Version:  @(#)/etc/inetd.conf  3.10  05/27/93
#
# Authors:  Original taken from BSD UNIX 4.3/TAHOE.
#    Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#
# Modified for Debian Linux by Ian A. Murdock <imurdock@shell.portal.com>
#
# Echo, discard, daytime, and chargen are used primarily for testing.
#
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo  stream  tcp  nowait  root  internal
#echo  dgram  udp   wait    root  internal
#discard  stream  tcp  nowait  root  internal
#discard  dgram  udp   wait    root  internal
#daytime  stream tcp   nowait  root  internal
#daytime  dgram  udp   wait    root  internal
#chargen  stream tcp   nowait  root  internal
#chargen  dgram  udp   wait    root  internal
time  stream    tcp   nowait  root  internal
#
# These are standard services.
#
#ftp     stream  tcp   nowait  root  /usr/sbin/tcpd  in.ftpd -l -a
#telnet  stream  tcp   nowait  root  /usr/sbin/tcpd  in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rshd
#login  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rlogind
#exec   stream  tcp  nowait  root  /usr/sbin/tcpd  in.rexecd
#comsat dgram   udp  wait    root  /usr/sbin/tcpd  in.comsat
#talk   dgram   udp  wait    root  /usr/sbin/tcpd  in.talkd
#ntalk  dgram   udp  wait    root  /usr/sbin/tcpd  in.ntalkd
#dtalk  stream  tcp  wait    nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop2d
pop-3    stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d
#imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd
#
# The Internet UUCP service.
#
#uucp  stream tcp nowait uucp /usr/sbin/tcpd  /usr/lib/uucp/uucico -l
#

<snip>

 

上面的示例启用了两个服务:timepop3。要禁用这些服务,我们只需要使用文本编辑器打开文件,使用 “#” 注释掉这两个服务,保存文件,然后重启 inetd(以 root 用户身份)

  # /etc/init.d/inetd restart  
 

 

检查您的日志以查找错误,并再次运行 netstat 以验证一切顺利。

使用 grep 获取相同信息的更快方法

 $ grep  -v '^#' /etc/inetd.conf
 time     stream  tcp     nowait  root  internal
 pop-3    stream  tcp     nowait  root  /usr/sbin/tcpd  ipop3d

 

再次强调,您看到任何您不知道是什么的东西吗?那么很可能您没有使用它,应该禁用它。

与 init 服务配置不同,这是一个持久的更改,因此只需要一个步骤。

让我们揭露一个被抛出的神话:您不应该通过注释掉或删除/etc/services中的条目来禁用服务。这在某些情况下可能会产生预期的效果,但这不是正确的方法,并且可能会干扰其他系统实用程序的正常运行。

3.3.4. 当所有其他方法都失败时

好的,如果您找不到 “正确” 的方法来停止服务,或者某个服务正在启动,但您找不到启动的方式或位置,您可以 “kill” 该进程。为此,您需要知道 PID(进程 ID)。可以使用 pstopfuser 或其他系统实用程序找到它。对于 topps,这将是第一列中的数字。请参阅附录中的 端口和进程所有者 部分,了解示例。

示例(以 root 用户身份)

 # kill 1163

 

然后再次运行 topps 以验证该进程是否已消失。如果没有,则

 # kill -KILL 1163

 

请注意其中的第二个 “KILL”。这必须由进程的所有者或 root 用户完成。现在去查找此进程是如何以及在哪里启动的 ;-)

文件/proc系统也可以用于查找有关每个进程的更多信息。有了 PID,我们可以找到神秘进程的路径

 $ /bin/ps ax|grep tcpgate
  921 ?   S    0:00        tcpgate

 

 # ls -l /proc/921/exe
 lrwxrwxrwx 1 root  root  0 July 21 12:11 /proc/921/exe -> /usr/local/bin/tcpgate

 

3.4. 例外

上面我们使用了关闭所有不必要服务的标准。有时这不是很明显。有时,对于一个人的配置可能需要的服务,对于另一个人来说可能不一样。让我们看看一些属于这一类别的常见服务。

同样,我们的经验法则是,如果我们不需要它,我们就不会运行它。就这么简单。如果我们确实需要这些服务中的任何一个,它们就是通过防火墙规则或其他机制(见下文)实施一些限制性策略的主要候选者。

3.5. 步骤 1 的总结和结论

在本节中,我们学习了如何识别系统上正在运行哪些服务,并获得了一些关于如何确定哪些服务可能是必要的技巧。然后,我们学习了如何找到服务的启动位置,以及如何停止它们。如果这还没有理解,现在是重新阅读上述内容的好时机。

希望您已经采取了上述步骤。务必再次使用 netstat 测试您的结果,只是为了验证是否已达到预期的目的,并且只有真正需要的服务正在运行。

在下次重启后、每次升级软件包时(以确保新的配置不会偷偷溜进来)以及每次系统升级或新安装后,也最好这样做。