Linux 的心跳信号,第 3 部分
欢迎回到系统管理员专栏。现在又到了深入探索您的 Linux 系统的灵魂,理解其微妙的奥秘,并且可能,仅仅是可能,在黑客造成损害之前抓住他们的时机了。
日志文件可能会变得非常大。一个活跃的服务器是一个健谈的服务器,而来自您的 Linux 系统的对话意味着日志条目。大量的日志条目。多年来,我见过日志文件不受控制地增长,直到系统因磁盘空间不足而崩溃。当然,现在我们都有了 40GB 的 PC 驱动器,情况没有那么糟糕了,但是混乱就是混乱,需要不时地清理。我开玩笑说,在没有 logrotate 命令的旧时代,我不得不修剪自己的日志文件,然后步行 14 英里去上学(上坡,双向)。好吧,修剪日志文件的部分是真的,而且在某个时候,我突然想到并非每个人都在他们的系统上安装了 logrotate。
如果您不知道,logrotate 是一个由 Erik Troan 编写的漂亮的小工具,它可以处理所有这些归档日志和重新创建日志的繁琐工作。如果您正在运行 Red Hat,那么您几乎肯定已经安装了 logrotate。事实上,您应该在您的 /etc/cron.daily 目录中看到它的条目。这是一个简单的脚本,它使用默认配置 /etc/logrotate.conf 调用 logrotate。另一个迹象是您的 /var/log 目录中存在带有 .1、.2、.3 和 .4 扩展名的文件。在我深入了解日志轮替的细节之前,我应该先告诉您,您的 cron.daily、cron.weekly 和 cron.some_time 文件的执行时间可以在 /etc/crontab 中找到。这只是一个文本文件,您可以使用 cat /etc/crontab 查看它。
现在,回到 logrotate。如果您的系统上没有该程序,则可以从 ftp://ftp.redhat.com/pub/redhat/code/logrotate/ 获取 logrotate 的源代码。
然后,解压并构建 logrotate
tar -xzvf logrotate-3.3.tar.gz cd logrotate-3.3 make make install
下一步是编辑 /etc/logrotate.conf,它定义了 logrotate 的功能和方式。配置参数存在于全局配置文件和每个子系统的配置文件中。全局文件(默认情况下)是 /etc/logrotate.conf,而子系统特定的定义位于目录 /etc/logrotate.d 中。例如,在我的默认全局文件中,我有以下参数
rotate 4 create errors marcel include /etc/logrotate.d
“rotate”参数告诉系统保留四个存档日志副本。第五次将转储指定的“.4”文件。“create”关键字告诉 logrotate 在归档后创建一个新的空文件。“errors marcel”则告诉 logrotate 通过电子邮件将任何错误发送给我。通常,这设置为 root。下一行是 Red Hat 行,它定义每个软件包单独记录日志。列出的目录是这些文件的保存位置。如果您愿意,您可以将自己的定义写入您的 /etc/logrotate.conf 文件中。格式如下
"/var/log/some_log_file" { rotate 5 weekly mail user@mydomain.com postrotate /sbin/killall -HUP syslogd endscript }
每个定义或段落都以日志文件的完整路径名开头,后跟 花括号 内的多个选项。让我们分解上面的示例。“rotate 5”将覆盖我在全局配置中设置的默认值 4。“weekly”告诉 logrotate 每七天轮替一次文件,而不是默认的每天(记住,我在 /etc/cron.daily 中运行 logrotate)。然后,程序将最新的文件邮寄给我,之后它会重新启动 syslogd 守护程序。此重启是一种“脚本中的脚本”,以“postrotate”参数开始,后跟一个或多个之后要执行的命令。最后,“endscript”结束这个迷你脚本。另一个右尖括号结束整个内容。
即使您已经在系统上安装并设置了 logrotate,情况也会发生变化,您可能会认为更改进程运行的时间和频率更有意义。最近,我自己也有理由更改它。在我的 Red Hat 系统上,logrotate 在处理我的 Apache 服务器文件方面做得很好,直到... 我下载了一个新的 Apache,使用 mod_ssl、mod_php 和其他一些东西重新编译了它。Red Hat 将 Apache 日志文件存储在 /var/log/httpd 中,而新的 Apache 安装将其日志存储在 /usr/local/apache/logs 中。我意识到我本可以在第一次构建 Apache 时更改所有这些,但我没有,并且决定保持原样,因为 Apache 似乎喜欢这样。问题是我的日志不断增长,除了磁盘空间之外,没有什么可以阻止它们。
继续其他事情!上次,我告诉您一个叫做 logcheck 的东西,这是一个简化浏览您的日志文件以寻找让您说“嗯……”并聪明地挠挠下巴的东西的小工具。当然,您要寻找的一件事是可怕的系统黑客可能正在尝试渗透您的系统的迹象。黑客的问题在于,他们不会只是坐在那里并通过 telnet 连接到您的系统并尝试不同的密码 — 如果他们想在尝试破坏您的安全时避免引起注意,就不会这样做。最有可能的第一次攻击是使用像 nmap 这样的工具进行的隐蔽端口扫描,我们在之前的 专栏 中讨论过它。
“隐蔽”意味着隐藏,这意味着通常此信息不会显示在您的日志中。防御潜在黑客的最佳方法是在他们仍在忙于扫描您的网络以寻找漏洞时抓住他们并将他们报告给他们的 ISP。所以,您问,如果扫描是隐蔽的,您将如何找到它们?好问题。一个好的答案来自 Psionic 的那些疯狂的人(他们也为您带来了 logcheck),一个名为 PortSentry 的工具。与“logcheck”结合使用,PortSentry 是帮助您识别系统潜在威胁的理想方式。您可以从 http://www.psionic.com/abacus/portsentry/ 获取最新版本的 PortSentry。
最新版本是 portsentry-1.0.tar.gz。要安装它,请将文件解压到一个临时目录中并构建该软件。
tar -xzvf portsentry-1.0.tar.gz cd portsentry-1.0 make linux make install
在您实际输入“make”之前,您可能需要阅读 README.install 文件,该文件将为您提供比我在这篇短文中可以提供的更多的详细信息。您可能还希望通过编辑 portsentry_config.h 在 编译之前修改某些文件的路径。在我的系统上,我只是采用了所有默认值并继续编译。
在您构建并安装该程序后,您可能需要编辑 portsentry.ignore 文件。您会在目录 /usr/local/psionic/portsentry/ 中找到它。此文件包含您不想阻止的 IP 地址列表。默认情况下,您将列出 127.0.0.1 和 0.0.0.0。最好在此处输入您的本地主机地址。
接下来,您应该编辑 portsentry.conf 文件,该文件与 portsentry.ignore 位于同一目录中。查找讨论 KILL_ROUTE 命令的部分。根据您的操作系统或内核版本,您可能正在使用 route、ipfwadm 或 ipchains 来动态阻止恶意流量。这是我为我的 Red Hat 6.1 系统取消注释的部分。请注意,您只能取消注释一个 KILL_ROUTE 命令。
# New ipchain support for Linux kernel version 2.102+ KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l" #
portsentry.conf 文件还有许多其他选项,我建议您至少看一下它。例如,您可以配置 PortSentry 在检测到扫描时运行特定命令。文本建议您呼叫寻呼机。Psionic 还包括关于您应该如何对检测到扫描做出反应的一些警告。理所当然。这是另一个 Marcel 的肥皂箱演讲,已缩短,以免考验您的耐心。
[Marcel 走上他的一个肥皂箱。] 您必须运用您的判断力。仅仅因为有些人想抓住您,并不意味着所有人都想抓住您。一次端口扫描不一定是入侵尝试。例如,我有一次在没有 SSL 的情况下启动了我的 Web 服务器。有人尝试使用 “https://” 而不是 “http://” 连接将会发出警报。我不想因为我的健忘而举报这个人。[Marcel 现在走下他的肥皂箱。] 当然,如果一个地址扫描了您所有的端口,他们很可能居心不良。
最后,您要启动 PortSentry。我使用最敏感的模式,并且我总是通过将其放入我的 /etc/rc.d/rc.local 脚本中在启动时重新启动它。以下是如何在高级 TCP 模式下运行它
/usr/local/psionic/portsentry/portsentry -atcp
当 portsentry 检测到入侵尝试或端口扫描时,它可以自动锁定该地址,方法是在您的 /etc/hosts.deny 文件中添加一个条目,从而拒绝所有 TCP 封装的服务。正如我在上面提到的,它还将发出路由命令以阻止攻击者,或者使用 “ipfwadm” 或 “ipchains” 将规则添加到您的防火墙配置中。以下是 portsentry 和 logcheck 报告的对我系统进行实际扫描的示例。实际报告有数百行长,因为这个潜在的黑客扫描了我系统上的每个端口,无论是真实的还是虚构的。我知道您会感谢我尽可能地缩短它。我还篡改了 IP 地址以隐藏扫描的来源。
Active System Attack Alerts =-=-=-=-=-=-=-=-=-=-=-=-=-= Jul 7 21:46:04 website portsentry[462]: attackalert: SYN/Normal scan from host: 264.63.97.521.some.domain.com/264.63.97.521 to TCP port: 449 Jul 7 21:46:04 website portsentry[462]: attackalert: Host 264.63.97.521 has been blocked via wrappers with string: "ALL: 264.63.97.521" Jul 13 17:44:53 website portsentry[31279]: attackalert: Host 264.63.97.521 has been blocked via dropped route using command: "/sbin/ipchains -I input -s 264.63.97.521 -j DENY -l"
还有很多,列出了数百个端口,但您明白了。然后,logcheck 程序通过电子邮件将此信息发送到我的场外位置,在那里我可以研究它并采取适当的措施。这绝不是针对入侵的万无一失的灵丹妙药。始终密切关注您的系统并定期备份。监视可能的入侵者不能保证永远不会有人突破您的安全防线。正如我之前所说,您必须睡觉。没有什么事是完美的,但是掌握并定期监控您的日志,以及使用 logcheck 和 PortSentry 等工具来突出显示问题点,将对预防产生奇效。直到下次,请记住您的 Linux 系统正在与您对话。您在倾听吗?
电子邮件:ljeditors@ssc.com