Linux 初学者安全指南

作者:Alex Withers

安全是当今互联网上最大的问题之一。它以某种方式影响着每个人。如果您使用 Linux,那么安全应该是您非常关心的问题。您可能会认为安全是系统管理员管理 20 台或更多机器的事情,而不是像您这样通过简单的 PPP 链路连接到互联网的普通用户的事情。这可能确实是事实,因为发生任何事情的几率都很小。您是否愿意冒险并信任您的系统开箱即用的安全性?

您的无知可能会变成不怀好意的破解者手中的强大工具,他们会试图破坏您的系统。是否真的需要了解每一个细节才能使您的系统足够安全以供安全使用?不一定,但是您可以做的最好的事情之一就是了解可用的东西。许多人被这个主题吓倒了,因为它涵盖了广泛的领域,但是您不必成为安全专家也能安全。另一方面,您确实需要愿意亲自动手。

TCP/IP 基础知识

在讨论安全之前,必须理解 TCP/IP 协议套件的基本原理。TCP/IP 有两个部分:tcpudp。我不会详细介绍它们之间的区别——主要是,tcp 是面向连接的,而 udp 是无连接的。两者都有其优点和缺点,并且用途不同。

这两种协议是在 TCP/IP 网络上运行的应用程序的底层基础。连接到 TCP/IP 网络的每台机器都有其自己的 IP 地址来唯一标识它。每个应用程序在该 IP 地址上都有其自己的端口号。与互联网的正常连接没有什么不同,因为它可以被视为一个巨大的 TCP/IP 网络。管理应用程序端口和协议的两个文件是 /etc/services 和 /etc/protocol。第一个文件 /etc/services 标识机器的服务以及每个特定服务的端口号和协议。第二个文件 /etc/protocol 只是标识 /etc/services 中使用的协议。

这两个文件仅标识每个服务、其端口号和协议。应用程序在哪里?与其让一个应用程序在后台运行,监听其各自的端口和协议,并可能生成数百个守护进程,我们只有一个:inetdinetd 监听每个服务,当它注意到远程主机发出调用时,它会派生绑定到该端口号的应用程序。inetd 如何知道哪个应用程序与哪个服务对应?它使用其配置文件 /etc/inetd.conf。此文件将 /etc/services 中找到的服务与系统上找到的应用程序匹配。

例如,让我们看一下该文件的一小部分

ftp stream tcp nowait root /usr/sbin/ftpd in.ftpd\
        -l
telnet stream tcp nowait root /usr/sbin/telnetd\
        in.telnetd
finger stream tcp nowait bin /usr/sbin/fingerd\
        in.fingerd

您可能熟悉其中一些常见的互联网应用程序。但是这一切意味着什么呢?从第一列开始,变量对应于服务、套接字类型(取决于 tcp 或 udp)、要使用的协议、wait 或 nowait(取决于 tcp 或 udp)、用户字段、要调用的应用程序或服务器以及传递给应用程序的参数。

TCP/IP 安全

所有这些中的安全问题在哪里?所有这些服务都提供对您系统的某种访问权限,并且是破解者可能破坏您系统的主要手段。我们如何监管它?让我们再次看一下上面代码块的字段。第一个字段代表服务,可以用常识来理解。如果您不使用该服务,则没有理由提供它。如果除了您自己之外没有人会使用您的机器,请在您的 /etc/inetd.conf 文件中注释掉该行。同样的事情适用于那些独立于 inetd 运行的服务,例如 Web 服务器 (httpd) 和邮件服务器 (sendmail)。每个服务器都有自己的守护进程在后台运行,必须将其杀死以消除它们作为潜在的安全风险。

下一个需要关注的字段是用户字段。以尽可能最低权限的用户身份运行应用程序。如果应用程序不需要 root 权限才能正常运行,请不要以 root 权限运行它。

最后一个需要关注的字段对于您确实需要可用的那些服务而言是最重要的。我的上面的示例在提供这些服务时效果很好,但是 inetd 没有给您太多控制权。大多数 Linux 发行版都提供了一个更好的替代方案:tcpd。此守护进程包装器代替您常用的服务器应用程序执行,并提供更多的保护。它会将服务请求记录到 syslog,并且可以根据 /etc/hosts.allow 和 /etc/hosts.deny 文件中指定的规则允许和拒绝主机。这些规则可以执行您通常无法执行的非常复杂的操作,例如允许或拒绝某些主机对某些服务的访问。它还可以根据服务访问或远程主机的请求触发应用程序。可能性的列表是无穷无尽的。有关此主题的详细信息,请参见 1997 年 8 月的 Linux Journal(第 40 期)中 Lee Brotzman 撰写的题为“用安全毯包裹您的计算机”的优秀文章。还有许多涵盖此主题的安全和管理书籍可供参考。

关注您的系统

现在您已经注释掉了那些不需要的服务,那么对于那些需要的服务您该怎么办呢?正如我们在上面讨论的那样,您可以使用 tcp 包装器,但这仅适用于 inetd 提供的服务,并且 tcpd 不一定意味着您的系统是安全的——这些应用程序仍然可能被利用。此外,那些独立于 inetd 的服务以及那些确实可以访问您系统的人员也必须考虑在内。

保持警惕

最好的做法是保持警惕。如果您开箱即用地运行新闻服务器,您可能会承担严重的安全风险。另一方面,如果您学习了所有内容,包括已知的安全漏洞,那么您就有机会搜索补丁或解决方案。还有其他替代方案,例如使用不同的程序。与其使用像 TELNET 这样的不安全的应用程序,不如使用更安全且在设计时考虑了安全漏洞的应用程序。TELNET 的安全替代品是 ssh;对于以安全漏洞而臭名昭著的 sendmail,安全的替代品是 qmail

对于拥有授权访问权限的用户,或者那些没有授权访问权限但设法获得访问权限的用户呢?有各种已知的安全漏洞、后门和其他可能被滥用的糟糕的东西。既然您无法击败他们,那就加入他们。我的意思是,了解所有关于这些漏洞利用的信息;每天都会发现新的漏洞,并且会制作补丁来补救这种情况。一些网站彻底记录了这些问题和解决方案(请参阅“资源”)。

系统也可能通过 setuid 程序被利用。这些程序在执行时以程序所有者的权限运行。这些程序甚至可以是 setuid root,因此,当执行时,它们具有 root 权限。破解者可以使用它来获得 root 权限。处理这种情况的最佳方法是了解以 root setuid 位集运行的程序可能存在的问题,并禁用那些不需要的程序。

访问限制

考虑到以上所有内容,让我们看一下一些用于内部安全的巧妙工具和方法。显然,如果有人可以访问您的系统,他们就可以破坏您的系统。要限制机器上的用户访问,您可以使用两个文件:/etc/securetty 和 /etc/login.access。第一个文件定义了 root 可以登录到哪些 tty 终端。第二个文件限制用户访问,但更加灵活。此文件中的行遵循以下格式

permission : users : origins

其中 permission 是访问权限授予 (+) 或访问权限拒绝 (-),users 是登录名、组名或 ALL 的列表,而 origins 指定用户可以从“哪里”登录。一个示例是以下行

- : ALL EXCEPT bob : ALL
此指令表示只允许 bob 从任何地方登录——其他人都被拒绝从所有 tty、主机、域等登录。
- : ALL : .anytown.state.us console
此语句拒绝除 .anytown.st.us 域中的用户和来自控制台的用户以外的所有人的访问。凭借一点想象力,人们可以为登录想出一些非常复杂的规则。
setuid

正如我上面提到的,setuid 程序可能很危险。处理这些程序的一种方法是首先找到它们。这可以通过一个简单的脚本来完成,使用 find 命令,如 列表 1 所示。

请注意,此脚本将生成一个包含敏感信息的文件。查看后,您应该将其删除。一旦您查看了列表并找到了任何不必要的脚本或程序,您可以使用 chmod 以 root 身份禁用它们,如下所示

chmod 644 filename

禁用 setuid 后,脚本或程序不再是安全风险。

工具

到目前为止,我们已经讨论了一些加强系统安全性的技术。那么测试您系统的安全性呢?它容易受到攻击吗?有后门吗?有几种工具可以回答这些问题。Satan 可以扫描系统是否存在可能成为潜在安全风险的后门或漏洞。其他程序(如 netwatchtcpdump)可以监视您系统上的网络流量。数据包嗅探器程序 SniffIt 也可以在许多方面帮助您。数据包嗅探器名声不好,因为它们可能对您的系统构成安全风险,但它们也可以帮助您找到问题。许多网络客户端/主机使用明文发送信息,这会带来严重的安全风险。

使用 sniffit,您可以测试各种组合,看看是否存在任何潜在风险。该程序可以从“资源”中显示的 URL 下载。我不会讨论编译和安装 sniffit,因为那是另一个主题。一旦您启动并运行了该程序,您就可以试驾一下。要使用交互模式(具有漂亮的基于 curses 的界面),请键入以下命令

sniffit -i

在图 1 中,您可以看到两个 IP 地址:目标地址和源地址。源 IP 正在将数据包从端口 19 发送到目标 IP 192.168.1.2。请注意,端口 19 是“chargen”,除了发送字符外,什么也不做。(数据包嗅探仅在高带宽情况下有效。)如果源端口和目标端口更改为 21,则可以拾取从 192.168.1.1 到 192.168.1.2 的任何 TELNET 会话,从而允许查看者看到 TELNET 用户在其会话中键入的内容。如果用户使用 ssh 而不是 TELNET,则查看者只会看到无用的垃圾。

图 1. SniffIt 屏幕截图

结论

我只介绍了一些安全基础知识;但是,安全远不止于此。使您的系统更安全的最佳方法是了解更多关于 Linux 安全的信息,并获取我提到的一些工具(请参阅“资源”)。安全就像哲学——没有明确的答案,只有很多问题和书籍。

资源

Alex Withers 夏季住在阿拉斯加州安克雷奇,在那里他试图说服成群的游客,他们在家中需要一台 Linux 机器。在一年中的其余时间里,您会在贡萨加大学找到他学习计算机科学。可以通过 awithers@gonzaga.edu 联系 Alex。

加载 Disqus 评论