如何使用psad检测UbuntuVPS上的网络入侵尝试

来自菜鸟教程
跳转至:导航、​搜索

介绍


能够检测可能表明入侵企图的网络活动可以帮助您在事件发生之前采取适当的措施。 出于这个特定原因,可以使用入侵检测系统。

入侵检测系统用于记录可疑连接并在发生异常活动时进行报告。 有些程序纯粹用作通知系统,而另一些程序则可以主动尝试阻止似乎有意造成伤害的流量。

psad 工具,代表端口扫描攻击检测,是一款主动监控防火墙日志以确定扫描或攻击事件是否正在进行的软件。 然后它可以提醒管理员,或采取积极措施来阻止威胁。

在本指南中,我们将探索如何在 Ubuntu 12.04 VPS 上安装和配置 psad。 这些程序在其他发行版上应该非常相似。

安装 psad


psad 入侵检测系统在 Ubuntu 的默认存储库中提供,因此可以通过 apt 轻松获取:

sudo apt-get update
sudo apt-get install psad

为了配置邮件传递以提醒管理员,您将被要求配置 postfix 邮件服务器。

大多数情况下,您可以选择“Internet Site”,然后输入与您的服务器关联的域名。 这将是 psad 生成的电子邮件中“发件人”字段中使用的名称的域部分。

配置 IPTables 规则


psad 检测服务器端口活动的方式是监视防火墙应用程序生成的日志。 Ubuntu 默认附带 iptables 防火墙,但它是完全未配置的,默认情况下不会监视或阻止任何内容。

尽管您可以通过键入以下命令来简单地启用日志记录,但我们将进行更强大的配置:

sudo iptables -A INPUT -j LOG
sudo iptables -A FORWARD -j LOG

如果您输入了上面的规则,请在配置之前刷新规则,以便我们可以从头开始。

sudo iptables -F

您可以通过键入以下内容查看当前规则(此时应仅包括默认策略):

sudo iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

我们现在可以开始将我们的规则附加到 INPUT 链中。 我们想告诉 iptables 丢弃我们不需要或不想要的连接。 在添加限制之前,我们需要添加规则以明确允许我们的授权连接。

第一条规则将允许我们的服务器生成的所有流量指向我们的服务器。 这种类型的连接通常用于服务相互通信并轻松传递信息:

sudo iptables -A INPUT -i lo -j ACCEPT

接下来,我们要添加一条规则以明确允许与现有连接相关的所有流量。 这将允许我们当前的会话不间断地继续:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

接下来,我们可以添加我们希望向公众开放的服务。 对于 SSH,我们可以添加如下一行:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

如果我们有一个在默认端口 80 上运行的 Web 服务器,我们可以添加如下规则:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

为您希望使用相同语法保持打开状态的合法、可公开访问的服务添加任何其他端口:

sudo iptables -A INPUT -p protocol --dport port_num -j ACCEPT

添加完合法服务后,我们将删除所有剩余的连接。 任何符合此规则的内容都不符合我们针对合法流量的规则。

不过,在我们这样做之前,我们需要添加告诉 iptables 开始记录流量的规则。 这将导致 iptables 记录尚未处理的流量。

sudo iptables -A INPUT -j LOG

我们还应该将此规则添加到转发链中,以防我们最终将流量转发到其他地方。

sudo iptables -A FORWARD -j LOG

最后,让我们丢弃所有尚未匹配的无关流量。 我们可以通过将匹配链中所有内容的规则添加到末尾来做到这一点,如下所示:

sudo iptables -A INPUT -j DROP

或者,我们可以使用内置的策略功能来配置当数据包在不匹配任何规则的情况下沿链传递时会发生什么:

sudo iptables -P INPUT DROP

结果在功能上完全相同。

需要注意的一点是,如果您需要刷新 iptables 并且设置了 DROP 策略(而不是将其作为规则添加到链的底部),则应该在刷新之前反转策略:

sudo iptables -P INPUT ACCEPT
sudo iptables -F

如果您未能这样做,您的 iptables 规则将被刷新,并且仅保留丢弃所有传入数据包的默认策略。 这将切断所有进入您服务器的网络流量,包括来自您的 SSH 连接的流量。

默认情况下,iptables 不会在重新启动之间维护其规则,因此在您测试了配置并确保它符合您的要求后,您可以下载并启用一个使这些规则保持不变的工具:

sudo apt-get install iptables-persistent
sudo service iptables-persistent start

配置 psad 以检测扫描


现在我们已经有了一个配置了“默认丢弃”策略的 iptables 规则集,我们可以开始配置 psad 以开始解析日志。

使用 root 权限打开主 psad 配置文件:

sudo nano /etc/psad/psad.conf

您应该修改的第一件事是在文件的顶部。 您应该更改 EMAIL_ADDRESSES 参数以匹配您希望在生成报告时通知的电子邮件地址。 您还应该修改 HOSTNAME 以匹配您的域,以便它引用正确的机器:

EMAIL_ADDRESSES     address1@domain.com, address2@other.com;

HOSTNAME            your_domain.com;

确保以分号 (;) 结束每一行,以便 psad 正确读取文件。

您可能想要查看的一个部分是“危险级别”声明。 这些级别是 psad 对威胁级别进行分类的一种方式。

它们由事件中涉及的数据包数量自动确定,但您也可以将某些类型的流量分配为某个危险级别。 要达到的每个级别的默认阈值是:

DANGER_LEVEL1           5;
DANGER_LEVEL2           15;
DANGER_LEVEL3           150;
DANGER_LEVEL4           1500;
DANGER_LEVEL5           10000;

您可以根据您希望 psad 用于警报的敏感度级别来更改这些级别。

您还可以通过 PORT_RANGE_SCAN_THRESHOLD 参数配置 psad 的敏感度。 这决定了在发出警报之前必须扫描的范围内的端口数。 默认设置是在扫描两个端口后引发警报。

PORT_RANGE_SCAN_THRESHOLD       1;

要配置的最重要的事情之一是 IPT_SYSLOG_FILE 参数,因为它目前没有指向 syslog 默认使用的文件。

将其修改为指向 syslog 文件,其中 psad 实际上将有机会查看活动日志:

IPT_SYSLOG_FILE         /var/log/syslog;

如果您将某些端口用于诸如 端口敲击 之类的事情,您应该告诉 psad 忽略对这些端口的尝试,这样您就不会通过日常活动触发警报:

IGNORE_PORTS            ports_or_range_to_ignore;

您可以通过适当命名的 IGNORE_PROTOCOLSIGNORE_INTERFACESIGNORE_LOG_PREFIXES 参数类似地忽略基于其他事物的消息。

如果您发现收到警报的频率太高,您可以通过调整在发送电子邮件之前必须达到的级别来设置电子邮件的阈值:

MIN_DANGER_LEVEL           1;  # Controls psad logging and email alerts
EMAIL_ALERT_DANGER_LEVEL   1;  # Applies only for email alerts

您还可以通过设置直接限制电子邮件数量:

EMAIL_LIMIT                0;

零意味着没有限制。 此限制是来自单个 IP 地址的威胁可以生成的电子邮件数量。

暂时,让我们保存并关闭文件。

实施 psad 入侵检测


现在我们已经有了一个基本的 psad 配置,并带有警报功能,我们可以实施我们的策略并激活我们的系统。

在开始之前,我们应该更新 psad 的签名定义,以便它能够正确识别已知的攻击类型。 通过调用来做到这一点:

sudo psad --sig-update

这将获取最新文件并更新数据库。

现在,我们需要重新启动服务以使用这些更新并实施我们的配置更改。 类型:

sudo service psad restart

这将实现我们的日志监控。 要查看 psad 检测到的事件的当前状态,请键入:

sudo service psad status

[+] psadwatchd (pid: 3737)  %CPU: 0.0  %MEM: 0.0
    Running since: Fri Jan 10 15:36:04 2014

[+] psad (pid: 3735)  %CPU: 0.0  %MEM: 0.3
    Running since: Fri Jan 10 15:36:04 2014
    Command line arguments: [none specified]
    Alert email address(es): example@domain.com

[+] Version: psad v2.1.7

[+] Top 50 signature matches:
        [NONE]

[+] Top 25 attackers:
        [NONE]

[+] Top 20 scanned ports:
        [NONE]

[+] iptables log prefix counters:
        [NONE]

    Total packet counters: tcp: 0, udp: 0, icmp: 0

[+] IP Status Detail:
        [NONE]

    Total scan sources: 0
    Total scan destinations: 0

[+] These results are available in: /var/log/psad/status.out

如您所见,目前还没有发现任何东西。 我们还可以看到检测到的事件记录到位于 /var/log/psad/ 的文件中。

执行测试端口扫描


从另一台计算机上,我们应该尝试扫描我们服务器的端口以在防火墙上产生一些命中。 我们可以使用 nmap 实用程序来做到这一点。

我们将从另一台机器进行 SYN tcp 端口扫描。 我们将通过传递 -PN 选项告诉它假设我们的主机已启动:

sudo nmap -PN -sS server_domain_or_ip
Starting Nmap 5.51 ( http://nmap.org ) at 2014-01-10 15:54 EST
Nmap scan report for server_domain_or_ip
Host is up (0.013s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 6.84 seconds

如您所见,此扫描表明我为防火墙配置了什么。 每个端口都被标记为“已过滤”,表明它受到防火墙的保护,但 SSH 端口除外,它是暴露的。

在您的服务器上,您应该重新运行 status 命令:

sudo service psad status

您应该会看到更大的警报列表。 因为该事件只是一次 1000 端口扫描,它触发了许多不同威胁的签名匹配。 对于针对特定端口或入口点的更有针对性的攻击,签名会更有帮助。

如果您设置了电子邮件警报,您应该还收到一两封电子邮件。 如果您有一个与您扫描的计算机关联的域,您应该会看到与扫描关联的所有者的“谁是”报告。

您可以使用它来尝试联系 IP 的所有者,或者可能是 ISP 或托管服务提供商。

实施入侵防御


现在我们已经验证我们可以检测到试图访问我们服务器的活动,我们可以选择实施一种预防机制,其中 psad 可以自动修改 iptables 规则以禁止扫描程序。

在我们这样做之前,我们应该看一下 auto_dl 文件:

sudo nano /etc/psad/auto_dl

该文件指定我们应该自动设置某些 IP 地址的危险级别。 例如,如果我们有一个攻击者不断尝试探测我们的系统,我们可以自动将其设置为危险级别 5:

attacker_ip          5;

另一方面,您基本上可以免除某些 IP 地址引起 psad 的反应。 如果我们没有在 iptables 中明确添加规则,我们可以在此处添加 localhost 并将其设置为“0”。

出于我们的目的,由于我们将设置 psad 以自动阻止来自检测到的威胁 IP 的流量,我们应该将我们的家用计算机添加到此列表中,这样我们就不会将自己锁定:

local_computer_ip        0;

完成后保存并关闭文件。

再次打开 psad 配置文件:

sudo nano /etc/psad/psad.conf

搜索名为 ENABLE_AUTO_IDS 的参数。 这是允许 psad 修改我们的防火墙以阻止某些地址的规则。 如果要自动执行此操作,可以这样更改:

ENABLE_AUTO_IDS         Y;

接下来,我们要确定什么构成了足以阻止违规 IP 的威胁级别。 我们可以通过调整这个参数来做到这一点:

AUTO_IDS_DANGER_LEVEL       5;

另一个重要的选项是以秒为单位的总阻塞时间:

AUTO_BLOCK_TIMEOUT          3600;

默认情况下,这将阻止他们一个小时。

测试入侵防御


我们可以通过暂时禁止自己来测试它是如何工作的。 在同一个配置文件中,我们将设置这些参数:

ENABLE_AUTOIDS              Y;
AUTO_IDS_DANGER_LEVEL       4;
AUTO_BLOCK_TIMEOUT          60;

这将打开自动防火墙配置,将阈值设置为危险级别 4,我们通过正常的 SYN 扫描达到,并将阻止时间设置为 60 秒。

保存并关闭文件。

如果您添加了家庭 IP 地址,请打开 auto_dl 文件,并暂时将其注释掉。

# local_computer_ip      0;

现在,重新启动 psad 以使其重新读取这些文件:

sudo service psad restart

在您的家用计算机上,您可以重新运行上次执行的扫描:

sudo nmap -PN -sS server_domain_or_ip

此时,几秒钟后,如果您通过 SSH 连接到您的 psad 机器,您的连接应该会断开。 您将在 60 秒内无法再次连接。

这是因为当您的扫描到达足够多的端口以达到危险级别 4 时,psad 采取了行动。 它修改了 iptables 规则以将流量转移到暂时阻止您的 IP 的其他链。

一旦您能够再次登录,您可以通过查看您的 iptable 规则来查看此转移的残余:

sudo iptables -S

-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N PSAD_BLOCK_FORWARD
-N PSAD_BLOCK_INPUT
-N PSAD_BLOCK_OUTPUT
-A INPUT -j PSAD_BLOCK_INPUT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j LOG
-A FORWARD -j PSAD_BLOCK_FORWARD
-A FORWARD -j LOG
-A OUTPUT -j PSAD_BLOCK_OUTPUT

如您所见,创建了更多链,并且所有输入都被定向到这些链之一。 在禁令期间,此链将放弃对您的家庭连接 IP 的连接尝试。

现在您已经测试了此功能,将其恢复为您想要使用的功能。 如果您打算实际使用此功能,您可能应该增加禁令长度。 此外,您应该重新添加您知道将要连接到的 IP 地址:

local_computer_ip           0;
ENABLE_AUTOIDS              Y;
AUTO_IDS_DANGER_LEVEL       5;
AUTO_BLOCK_TIMEOUT          3600;

完成为实际应用程序配置服务后,不要忘记重新启动 psad:

sudo service psad restart

请记住,某些类型的攻击可以欺骗源 IP 地址。 这意味着怀疑您启用了自动阻止功能的攻击者可能会导致您意外禁止合法站点或服务。 要非常小心并权衡此类配置的成本和收益。

结论


通过正确配置 psad 等网络入侵检测工具,您可以增加在问题实际发生之前获得所需威胁警告的机会。 像 psad 这样的工具可以给你提前警告,并且可以自动处理一些情况。

有效使用 psad 的关键是适当地配置危险级别和电子邮件警报,然后跟进任何问题。 该工具与 tripwire 等其他入侵检测资源相结合,可以提供相当好的覆盖范围,从而能够检测入侵企图。