如何使用Tripwire检测Ubuntu VPS上的服务器入侵

介绍

在管理在线服务器时,安全是一个非常复杂的问题。虽然可以配置防火墙,fail2ban策略,安全服务和锁定应用程序,但很难确定您是否有效阻止了每个攻击。 基于主机的入侵检测系统(HIDS)通过收集有关计算机文件系统和配置的详细信息来工作。然后它存储此信息以引用和验证系统的当前状态。如果在已知良好状态和当前状态之间发现更改,则可能是您的安全已被破坏的迹象。 在Linux上流行的基于主机的入侵检测系统的 绊索 。该软件可以跟踪许多不同的文件系统数据点,以便检测是否发生了未授权的更改。 在本文中,我们将讨论如何在Ubuntu 12.04安装上安装和配置tripwire。由于入侵检测系统的性质,最好在创建服务器后立即通过本指南,以便您可以验证文件系统是否干净。

安装Tripwire

幸运的是,tripwire可以在Ubuntu的默认存储库中找到。 我们可以安装它 apt-get通过键入:
sudo apt-get update
sudo apt-get install tripwire
此安装将通过相当多的配置所需的软件包运行。 首先,它将配置作为依赖关系拉入的邮件应用程序。如果要配置电子邮件通知,请选择“互联网站点”。 它会询问您是否要在安装过程中选择密码。对这两个提示都选择“是”。它会询问是否可以重建配置文件。选择“是”。它会问一个类似的问题关于策略文件。再次,回答“是”。 接下来,您将被要求选择并确认网站密钥密码。 Tripwire使用两个密钥来保护其配置文件。
  • 网站键 :此键是用来固定配置文件。我们需要确保配置文件不被修改,否则我们的整个检测系统都不能被信任。由于相同的配置文件可以用于多个服务器,因此可以跨服务器使用此密钥。
  • 地方重点 :该键用于每台机器上运行的二进制文件。这是必要的,以确保我们的二进制文件不经未经我们同意运行。
您将首先选择并确认网站键的密码,然后选择本地键。确保选择强密码。

初始化数据库

安装后,必须初始化和配置安装。与大多数安全程序一样,tripwire附带通用但严格的默认值,可能需要对您的特定安装进行微调。 首先,如果您在安装期间没有选择“是”来创建策略文件,则可以通过发出以下命令来执行此操作:
sudo twadmin --create-polfile /etc/tripwire/twpol.txt
系统将提示您输入之前配置的网站密码。 这将创建从我们在指定的纯文本之一的加密策略文件 /etc/tripwire/目录下。这个加密文件是tripwire在运行其检查时实际读取的。 我们现在可以初始化tripwire将用来验证我们的系统的数据库。这使用我们刚刚启动的策略文件,并检查其中指定的点。 因为这个文件还没有为我们的系统量身定做,所以我们会有很多警告,误报和错误。我们将使用这些作为参考,稍微调整我们的配置文件。 初始化数据库的基本方法是运行:
sudo tripwire --init
这将创建我们的数据库文件,并抱怨我们必须在配置中调整的事情。 因为我们想保存结果以通知我们的配置决定,我们可以抓取任何提到文件的实例,并将其放在tripwire配置目录中的文件中。我们可以运行检查,并将列入一个名为文件 test_results在我们的绊索config目录:
sudo sh -c 'tripwire --check | grep Filename > test_results'
如果我们查看此文件,我们应该看到如下所示的条目:
less /etc/tripwire/test_results
Filename: /etc/rc.boot
Filename: /root/mail
Filename: /root/Mail
Filename: /root/.xsession-errors
. . .

配置策略文件以匹配系统

现在我们有一个列出tripwire的文件列表,我们可以浏览我们的策略文件并编辑它以摆脱这些误报。 使用root权限在编辑器中打开纯文本策略:
sudo nano /etc/tripwire/twpol.txt
做为每个在被返回的文件的搜索 test_results文件。注释掉你发现匹配的所有行。 在“启动脚本”部分,你应该注释掉 /etc/rc.boot线,因为这是不存在于Ubuntu系统:
(
  rulename = "Boot Scripts",
  severity = $(SIG_HI)
)
{
        /etc/init.d             -> $(SEC_BIN) ;
        #/etc/rc.boot            -> $(SEC_BIN) ;
        /etc/rcS.d              -> $(SEC_BIN) ;
有很多的文件 /root ,需要我的系统上进行注释主目录。任何不在你的系统上的东西都应该注释掉:
(
  rulename = "Root config files",
  severity = 100
)
{
        /root                           -> $(SEC_CRIT) ; # Catch all additions to /root
        #/root/mail                     -> $(SEC_CONFIG) ;
        #/root/Mail                     -> $(SEC_CONFIG) ;
        #/root/.xsession-errors         -> $(SEC_CONFIG) ;
        #/root/.xauth                   -> $(SEC_CONFIG) ;
        #/root/.tcshrc                  -> $(SEC_CONFIG) ;
        #/root/.sawfish                 -> $(SEC_CONFIG) ;
        #/root/.pinerc                  -> $(SEC_CONFIG) ;
        #/root/.mc                      -> $(SEC_CONFIG) ;
        #/root/.gnome_private           -> $(SEC_CONFIG) ;
        #/root/.gnome-desktop           -> $(SEC_CONFIG) ;
        #/root/.gnome                   -> $(SEC_CONFIG) ;
        #/root/.esd_auth                        -> $(SEC_CONFIG) ;
        #/root/.elm                     -> $(SEC_CONFIG) ;
        #/root/.cshrc                   -> $(SEC_CONFIG) ;
        /root/.bashrc                   -> $(SEC_CONFIG) ;
        #/root/.bash_profile            -> $(SEC_CONFIG) ;
        #/root/.bash_logout             -> $(SEC_CONFIG) ;
        /root/.bash_history             -> $(SEC_CONFIG) ;
        #/root/.amandahosts             -> $(SEC_CONFIG) ;
        #/root/.addressbook.lu          -> $(SEC_CONFIG) ;
        #/root/.addressbook             -> $(SEC_CONFIG) ;
        #/root/.Xresources              -> $(SEC_CONFIG) ;
        #/root/.Xauthority              -> $(SEC_CONFIG) -i ; # Changes Inode number on login
        #/root/.ICEauthority                -> $(SEC_CONFIG) ;
}
我检查的最后一部分是抱怨的文件描述符 /proc文件系统。这些文件会一直更改,因此如果我们保留配置,将定期触发误报。 在“设备和核心信息”部分,你可以看到 /proc文件系统被列为进行检查。
(
  rulename = "Devices & Kernel information",
  severity = $(SIG_HI),
)
{
        /dev            -> $(Device) ;
        /proc           -> $(Device) ;
}
但是,这将检查其下的每个文件。我们不是特别想要的。相反,我们将删除此规范,并添加配置选项下的所有目录中 /proc ,我们 确实想查询:
{
        /dev                    -> $(Device) ;
        #/proc                  -> $(Device) ;
        /proc/devices           -> $(Device) ;
        /proc/net               -> $(Device) ;
        /proc/tty               -> $(Device) ;
        /proc/sys               -> $(Device) ;
        /proc/cpuinfo           -> $(Device) ;
        /proc/modules           -> $(Device) ;
        /proc/mounts            -> $(Device) ;
        /proc/dma               -> $(Device) ;
        /proc/filesystems       -> $(Device) ;
        /proc/interrupts        -> $(Device) ;
        /proc/ioports           -> $(Device) ;
        /proc/scsi              -> $(Device) ;
        /proc/kcore             -> $(Device) ;
        /proc/self              -> $(Device) ;
        /proc/kmsg              -> $(Device) ;
        /proc/stat              -> $(Device) ;
        /proc/loadavg           -> $(Device) ;
        /proc/uptime            -> $(Device) ;
        /proc/locks             -> $(Device) ;
        /proc/meminfo           -> $(Device) ;
        /proc/misc              -> $(Device) ;
}
虽然我们在文件中的这一部分,我们也希望做的事情 /dev/pts文件系统。 Tripwire的默认不会检查的位置,因为它被告知要检查 /dev/dev/pts是在一个单独的文件系统,除非指定它不会进入。要让tripwire检查这一点,我们可以在这里明确命名:
{
        /dev                    -> $(Device) ;
        /dev/pts                -> $(Device) ;
        #/proc                  -> $(Device) ;
        /proc/devices           -> $(Device) ;
        /proc/net               -> $(Device) ;
        /proc/tty               -> $(Device) ;
        . . .
我们将注释掉的最后一件事是 /var/run ,并 /var/lock线,从而使我们的系统不按服务标志不正常的文件系统的变化:
(
  rulename = "System boot changes",
  severity = $(SIG_HI)
)
{
        #/var/lock              -> $(SEC_CONFIG) ;
        #/var/run               -> $(SEC_CONFIG) ; # daemon PIDs
        /var/log                -> $(SEC_CONFIG) ;
}
编辑完成后保存并关闭文件。 现在我们的文件已配置,我们需要通过重新创建tripwire实际读取的加密策略文件来实现它:
sudo twadmin -m P /etc/tripwire/twpol.txt
创建之后,我们必须重新初始化数据库以实现我们的策略:
sudo tripwire --init
Please enter your local passphrase:
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***
Wrote database file: /var/lib/tripwire/tripit.twd
The database was successfully generated.
你早些时候收到的所有警告都应该消失了。如果还有警告,你应该继续编辑 /etc/tripwire/twpol.txt文件,直到他们都不见了。

验证配置

如果你的数据库初始化没有抱怨任何文件,那么你的配置应该匹配你的系统在这一点上。但是我们应该检查一下,看看tripwire报告是什么样的,如果没有真正的警告: 检查的基本语法是:
sudo tripwire --check
您应该会看到一个报告输出到您的屏幕,指定在您的系统上没有发现错误或更改。 一旦完成,您可以相当确信您的配置是正确的。我们应该清理我们的文件,以从我们的系统中删除敏感信息。 我们可以删除 test_results我们创建的文件:
sudo rm /etc/tripwire/test_results
我们可以做的另一件事是删除实际的纯文本配置文件。我们可以安全地做到这一点,因为它们可以使用我们的密码从加密文件中随意生成。 我们要重新生成纯文本文件所需要做的就是将encripted文件传递给twadmin,这与我们生成加密版本的方式大致相同。我们只是管道它到一个纯文本文件:
sudo sh -c 'twadmin --print-polfile > /etc/tripwire/twpol.txt'
现在,通过将文本版本移动到备份位置进行测试,然后重新创建:
sudo mv /etc/tripwire/twpol.txt /etc/tripwire/twpol.txt.bak
sudo sh -c 'twadmin --print-polfile > /etc/tripwire/twpol.txt'
如果它工作正常,您现在可以安全地删除纯文本文件:
sudo rm /etc/tripwire/twpol.txt
sudo rm /etc/tripwire/twpol.txt.bak

设置电子邮件通知

我们将配置tripwire每天运行,并实施自动通知。在此过程中,我们可以测试当我们更改系统时如何更新数据库。 我们将使用 mail命令给我们的通知邮件到我们的邮箱。这当前没有安装在我们的系统上,所以我们必须从存储库下载它。 这给了我们一个很好的机会,看看tripwire如何对系统的变化做出反应。 安装这样的文件:
sudo apt-get install mailutils
现在我们已经安装了该命令,让我们测试我们的系统发出tripwire报告的能力。此报告也将有警告和更改,因为我们刚刚安装新软件没有告诉tripwire:
sudo tripwire --check | mail -s "Tripwire report for `uname -n`" your_email@domain.com
您应该在您的电子邮件中收到一个报告,其中包含您刚刚安装的新邮件软件的详细信息,以便发送邮件!这是好的。这意味着tripwire正在拾取文件系统中的更改,我们的邮件软件也正常工作。 我们现在应该“okay”我们做的软件更改,通过交互式检查更新数据库。 我们可以通过键入:
sudo tripwire --check --interactive
这将运行与正常相同的测试,但最后,而不是输出报告到屏幕,它被复制到一个文本文件,并使用默认编辑器打开。 这份报告包含了每个文件的变化。事实上,在我的机器上,生成的报告是2,275行长。这个数量的信息在真正的安全问题的情况下是非常有用的,但在我们的情况下,它通常可能不是太有趣的大部分。 重要的部分是靠近顶部。在介绍一些信息后,您应该看到一些带有复选框的行,每个添加或修改的文件:
Rule Name: Other binaries (/usr/sbin)
Severity Level: 66
-------------------------------------------------------------------------------

Remove the "x" from the adjacent box to prevent updating the database
with the new values for this object.

Added:
[x] "/usr/sbin/maidag"

Modified:
[x] "/usr/sbin"
. . .
这些复选框表示您要更新数据库以允许这些更改。您应该搜索每个包含“x”的框,并验证这些是您所做的更改或可以更改。 如果您不满意更改,您可以从框中删除“x”,该文件将不会在数据库中更新。这将导致此文件在下次运行时仍然标记tripwire。 在确定哪些文件更改正常后,您可以保存并关闭文件。 此时,它将要求您的本地密码,以便tripwire可以更新其数据库文件。 如果我们接受所有的更改,如果我们重新运行此命令,报告应该现在更短,并列出没有更改。

使用Cron自动化Tripwire

现在我们已经验证所有这些功能都是手动工作的,我们可以设置一个cron作业,每天早上执行一次tripwire检查。 我们将使用root的crontab,因为对系统cronjob的编辑可能会被系统更新擦除。 通过发出以下命令检查root是否已有crontab:
sudo crontab -l
如果crontab存在,你应该管道它到一个文件,以备份它:
sudo sh -c 'crontab -l > crontab.bad'
之后,我们可以通过键入以下命令来编辑crontab:
sudo crontab -e
如果这是你第一次运行crontab,它会问你想要使用哪个编辑器。如果您没有其他编辑器的偏好,nano通常是一个安全的选择。 然后,您将被带到一个文件,我们可以自动化tripwire。由于我们将每天运行tripwire,我们只需要决定我们想要什么时间运行。通常,服务在非高峰时间运行,以不中断繁忙时间。 我们需要使用的格式 min hour * * * command 。我们要使用的命令是我们以前用来邮寄我们的报告的命令。我们不需要使用sudo,因为这将以root身份运行。 要让tripwire每天上午3:30运行,我们可以在我们的文件中放置一行:
30 3 * * * /usr/sbin/tripwire --check | mail -s "Tripwire report for `uname -n`" your_email@domain.com
您可以根据自己的偏好进行调整。

结论

您现在应该有一个自动入侵检测系统,它会向您发送有关文件系统更改的报告。您应定期查看电子邮件报告,并在检测到更改时采取措施,无论是更新tripwire数据库以确保更改,还是调查可疑活动。
作者:Justin Ellingwood
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏