在本节中,我们将了解在刚安装的系统上运行了哪些服务,确定我们真正需要的服务,并移除其余的服务。如果您不熟悉服务器和 TCP 连接的工作原理,您可能需要先阅读附录中关于 服务器和端口 的章节。如果您不熟悉 netstat 实用程序,您可能需要事先阅读其 概述。附录中还有一个关于 端口 和相应服务的章节。您可能也想浏览一下。
我们的目标是尽可能关闭更多的服务。如果我们能够全部关闭,或者至少对外连接关闭,那就更好了。我们将使用以下经验法则来指导我们
完全有可能在没有对外部连接开放的服务器运行的情况下,拥有完全正常工作的互联网连接。不仅可能,而且在许多情况下是可取的。这里的原则是,您永远不会通过未打开的端口被成功入侵,因为没有服务器在该端口上监听。没有服务器 == 没有端口开放 == 不易受攻击。至少对于外部连接而言。
如果您不认识某个特定的服务,那么很可能您并不真正需要它。我们将假设这一点,因此我们将关闭它。这听起来可能很危险,但这是一个很好的经验法则。
有些服务本来就不打算通过互联网运行 -- 即使您认为这是您真正需要的服务。我们会将这些标记为危险,并在后面的章节中讨论这些服务,如果您确定您真的需要它们,并且没有好的替代方案。
那么,到底有哪些服务在我们的系统上运行呢?让我们不要想当然地认为什么 “应该” 运行,或者我们 “认为” 什么在运行。
不幸的是,没有所谓的标准 Linux 安装。各种各样的可用服务器,加上每个特定发行版的安装选项,使得提供现成的列表变得不可能。最好的办法是向您展示如何列出所有正在运行的服务,并为您指明大致的方向。
# 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” 听起来重要吗?是的,但它们并非听起来那样。它们实际上是 rexec、rlogin 和 rsh,即 “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”,以供将来参考。
这并不是说我们决定保留的服务本质上是安全的。只是我们可能需要这些服务。因此,我们将不得不通过防火墙或其他方式(如下所述)来处理这些服务。
值得注意的是,上面示例中的 telnet 和 ftp 守护进程是服务器,也称为 “监听器”。这些接受传入到您的连接。您不需要或不想要这些,仅仅是为了使用 ftp 或 telnet 客户端。例如,您可以使用 ftp 客户端从 FTP 站点下载文件。在您这边运行 ftp 服务器根本不是必需的,并且具有严重的安全隐患。
在某些特定情况下,可能需要对上述结论进行例外处理。请参阅 下文。
BIND (named),DNS 服务器软件包。通过一些工作,可以做到没有太大风险,但在许多情况下是不必要的,并且无论您如何操作,都需要特殊处理。请参阅关于 例外 和 各个应用程序 特殊处理的章节。
邮件传输代理,也称为 “MTA” (sendmail、exim、postfix、qmail)。单台计算机上的大多数安装都不真正需要这个。如果您不打算直接从互联网主机(作为指定的 MX 记录)接收邮件,而是使用 ISP 的 POP 服务器,则不需要它。但是,如果您直接从局域网上的其他主机接收邮件,则可能需要它,但最初禁用它是更安全的。稍后,一旦您的防火墙和访问策略已实施,您就可以在本地接口上启用它。
这不一定是最终的列表。只是一些常见的服务,有时会在默认 Linux 安装中启动。反之,这并不意味着其他服务本质上是安全的。
下一步是找到我们kill列表中每个服务器的启动位置。如果从 netstat 输出中不明显,请使用 ps、find、grep 或 locate 从最后一列的 “程序名称” 或 “PID” 信息中查找更多信息。在附录的 netstat 教程的 进程所有者 部分中有示例。如果服务名称或端口号对您来说不熟悉,您可以在/etc/services文件中找到简要说明。
怀疑我们会破坏您的系统,并且无法恢复原状吗?如果是这样,请采取这种方法:关闭上面 “危险区域” 中列出的所有内容,并运行您的系统一段时间。可以吗?尝试停止我们发现 “不必要” 的服务之一。然后,运行系统一段时间。继续重复此过程,直到达到最低限度。如果这可行,则将更改设为永久性(见下文)。
最终目标不仅仅是现在停止服务,而是确保它永久停止!因此,无论您在此处采取什么步骤,请务必在下次重启后检查。
有各种各样的地方和方法来启动系统服务。让我们看看最常见的启动方式,这可能也是您的系统的工作方式。系统服务通常由 “init” 脚本启动,或者在大多数发行版上由 inetd(或其替代品 xinetd)启动。(init 脚本的位置可能因发行版而异。)
# ls -l /etc/init.d/ | less |
要立即停止正在运行的服务,作为 root 用户(在 SysVinit 风格的系统上,这几乎是所有人)
# /etc/init.d/<$SERVICE_NAME> stop |
这只是现在停止了此特定服务。它将在下次重启或运行级别更改时再次重启,除非采取其他步骤。因此,对于 init 类型服务来说,这实际上是一个两步过程。
# update-rc.d -f $SERVICE_NAME remove |
# chkconfig $SERVICE_NAME off |
下面是典型的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> |
上面的示例启用了两个服务:time 和 pop3。要禁用这些服务,我们只需要使用文本编辑器打开文件,使用 “#” 注释掉这两个服务,保存文件,然后重启 inetd(以 root 用户身份)
# /etc/init.d/inetd restart |
检查您的日志以查找错误,并再次运行 netstat 以验证一切顺利。
$ grep -v '^#' /etc/inetd.conf time stream tcp nowait root internal pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d |
再次强调,您看到任何您不知道是什么的东西吗?那么很可能您没有使用它,应该禁用它。
与 init 服务配置不同,这是一个持久的更改,因此只需要一个步骤。
让我们揭露一个被抛出的神话:您不应该通过注释掉或删除/etc/services中的条目来禁用服务。这在某些情况下可能会产生预期的效果,但这不是正确的方法,并且可能会干扰其他系统实用程序的正常运行。
# default: on # description: The wu-ftpd FTP server serves FTP connections. It uses \ # normal, unencrypted usernames and passwords for authentication. service ftp { disable = no socket_type = stream wait = no user = root server = /usr/sbin/in.ftpd server_args = -l -a log_on_success += DURATION USERID log_on_failure += USERID nice = 10 } |
$ grep disable /etc/xinetd.d/* |grep no /etc/xinetd.d/finger: disable = no /etc/xinetd.d/rexec: disable = no /etc/xinetd.d/rlogin: disable = no /etc/xinetd.d/rsh: disable = no /etc/xinetd.d/telnet: disable = no /etc/xinetd.d/wu-ftpd: disable = no |
此时,上面的输出应该引起一些警惕。在绝大多数系统中,以上所有内容都可以禁用,而不会产生任何不利影响。不确定吗?尝试在没有该服务的情况下运行。禁用不必要的服务后,然后重启 xinetd
# /etc/init.d/xinetd restart |
好的,如果您找不到 “正确” 的方法来停止服务,或者某个服务正在启动,但您找不到启动的方式或位置,您可以 “kill” 该进程。为此,您需要知道 PID(进程 ID)。可以使用 ps、top、fuser 或其他系统实用程序找到它。对于 top 和 ps,这将是第一列中的数字。请参阅附录中的 端口和进程所有者 部分,了解示例。
示例(以 root 用户身份)
# kill 1163 |
然后再次运行 top 或 ps 以验证该进程是否已消失。如果没有,则
# 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 |
上面我们使用了关闭所有不必要服务的标准。有时这不是很明显。有时,对于一个人的配置可能需要的服务,对于另一个人来说可能不一样。让我们看看一些属于这一类别的常见服务。
同样,我们的经验法则是,如果我们不需要它,我们就不会运行它。就这么简单。如果我们确实需要这些服务中的任何一个,它们就是通过防火墙规则或其他机制(见下文)实施一些限制性策略的主要候选者。
如果需要 identd,则有一些配置选项可以大大减少泄露的信息
/usr/sbin/in.identd in.identd -l -e -o -n -N |
BIND (named) - 这通常是默认安装的,但只有在您是域的权威名称服务器时才真正需要。如果您不确定这意味着什么,那么您肯定不需要它。BIND 可能是互联网上排名第一的黑客目标。BIND 通常也用于 “仅缓存” 模式。这可能非常有用,但不需要完全暴露于互联网。换句话说,它应该受到限制或防火墙保护。请参阅下面关于 各个应用程序 的特殊处理。