当前位置:首页 >知识 >使用fail2ban和FirewallD黑名单保护你的系统 你可能遇到过恶意登录尝试

使用fail2ban和FirewallD黑名单保护你的系统 你可能遇到过恶意登录尝试

2024-05-14 22:20:35 [百科] 来源:避面尹邢网

使用fail2ban和FirewallD黑名单保护你的使用系统

作者:Hobbes1069 运维 系统运维 如果你运行的服务器有面向公众的 SSH 访问,你可能遇到过恶意登录尝试。和D黑本文介绍了如何使用两个实用程序来防止入侵者进入我们的名单系统。

[[333852]]

如果你运行的保护服务器有面向公众的 SSH 访问,你可能遇到过恶意登录尝试。使用本文介绍了如何使用两个实用程序来防止入侵者进入我们的和D黑系统。

使用fail2ban和FirewallD黑名单保护你的系统 你可能遇到过恶意登录尝试

为了防止反复的名单 ssh 登录尝试,我们来看看 fail2ban。保护而且,使用如果你不经常旅行,和D黑基本上停留在一两个国家,名单你可以将 FirewallD 配置为只允许从你选择的保护国家访问。

使用fail2ban和FirewallD黑名单保护你的系统 你可能遇到过恶意登录尝试

首先,使用让我们为不熟悉这些应用程序的和D黑人员介绍一些术语,以完成这项工作:

使用fail2ban和FirewallD黑名单保护你的系统 你可能遇到过恶意登录尝试

fail2ban:一个守护进程,名单用于禁止发生多次认证错误的主机。fail2ban 将监控 SystemD 日志,以查找对任何已启用的“监狱jail”的失败的验证尝试。在达到指定失败次数后,它将添加一个防火墙规则,在配置的时间内阻止该特定 IP 地址。

FirewallD:一个带有 D-Bus 接口的防火墙守护进程,提供动态防火墙。除非你另行决定使用传统的 iptables,否则你已经在所有支持的 Fedora 和 CentOS 上安装了 FirewallD。

假定前提

  • 主机系统有一个互联网连接,并且要么是直接暴露在互联网上,要么是通过 DMZ(这两个都是非常糟糕的想法,除非你知道你在做什么),要么是有一个端口从路由器转发过来。
  • 虽然大部分的内容可能适用于其他系统,但本文假设当前系统是 Fedora(31 及以上)或 RHEL/CentOS 8 版本。在 CentOS 上,你必须用 sudo dnf install epel-release 启用 Fedora EPEL 仓库。

安装与配置

Fail2Ban

很有可能已经有某个 Firewalld 区已经允许 SSH 访问,但 sshd 服务本身默认没有启用。要手动启动它,并且不在启动时永久启用它:

  1. $ sudo systemctl start sshd

或者在系统启动时启用,并同时启动它:

  1. $ sudo systemctl enable --now sshd

下一步就是安装、配置、启用 fail2ban。和往常一样,安装可以通过命令行完成:

  1. $ sudo dnf install fail2ban

安装完毕后,下一步就是配置“监狱”(你要以设置的任何阈值监视并禁止的服务)。默认情况下,IP 会被禁止 1 小时(这其实不够长)。最好的做法是使用 *.local 文件覆盖系统默认值,而不是直接修改 *.config 文件。如果我们查看我的 jail.local,我们可以看到:

  1. # cat /etc/fail2ban/jail.local
  2. [DEFAULT]
  3.  
  4. # "bantime" is the number of seconds that a host is banned.
  5. bantime = 1d
  6.  
  7. # A host is banned if it has generated "maxretry" during the last "findtime"
  8. findtime = 1h
  9.  
  10. # "maxretry" is the number of failures before a host get banned.
  11. maxretry = 5

换成通俗的语言讲,就是在过去一小时内尝试 5 次后,该 IP 将被封禁 1 天。对于多次被封的 IP,也可以选择增加封禁时间,但这是另一篇文章的主题。

下一步是配置“监狱”。在本教程中显示的是 sshd,但其他服务的步骤大致相同。在 /etc/fail2ban/jail.d 中创建一个配置文件。这是我的文件:

  1. # cat /etc/fail2ban/jail.d/sshd.local
  2. [sshd]
  3. enabled = true

就这么简单! 很多配置已经在为 Fedora 构建的软件包中处理了(提示:我是当前的维护者)。接下来启用并启动 fail2ban 服务:

  1. $ sudo systemctl enable --now fail2ban

希望没有立即出错,如果没有,请使用下面的命令检查 fail2ban 的状态:

  1. $ sudo systemctl status fail2ban

如果它没有错误地启动,应该是这样的:

  1. $ systemctl status fail2ban
  2. ● fail2ban.service - Fail2Ban Service
  3. Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
  4. Active: active (running) since Tue 2020-06-16 07:57:40 CDT; 5s ago
  5. Docs: man:fail2ban(1)
  6. Process: 11230 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
  7. Main PID: 11235 (f2b/server)
  8. Tasks: 5 (limit: 4630)
  9. Memory: 12.7M
  10. CPU: 109ms
  11. CGroup: /system.slice/fail2ban.service
  12. └─11235 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start
  13. Jun 16 07:57:40 localhost.localdomain systemd[1]: Starting Fail2Ban Service…
  14. Jun 16 07:57:40 localhost.localdomain systemd[1]: Started Fail2Ban Service.
  15. Jun 16 07:57:41 localhost.localdomain fail2ban-server[11235]: Server ready

如果是刚刚启动的,fail2ban 不太可能显示任何有意思的信息,但要检查 fail2ban 的状态,并确保“监狱”被启用,请输入:

  1. $ sudo fail2ban-client status
  2. Status
  3. |- Number of jail: 1
  4. `- Jail list: sshd

sshd “监狱”的上级状态也会显示出来。如果启用了多个“监狱”,它们会在这里显示出来。

要查看一个“监狱”的详细状态,只需在前面的命令中添加“监狱”名称。下面是我的系统的输出,它已经运行了一段时间。我已经从输出中删除了被禁止的 IP:

  1. $ sudo fail2ban-client status sshd
  2. Status for the jail: sshd
  3. |- Filter
  4. | |- Currently failed: 8
  5. | |- Total failed: 4399
  6. | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
  7. `- Actions
  8. |- Currently banned: 101
  9. |- Total banned: 684
  10. `- Banned IP list: ...

监控 fail2ban 日志文件是否有入侵尝试,可以通过“尾随”日志来实现:

  1. $ sudo tail -f /var/log/fail2ban.log

tail 是一个很好的命令行工具,默认情况下,它可以显示一个文件的最后 10 行。添加 -f 告诉它尾随文件,这是个观察一个仍在被写入的文件的很好方式。

由于输出的内容中有真实的 IP,所以这里不会提供样本,但它的可读性很高。INFO 行通常是登录的尝试。如果从一个特定的 IP 地址进行了足够多的尝试,你会看到一个 NOTICE 行显示一个 IP 地址被禁止。在达到禁止时间后,你会看到一个 NOTICE 解禁行。

注意几个警告行。最常见的情况是,当添加了一个禁止后,fail2ban 发现该 IP 地址已经在其禁止数据库中,这意味着禁止可能无法正常工作。如果是最近安装的 fail2ban 包,它应该被设置为 FirewallD 的富规则。这个包在 fail2ban-0.11.1-6 版本时从 ipset 方式切换到了富规则方式,所以如果你的 fail2ban 安装时间较早,它可能还在尝试使用 ipset 方式,这种方式使用的是传统的 iptables,不是很可靠。

FirewallD 配置

被动还是主动?

有两种策略可以分开或一起使用:被动地将单个 IP 地址或主动地根据来源国将子网永久列入黑名单。

对于被动方式,一旦 fail2ban 运行了一段时间,最好再运行 sudo fail2ban-client status sshd 来看看有哪些坏蛋。很可能会有很多被禁止的 IP 地址。选择一个,然后试着对它运行 whois。在输出结果中可能会有很多有趣的信息,但是对于这个方法来说,只有来源国是重要的。为了保持简单,让我们过滤掉除了国家以外的所有信息。

在这个例子中,我们将使用一些著名的域名:

  1. $ whois google.com | grep -i country
  2. Registrant Country: US
  3. Admin Country: US
  4. Tech Country: US
  1. $ whois rpmfusion.org | grep -i country
  2. Registrant Country: FR
  1. $ whois aliexpress.com | grep -i country
  2. Registrant Country: CN

使用 grep -i 的原因是为了使 grep 不区分大小写,而大多数条目都使用的是 “Country”,而有些条目则是全小写的 “country”,所以这种方法无论如何都能匹配。

现在知道了尝试入侵的来源国,问题是,“是否有来自这个国家的人有合法的理由连接到这台计算机?”如果答案是否定的,那么封锁整个国家应该是可以接受的。

从功能上看,主动式方法它与被动式方法没有太大区别,然而,来自有些国家的入侵企图是非常普遍的。如果你的系统既不放在这些国家里,也没有任何源自这些国家的客户,那么为什么不现在就把它们加入黑名单而是等待呢?(LCTT 译注:我的经验是,动辄以国家的范畴而列入黑名单有些过于武断。建议可以将该 IP 所属的 WHOIS 网段放入到黑名单,因为这些网段往往具有相同的使用性质,如都用于用户接入或 IDC 托管,其安全状况也大致相同,因此,如果有来自该网段的某个 IP 的恶意尝试,可以预期该网段内的其它 IP 也可能被利用来做这样的尝试。)

黑名单脚本和配置

那么如何做到这一点呢?用 FirewallD ipset。我开发了下面的脚本来尽可能地自动化这个过程:

  1. #!/bin/bash
  2. # Based on the below article
  3. # https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist
  4.  
  5. # Source the blacklisted countries from the configuration file
  6. . /etc/blacklist-by-country
  7.  
  8. # Create a temporary working directory
  9. ipdeny_tmp_dir=$(mktemp -d -t blacklist-XXXXXXXXXX)
  10. pushd $ipdeny_tmp_dir
  11.  
  12. # Download the latest network addresses by country file
  13. curl -LO http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
  14. tar xf all-zones.tar.gz
  15.  
  16. # For updates, remove the ipset blacklist and recreate
  17. if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then
  18. firewall-cmd -q --permanent --delete-ipset=blacklist
  19. fi
  20.  
  21. # Create the ipset blacklist which accepts both IP addresses and networks
  22. firewall-cmd -q --permanent --new-ipset=blacklist --type=hash:net \
  23. --option=family=inet --option=hashsize=4096 --option=maxelem=200000 \
  24. --set-description="An ipset list of networks or ips to be dropped."
  25.  
  26. # Add the address ranges by country per ipdeny.com to the blacklist
  27. for country in $countries; do
  28. firewall-cmd -q --permanent --ipset=blacklist \
  29. --add-entries-from-file=./$country.zone && \
  30. echo "Added $country to blacklist ipset."
  31. done
  32.  
  33. # Block individual IPs if the configuration file exists and is not empty
  34. if [ -s "/etc/blacklist-by-ip" ]; then
  35. echo "Adding IPs blacklists."
  36. firewall-cmd -q --permanent --ipset=blacklist \
  37. --add-entries-from-file=/etc/blacklist-by-ip && \
  38. echo "Added IPs to blacklist ipset."
  39. fi
  40.  
  41. # Add the blacklist ipset to the drop zone if not already setup
  42. if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then
  43. echo "Blacklist already in firewalld drop zone."
  44. else
  45. echo "Adding ipset blacklist to firewalld drop zone."
  46. firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
  47. fi
  48.  
  49. firewall-cmd -q --reload
  50.  
  51. popd
  52. rm -rf $ipdeny_tmp_dir

这个应该安装到 /usr/local/sbin,不要忘了让它可执行!

  1. $ sudo chmod +x /usr/local/sbin/firewalld-blacklist

然后创建一个配置文件 /etc/blacklist-by-country

  1. # Which countries should be blocked?
  2. # Use the two letter designation separated by a space.
  3. countries=""

而另一个配置文件 /etc/blacklist-by-ip,每行只有一个 IP,没有任何额外的格式化。

在这个例子中,从 ipdeny 的区文件中随机选择了 10 个国家:

  1. # ls | shuf -n 10 | sed "s/\.zone//g" | tr '\n' ' '
  2. nl ee ie pk is sv na om gp bn

现在只要在配置文件中加入至少一个国家,就可以运行了!

  1. $ sudo firewalld-blacklist
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 142 100 142 0 0 1014 0 --:--:-- --:--:-- --:--:-- 1014
  5. 100 662k 100 662k 0 0 989k 0 --:--:-- --:--:-- --:--:-- 989k
  6. Added nl to blacklist ipset.
  7. Added ee to blacklist ipset.
  8. Added ie to blacklist ipset.
  9. Added pk to blacklist ipset.
  10. Added is to blacklist ipset.
  11. Added sv to blacklist ipset.
  12. Added na to blacklist ipset.
  13. Added om to blacklist ipset.
  14. Added gp to blacklist ipset.
  15. Added bn to blacklist ipset.
  16. Adding ipset blacklist to firewalld drop zone.
  17. success

要验证 FirewallD 黑名单是否成功,请检查 drop 区和 blacklist ipset。

  1. $ sudo firewall-cmd --info-zone=drop
  2. drop (active)
  3. target: DROP
  4. icmp-block-inversion: no
  5. interfaces:
  6. sources: ipset:blacklist
  7. services:
  8. ports:
  9. protocols:
  10. masquerade: no
  11. forward-ports:
  12. source-ports:
  13. icmp-blocks:
  14. rich rules:
  15.  
  16. $ sudo firewall-cmd --info-ipset=blacklist | less
  17. blacklist
  18. type: hash:net
  19. options: family=inet hashsize=4096 maxelem=200000
  20. entries:

第二条命令将输出所有的子网,这些子网是基于被封杀的国家而添加的,可能会相当长。

那么现在我该怎么做?

虽然在开始的时候,监控的频率会比较高,但随着时间的推移,入侵尝试的次数应该会随着黑名单的增加而减少。那么目标应该是维护而不是主动监控。

为此,我创建了一个 SystemD 服务文件和定时器,这样每月都会刷新由 ipdeny 维护的每个国家的子网。事实上,这里讨论的所有内容都可以从我的 pagure.io 项目中下载。

是不是很高兴你看完了整篇文章?现在只要把服务文件和定时器下载到 /etc/systemd/system/,并启用定时器就行了:

  1. $ sudo systemctl daemon-reload
  2. $ sudo systemctl enable --now firewalld-blacklist.timer

 

责任编辑:庞桂玉 来源: Linux中国 fail2banFirewallD系统运维

(责任编辑:休闲)

    推荐文章
    • 分期乐提前还款利息的计算方式是怎样的 分期乐分36期可以提前还款吗?

      分期乐提前还款利息的计算方式是怎样的 分期乐分36期可以提前还款吗?人们在日常生活中,遇见比较缺钱或者手头资金不足的时候,就会想到去申请一笔借款。有些人会选择求助亲朋好友,有些人则会选择一些网络上的贷款平台。分期乐提前还款利息怎么算?分期乐分36期可以提前还款吗?分期 ...[详细]
    • 为什么运动不出汗

      为什么运动不出汗前言:为什么运动不流汗运动不出汗的原因:流汗只是调节身体温度的机制,与运动效果没有直接关系。天气热也会流汗,不代表运动量充足。长时间但太过温和的运动,消耗的热量或脂肪比不上短时间而有一定强度的运动。运 ...[详细]
    • 手动剃须刀可以带上飞机吗

      手动剃须刀可以带上飞机吗剃须刀能带上飞机?2、按照规定来说,刀片式剃须刀不能带上飞机,只能随行李托运。除非没有刀片的,也就是自动剃须刀,可以随身携带乘坐飞机。但是一般来说,机场的安检不会那么严。刮胡刀可以上飞机吗?1、坐飞机 ...[详细]
    • 馇子怎么炒

      馇子怎么炒炒碴子怎么做-懂得原料:碴子,:1.把碴子从袋子里拿出来,烧开水,把碴子烫下,把一坨一坨的搅开,放在凉水中过一下,捞出沥干,备用2.里脊。炒碴条怎么做?3.锅热油,下点葱末爆锅,放肉丝,炒变色,倒入剩 ...[详细]
    • 阳普医疗(300030.SZ)公布消息:赵吉庆已于3月17日

      阳普医疗(300030.SZ)公布消息:赵吉庆已于3月17日阳普医疗(300030.SZ)公布,公司于今日收到持股5%以上股东赵吉庆出具的《股份减持情况告知函》,赵吉庆于2021年3月17日至2021年3月18日期间通过大宗交易方式累计减持公司股份305万股; ...[详细]
    • 花蛤属于海鲜还是河鲜

      花蛤属于海鲜还是河鲜花甲是海鲜还是河鲜-九州醉餐饮网海鲜一般都是在海里生长的,像花甲,多宝鱼,大海虾等动物。而河鲜一般是生长在河水里的动物,平时比较常见的是鲶鱼、鲤鱼、草鱼、河虾、小龙虾等各种。花蛤是海鲜还是河鲜?花蛤属 ...[详细]
    • 水性笔是什么笔

      水性笔是什么笔水性笔是什么笔?水性笔水性笔使用油墨为纯水性,纸对其的吸收性强。水性笔一般使用在吸收面上,即使涂在非吸收面上,也可以擦去,书写在纸上一般没有背痕。优点是书写手感与书。水性笔是中性笔吗?水笔是写小楷用的 ...[详细]
    • 易唱网

      易唱网前言:答:《零几年听的情歌》歌词:写一首十几岁听的情歌,可惜我没在那个时候遇见你否则我努力活到百岁后,就刚好爱你一整个世纪被我抓在手心里的秘密,总有一天会亲手交给你再行不通我就要穿越回过去,刚好爱你一 ...[详细]
    • 泰山石化(01192.HK)发布公告:预期2020年盈转亏

      泰山石化(01192.HK)发布公告:预期2020年盈转亏泰山石化(01192.HK)公告,相对于去年同期盈利,预期集团于截至2020年12月31日止年度将录得亏损。上述亏损并未计及7800万港元可换股债券及相关利息,尤其是该笔款项是否应予拨回或留存于公司其 ...[详细]
    • 米饼怎么做

      米饼怎么做米饼教程?米饼做法教程如下:原料:米饭(适量)、红萝卜(适量)、盐适量步骤:1/8可用新鲜饭,也可以用盛饭2/8将米饭制成泥状3/8可以根据自己的喜好加料,我。米饼怎么做?调料:盐、味精烹制方法:1 ...[详细]
    热点阅读