当前位置: 首页 > 科技观察

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

时间:2023-03-19 19:40:42 科技观察

如果您运行的服务器具有面向公众的SSH访问权限,您可能会遇到恶意登录尝试。本文描述了如何使用两个实用程序来防止入侵者进入我们的系统。为了防止重复的ssh登录尝试,让我们看一下fail2ban。而且,如果您不经常旅行并且基本上停留在一两个国家/地区,则可以将FirewallD配置为仅允许来自您选择的国家/地区的访问。首先,让我们为那些不熟悉这些应用程序的人介绍一些术语,以便使这项工作正常进行:fail2ban:一个禁止出现多个身份验证错误的主机的守护进程。fail2ban将监视SystemD日志以了解对任何启用的“监狱”的失败身份验证尝试。达到指定的失败次数后,它将添加一条防火墙规则,在配置的时间内阻止该特定IP地址。FirewallD:具有提供动态防火墙的D-Bus接口的防火墙守护进程。除非您决定使用传统的iptables,否则您已经在所有受支持的Fedora和CentOS上安装了FirewallD。假设前提主机系统有互联网连接,并且要么通过DMZ直接暴露在互联网上(除非你知道自己在做什么,否则这都是非常糟糕的想法),或者有一个从路由器转发的端口过来。虽然大部分内容可能适用于其他系统,但本文假设当前系统为Fedora(31及以上)或RHEL/CentOS8版本。在CentOS上,您必须使用sudodnfinstallepel-release启用FedoraEPEL存储库。安装和配置Fail2Ban很可能Firewalld区域已经允许SSH访问,但默认情况下sshd服务本身未启用。要手动启用它而不是在引导时永久启用它:$sudosystemctlstartsshd或者在系统引导时启用它并同时启动它:$sudosystemctlenable--nowsshd下一步是安装、配置和启用fail2ban。像往常一样,可以通过命令行完成安装:$sudodnfinstallfail2ban安装后,下一步是配置“jails”(您希望在您设置的任何阈值下监控和禁止的服务)。默认情况下,IP被禁止1小时(这实际上还不够长)。最佳做法是使用*.local文件覆盖系统默认值,而不是直接修改*.config文件。如果我们查看我的jail.local,我们可以看到:#cat/etc/fail2ban/jail.local[DEFAULT]#“bantime”是主机被禁止的秒数。bantime=1d#如果主机被禁止,则主机被禁止hasgenerated"maxretry"duringthelast"findtime"findtime=1h#"maxretry"是一个主机被bann前的失败次数。maxretry=5通俗点说就是在过去的一个小时内尝试了5次之后,IP会被禁赛1天。还可以选择增加已被多次阻止的IP的禁令时间,但这是另一篇文章的主题。下一步是配置“监狱”。在本教程中,显示??的是sshd,但其他服务的步骤大致相同。在/etc/fail2ban/jail.d中创建一个配置文件。这是我的文件:#cat/etc/fail2ban/jail.d/sshd.local[sshd]enabled=true就这么简单!许多配置已经在为Fedora构建的包中处理(提示:我目前是维护者)。接下来启用并启动fail2ban服务:$sudosystemctlenable--nowfail2ban希望没有即时错误,如果没有,请使用以下命令检查fail2ban的状态:$sudosystemctlstatusfail2ban如果它启动时没有错误,它应该看起来像这样:$systemctlstatusfail2banfail2ban.service-Fail2BanServiceLoaded:loaded(/usr/lib/systemd/system/fail2ban.service;disabled;vendorpreset:disabled)Active:active(running)sinceTue2020-06-1607:57:40中国夏令时;5sagoDocs:man:fail2ban(1)Process:11230ExecStartPre=/bin/mkdir-p/run/fail2ban(code=exited,status=0/SUCCESS)MainPID:11235(f2b/server)Tasks:5(limit:4630)内存:12.7MCPU:109msCGroup:/system.slice/fail2ban.service└─11235/usr/bin/python3-s/usr/bin/fail2ban-server-xfstartJun1607:57:40localhost.localdomainsystemd[1]:启动Fail2Ban服务...Jun1607:57:40localhost.localdomainsystemd[1]:启动Fail2BanService.Jun1607:57:41localhost.localdomainfail2ban-server[11235]:服务器准备就绪如果只是开始时,fail2ban不太可能显示任何有趣的内容,但要检查fail2ban的状态并确保启用“jail”,请键入:$sudofail2ban-clientstatusStatus|-监狱数量:1`-监狱列表:sshdsshd还显示“监狱”的父状态如果启用了多个“监狱”,它们将在此处显示。要查看“监狱”的详细状态,只需将“监狱”名称添加到前面的命令即可。下面是我的系统的输出,它已经运行了一段时间。我已经从输出中删除了被禁止的IP:$sudofail2ban-clientstatussshdStatusforthejail:sshd|-Filter||-当前失败:8||-失败总数:4399|`-日志匹配:_SYSTEMD_UNIT=sshd.service+_COMM=sshd`-操作|-当前禁止:101|-总禁止:684`-禁止IP列表:...通过“拖尾”日志实现:$sudotail-f/var/log/fail2ban.logtail是一个很好的命令行工具,默认情况下它可以显示文件的最后10行。添加-f告诉它跟踪文件,这是查看仍在写入的文件的好方法。由于输出中有真实IP,因此我不会在此处提供示例,但它的可读性很强。INFO行通常是登录尝试。如果从特定IP地址进行了足够多的尝试,您将看到一条通知行,显示IP地址已被禁止。达到封禁时间后,您会看到一条NOTICEunban行。请注意几条警告线。大多数情况下,当添加禁令时,fail2ban会发现该IP地址已经在其禁令数据库中,这意味着禁令可能无法正常工作。如果最近安装了fail2ban包,则应将其设置为FirewallD的丰富规则。本包在fail2ban-0.11.1-6版本中由ipset方式切换为richrule方式,所以如果你的fail2ban安装时间较早,还是可以尝试使用ipset方式,即使用传统的iptables,不是很可靠的。FirewallD配置被动还是主动?有两种策略可以单独使用或一起使用:被动地将单个IP地址列入黑名单或根据来源国主动将子网永久列入黑名单。对于被动方式,一旦fail2ban运行了一段时间,最好运行sudofail2ban-clientstatussshd来查看坏人是什么。很可能会有许多被禁止的IP地址。选择一个并尝试在其上运行whois。输出中可能有很多有趣的信息,但对于这种方法只有原产国是重要的。为了简单起见,让我们过滤掉国家以外的所有内容。在此示例中,我们将使用一些知名域:$whoisgoogle.com|grep-icountryRegistrant国家:USAdmin国家:USTech国家:US$whoisrpmfusion.org|grep-icountryRegistrant国家:FR$whoisaliexpress.com|grep-icountryRegistrantCountry:CN之所以使用grep-i是为了让grep不区分大小写,大部分条目使用“Country”,而有些条目全部是小写的“country”,所以这个方法无论如何都匹配。现在已知入侵企图的来源国,问题是“来自这个国家的任何人是否有正当理由连接到这台计算机?”如果答案是否定的,那么封锁整个国家应该是可以接受的。在功能上,主动方法与被动方法没有太大区别,但是,来自某些国家/地区的入侵尝试非常普遍。如果您的系统既不位于这些国家也没有任何客户来自这些国家,为什么不现在就将它们列入黑名单并等待呢?(LCTT译注:我的经验是按国家列入黑名单有点太武断了。建议可以将IP所属的WHOIS网段加入黑名单,因为这些网段往往具有相同的使用性质,比如用于用户访问或IDC托管,其安全状态也大致相同相同。对本网段的某个IP进行恶意尝试,可以预料,也可能利用本网段的其他IP进行此类尝试。)黑名单脚本和配置那么怎么做呢?使用FirewallDipset。我开发了下面的脚来尽可能地自动化这个过程:#!/bin/bash#基于下面的文章#https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist#从配置文件中获取黑名单国家。/etc/blacklist-by-country#创建临时工作目录ipdeny_tmp_dir=$(mktemp-d-tblacklist-XXXXXXXXXX)pushd$ipdeny_tmp_dir#按国家下载最新的网络地址文件curl-LOhttp://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gztarxfall-zones.tar.gz#对于更新,删除ipset黑名单并重新创建firewall-cmd-q--zone=drop--query-source=ipset:blacklist;然后firewall-cmd-q--permanent--delete-ipset=blacklistfi#创建同时接受IP地址和网络的ipset黑名单firewall-cmd-q--permanent--new-ipset=blacklist--type=hash:net\--option=family=inet--option=hashsize=4096--option=maxelem=200000\--set-description="Anipsetlistofnetworksoripsto被丢弃。”#将每个ipdeny.com的国家/地区地址范围添加到$countries国家/地区的黑名单中;执行firewall-cmd-q--permanent--ipset=blacklist\--add-entries-from-file=./$country.zone&&\echo"Added$countrytoblacklistipset."done#如果配置文件存在且不为空则阻止单个IPif[-s"/etc/blacklist-by-ip"];thenecho"AddingIPs黑名单。”firewall-cmd-q--permanent--ipset=blacklist\--add-entries-from-file=/etc/blacklist-by-ip&&\echo"AddedIPstoblacklistipset."fi#添加如果firewall-cmd-q--zone=drop--query-source=ipset:blacklist;thenecho"Blacklistalreadyinfirewallddropzone."elseecho"Addingipsetblacklisttofirewallddrop区域。”firewall-cmd--permanent--zone=drop--add-source=ipset:blacklistfifirewall-cmd-q--reloadpopdrm-rf$ipdeny_tmp_dir这应该安装到/usr/local/sbin,不要忘记让它可执行!$sudochmod+x/usr/local/sbin/firewalld-blacklist然后创建一个配置文件/etc/blacklist-by-country:#应该阻止哪些国家?#使用空格分隔的两个字母指定.countries=""和另一个配置文件/etc/blacklist-by-ip,每行只有一个IP,没有任何额外的格式在本例中,从ipdeny区域文件中随机选择了10个国家:#ls|舒夫-n10|sed"s/\.zone//g"|tr'\n'''nleeiepkissvnaomgpbn现在只需在配置文件中添加至少一个国家即可工作!$sudofirewalld-blacklist%Total%Received%XferdAverageSpeedTimeTimeTime当前DloadUploadTotalSpentLeftSpeed1001421001420010140--:--:----:--:----:--:--1014100662k100662k00989k0--:--:----:--:----:--:--989k将nl添加到黑名单ipset。将ee添加到黑名单ipset。添加ie到黑名单ipset.添加pk到黑名单ipset.添加is到黑名单ipset.添加sv到黑名单ipset.添加na到黑名单ipset.添加om到黑名单ipset.添加gp到黑名单ipset.添加bn到黑名单ipset.添加ipsetblacklisttofirewallddropzone.success要验证FirewallD黑名单是否成功,请检查dropzone和blacklistipset。$sudofirewall-cmd--info-zone=dropdrop(活动)目标:DROPicmp-block-inversion:无接口:来源:ipset:黑名单服务:端口:协议:伪装:无转发端口:源端口:icmp-块:丰富的规则:$sudofirewall-cmd--info-ipset=blacklist|lessblacklisttype:hash:netoptions:family=inethashsize=4096maxelem=200000entries:第二个命令将输出所有子网,这些子网是根据被封锁的国家添加的,可能很长。那我现在怎么办?虽然一开始监控会更频繁,但随着时间的推移,随着黑名单的增加,入侵尝试的次数应该会减少。目标应该是维护而不是主动监控。为此,我创建了一个SystemD服务文件和计时器,以便每月刷新由ipdeny维护的每个国家/地区的子网。事实上,这里讨论的所有内容都可以从我的pagure.io项目中下载。您很高兴阅读整篇文章吗?现在只需将服务文件和计时器下载到/etc/systemd/system/,并启用计时器:$sudosystemctldaemon-reload$sudosystemctlenable--nowfirewalld-blacklist.timer