三重 D 安全防护:检测、决策和拒绝
每当服务器可以通过互联网访问时,黑客就会尝试访问它,这是一个可以确定的事实。只需查看您使用的任何服务器的 SSH 日志,您肯定会发现许多“身份验证失败”行,这些行来自与您或您的业务无关的 IP。暴力破解尝试(例如“字典攻击”)一遍又一遍地尝试不同的密码,试图进入您的计算机,并且始终存在最终成功的可能性。因此,为您的安全应用这“三重 D”是一个好主意:检测入侵者尝试,决定何时他们“过分”(超过了诚实的输入错误的可接受范围),以及拒绝他们访问,至少在(很长一段时间!)内。
有几种工具可以管理这种监控(请参阅“资源”部分)。在本文中,我将介绍安装、配置和运行 DenyHosts。有了它,您将拥有一个正在运行的后台守护程序,它将持续检查您的系统以查找访问尝试,判断它们是否看起来不安全,阻止它们并通知您。DenyHosts 甚至可以配置为与其他服务器共享信息,因此每当在一个系统上检测到黑客时,也会在其他系统上阻止该黑客。
安装和配置DenyHosts 的当前版本是 2.6(来自 2013 年 6 月)。它是一个 Python 脚本,您可能已经安装了该语言。如果没有,您需要使用您的发行版软件包工具首先设置它。您需要 2.3 或更高版本。
许多发行版已经提供了“denyhosts”软件包,使用您的系统工具是最简单的安装方法。例如,对于 Ubuntu,键入 sudo apt-get install denyhosts
;对于 Red Hat,键入 sudo yum install denyhosts
;或者对于 OpenSUSE,键入 sudo zypper install denyhosts
。否则,您可以下载 tar.gz 文件(请参阅“资源”),然后执行
$ tar zxvf DenyHosts-2.6.tar.gz
$ cd DenyHosts-2.6
$ sudo python setup.py install
无论您如何安装 DenyHosts,都会创建一个 /usr/share/denyhosts 目录,其中包含所有配置和脚本文件。您需要编辑 denyhosts.cfg 文件以配置 DenyHosts 以适应您的环境。(如果该文件不存在,请执行 cp denyhosts.cfg-dist denyhosts.cfg
以获取一个基本的示例配置文件以开始使用。)空白行和以 # 开头的行将被忽略。有很多注释可以帮助您理解每个配置项,但请密切关注一些关键项(表 1)。
参数 | 说明 |
SECURE_LOG | 访问日志的位置:Red Hat 为 /var/log/secure,Ubuntu 或 OpenSUSE 为 /var/log/auth.log,等等。DenyHosts 将扫描此文件以检测可能的黑客攻击尝试。 |
HOSTS_DENY | 受限主机文件的位置,通常为 /etc/hosts.deny。每当检测到可能的入侵者时,DenyHosts 都会向此文件添加行。 |
LOCK_FILE | 文件路径和名称:此文件在 DenyHosts 启动时创建,并在退出时删除。如果您尝试运行 DenyHosts,并且此文件存在,Denyhosts 将立即退出,以防止同时运行多个实例。 |
WORK_DIR | DenyHosts 将用于其自身数据的目录。 |
DAEMON_LOG | DenyHosts 在守护程序模式下运行时,将用于报告其状态的日志文件的位置。 |
DAEMON_SLEEP | DenyHosts 在检查 SECURE_LOG 之前将等待的时间量。 |
DAEMON_PURGE | HOSTS_DENY 中旧条目的清除间隔时间(请参阅下面的 PURGE_DENY)。 |
BLOCK_SERVICE | 应在 HOSTS_DENY 中阻止的服务。将其设置为 “sshd” 以仅禁用 SSH 访问,或设置为 “ALL” 以阻止来自远程主机的每次尝试。 |
ADMIN_EMAIL | 应向其发送关于被阻止主机和可疑登录的电子邮件消息的地址。如果您将其设置为非空值,您还需要设置 SMTP_HOST、SMTP_PORT、SMTP_USERNAME 和 SMTP_PASSWORD,以便 DenyHosts 可以连接到您的邮件服务器。 |
DENY_THRESHOLD_INVALID、DENY_THRESHOLD_VALID 和 DENY_THRESHOLD_ROOT | 在多少次登录尝试失败后,DenyHosts 应阻止主机(由于错误的用户帐户名、正确的用户名但错误的密码或失败的 root 访问尝试)。但是,您根本不应该允许远程 root 访问;有关这方面的一些建议,请参阅“资源”部分! |
RESET_ON_SUCCESS | 如果设置为 “yes”,则服务器的失败计数将在成功登录后重置为零。 |
AGE_RESET_INVALID、AGE_RESET_VALID 和 AGE_RESET_ROOT | 在经过多长时间后,主机的失败计数将针对错误的用户帐户尝试、错误的密码尝试和 root 访问尝试重置为 0。 |
PURGE_DENY | 如果您使用 --purge 标志运行 DenyHosts,则 HOSTS_DENY 条目将被清除的时间。我通常使用 “1w”(一周),但您可以将其留空(永不清除),或者您可以使用分钟、小时、天或周。 |
PURGE_THRESHOLD | 在 DenyHosts 决定主机是已确认的风险并停止清除它之前,主机可以被清除多少次,从而永久禁用它。将此设置为零以禁用该功能。 |
为了额外确保您不会被自己的服务器禁止,您应该编辑 /etc/hosts.allow 并为您使用的每个 IP 添加一行,格式类似于 sshd: 111.222.33.44
。DenyHosts 有自己的文件 allowed-hosts,其中定义了永远不会被阻止的 IP(每行一个)。
现在您已准备好开始运行 DenyHosts — 让我们继续进行下一步!
运行 DenyHosts您可以定期运行 DenyHosts(例如作为 cron 作业),但最好以守护程序模式运行它。然后,DenyHosts 将在后台运行,检查访问日志以检测可能的入侵者。为此,您需要通过执行 cp daemon-control-dist daemon-control
来创建一个额外的配置文件。然后,编辑该文件以确保其三个参数已正确定义(表 2)。
参数 | 说明 |
DENYHOSTS_BIN | 应指向 denyhosts.py 脚本。 |
DENYHOSTS_CFG | 应指向 denyhosts.cfg 配置文件。 |
DENYHOSTS_LOCK | 应指向表 1 中与 LOCK_FILE 相同的文件。 |
然后,您需要做的就是使用 /etc/init.d/denyhosts restart
或 service denyhosts restart
启动服务,具体取决于您的服务器,您就设置完成了。从那时起,DenyHosts 将监视登录尝试,并在检测到频繁重复的失败时,它将决定拒绝所有对潜在入侵者的访问(图 1)。为了以防万一,您还应该设置 DenyHosts 在重新启动时自动启动 — 执行 sudo chkconfig denyhosts on
是一种管理此方法。

图 1. DenyHosts 监视访问日志,最终锁定黑客的主机。
一旦 DenyHosts 运行,它将监视日志,并在检测到重复的登录尝试失败后,当达到某些阈值时,它将决定阻止远程 IP,以拒绝潜在的黑客所有连接的可能性。例如,我故意一次又一次地输入错误的密码,最终我被阻止了(图 1 还解释了为什么 DenyHosts 需要以 root 身份运行;否则,它将无法编辑 hosts.deny 文件)
> ssh fkereki@your.own.server
fkereki@your.own.server's password:
Permission denied, please try again.
fkereki@your.own.server's password:
Permission denied, please try again.
fkereki@your.own.server's password:
Permission denied (publickey,password).
> ssh fkereki@your.own.server
fkereki@your.own.server's password:
Permission denied, please try again.
fkereki@your.own.server's password:
Permission denied, please try again.
fkereki@your.own.server's password:
Permission denied (publickey,password).
.
.
.
several attempts, and then...
> ssh fkereki@your.own.server
ssh_exchange_identification: read: Connection reset by peer
DenyHosts 最终将解除限制(取决于配置),但如果有效的用户以某种方式被有效的服务器禁止,您可以立即解决该问题(请参阅“原谅用户”侧边栏)。
不要被锁定在外!不用说,您应该测试 DenyHosts 以验证它是否正在运行。当然,最重要的是,在您进行测试时,至少保持服务器上的一个开放 shell;否则,如果出现任何问题,您可能会被锁定在您自己的 IP 地址之外,并且您会遇到一个棘手的问题!
当您尝试从另一台计算机访问服务器时,您可以使用 tail -f
来监视 hosts.deny 文件和 DenyHosts 自己的日志文件(请参阅表 1 中的 HOSTS_DENY 和 DAEMON_LOG 配置参数)。在几次失败的尝试后,您应该看到这两个文件中的更改,并且您还应该收到一封电子邮件消息,确认您的配置良好。
DenyHosts 提供了另一项服务,允许您与世界各地的其他服务器共享您阻止的任何 IP,反之亦然。这个想法很简单。如果任何人检测到黑客攻击尝试来自某个 IP,那么每个在没有等待被攻击的情况下阻止它的服务器都会变得更安全。您需要考虑一些参数,如表 3 所示。
表 3. 与其他服务器共享被阻止的 IP 有助于所有人。参数 | 说明 |
SYNC_SERVER | 您应该连接到哪个服务器进行中央同步。目前,xmlrpc.denyhosts.net:9911 是唯一可用的服务器,但将来,组织可能会安装自己的同步服务器以供内部使用。 |
SYNC_INTERVAL | 与服务器同步的频率。 |
SYNC_UPLOAD 和 SYNC_DOWNLOAD | DenyHosts 是否应上传和下载被禁止的 IP;逻辑选择在两种情况下都是 YES。 |
SYNC_DOWNLOAD_THRESHOLD | 仅下载已被至少此数量的 DenyHosts 不同服务器检测和阻止的 IP。 |
SYNC_DOWNLOAD_RESILIENCY | 仅下载在此期间检测到的 IP。此值越大,IP 是实际黑客的可能性就越大。 |
共享此信息通常是一个好主意,因此您甚至可以在潜在的黑客开始窥探您的服务器之前就阻止他们。共享服务目前是免费的(尽管接受捐赠),但最终企业可能会为此付费,正如 DenyHosts FAQ 中所述。您可以联系 DenyHosts 创建者以获得服务器组件的许可并运行您自己的共享服务器。
原谅用户无论多么小心,偶尔也会有人搞砸,多次输入错误的密码并被 DenyHosts 禁止。您如何解决这个问题?一旦您决定应该原谅犯错的用户,请采取以下步骤
-
了解用户当前的 IP,以便您可以再次启用它。
-
停止 DenyHosts。
-
检查 WORK_DIR 目录中的每个文件(参见表 1),并删除 IP 出现的每一行(使用
grep
将有所帮助)。 -
以相同方式编辑 /etc/hosts.deny。
-
重新启动 DenyHosts。
现在,如果用户再次尝试,应该授予访问权限。不要试图跳过步骤 3。如果您这样做,一旦您重新启动 DenyHosts,远程 IP 将再次被阻止!
结论安全是一项 24/7 全天候工作,您可以添加到组合中的所有工具都对确保服务器安全大有帮助。DenyHosts 易于安装,并且可以快速检测黑客攻击尝试,阻止远程黑客并阻止暴力破解攻击。虽然它不是解决所有可能的入侵者问题的“银弹”解决方案,但它是一个值得添加到您的安全工具包中的有用工具。试一试吧!
资源您可以在 http://denyhosts.sourceforge.net 找到 DenyHosts,并从项目站点 http://sourceforge.net/projects/denyhosts 下载它。在 http://denyhosts.sourceforge.net/faq.html 回答了一些常见问题。
其他具有类似目标的工具是 BlockHosts,网址为 http://www.aczoom.com/tools/blockhosts,Fail2Ban,网址为 http://www.fail2ban.org。
我之前在 Linux Journal 上写过其他关于安全措施的文章:“PAM—保护无处不在的 Linux 盒子”(2009 年 1 月)、“使用 knockd 实施端口敲门安全”(2010 年 1 月)和“更安全的 SSH 连接”(2014 年 1 月)。