拒绝ssh远程暴力破解-以centos7及centos8为例

一、centos8

参考:

如何在CentOS 8上安装和配置Fail2ban - A5互联 - 博客园 (cnblogs.com)https://www.cnblogs.com/a5idc/p/13650056.html上面这一个讲的比较详细:要点摘录如下

默认的Fail2ban安装中带有两个配置文件,/etc/fail2ban/jail.conf和/etc/fail2ban/jail.d/00-firewalld.conf。这些文件不应该被修改,因为它们可能会在更新软件包时被覆盖。

Fail2ban会按照以下顺序读取配置文件:
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/*.conf
/etc/fail2ban/jail.local
/etc/fail2ban/jail.d/*.local
每个.local文件都会覆盖文件中的设置.conf。

配置Fail2ban最简单的方法是从 jail.conf复制到jail.local,然后修改.local文件。高级用户可以从头开始建立一个.local配置文件。.local文件不必包含相应的.conf文件中的所有设置,只需要覆盖那些您想要覆盖的设置。

(1)将IP地址列入白名单:ignoreip 

(2)禁止设置:bantime,findtime和maxretry选项定义禁令时间和禁止条件。

(3)Fail2ban Jails:注意此处的sshd下的enabled,我之前就搞错了。

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

(4)邮件通知
当IP被禁止时,Fail2ban可以发送电子邮件警报。要接收电子邮件,您需要在服务器上安装SMTP并更改默认操作,该操作仅将IP禁止为%(action_mw)s,如下所示:

/etc/fail2ban/jail.local文件中:
action = %(action_mw)s
%(action_mw)s将禁止违规的IP,并发送包含Whois报告的电子邮件。如果要在电子邮件中包含相关日志,请将操作设置为%(action_mwl)s。
您还可以调整发送和接收电子邮件地址:
/etc/fail2ban/jail.local文件中:
destemail = admin@***.com
sender = root@***.com

CentOS8防暴力破解fail2banhttps://www.cnblogs.com/John-2011/p/14980220.html

对于CentOS8系统来说,/etc/hosts.deny不起作用,所以安装DenyHosts没用。我们采用fail2ban来防ssh暴力破解。

使用dnf install fail2ban 或者 yum install fail2ban

[root@localhost ~]# yum install epel-release

[root@localhost ~]# dnf install fail2ban

[root@localhost ~]# systemctl enable --now fail2ban
Created symlink Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.

[root@localhost ~]# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-11-27 18:29:05 CST; 14s ago
     Docs: man:fail2ban(1)
  Process: 2706671 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
 Main PID: 2706673 (fail2ban-server)
    Tasks: 3 (limit: 49524)
   Memory: 14.7M
   CGroup: /system.slice/fail2ban.service
           └─2706673 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start

Nov 27 18:29:05 VM-16-13-centos systemd[1]: Starting Fail2Ban Service...
Nov 27 18:29:05 VM-16-13-centos systemd[1]: Started Fail2Ban Service.
Nov 27 18:29:05 VM-16-13-centos fail2ban-server[2706673]: Server ready

fail2ban安装后有两个程序,fail2ban-server 和 fail2ban-client对应的主配置文件是fail2ban.conf 和 jail.conf。fail2ban的.conf配置文件都是可以被.local覆盖,所以配置方式建议是添加.local文件,不修改原来的配置文件。

[root@localhost ~]# cd /etc/fail2ban/
[root@localhost fail2ban]# cp jail.conf jail.local
[root@localhost fail2ban]# vim jail.local
#白名单,不拦截,多个使用,分开
ignoreip = 127.0.0.1/8
#拦截后禁止访问的时间,时间单位可以是 s、m、h、d
bantime  = 10m
#如果将fail2ban设置在2两次失败后禁止IP,则这些失败必须在findtime持续时间内发生
findtime  = 10m
#禁止IP之前的失败次数
maxretry = 2
#[sshd]下添加
enabled = true

重启

systemctl restart fail2ban

查看被禁止的ip地址

iptables -L -n

 查看ssh黑名单

fail2ban-client status sshd

 fail2ban从黑名单中移除IP

fail2ban-client set sshd unbanip 8.8.8.8

查看日志

tail /var/log/fail2ban.log

二、centos7下的使用

在CentOS7 的/etc目录下有hosts.deny文件,在文件中按照相应的格式添加数据可以禁止相应的IP使用不同的协议进行服务器的连接。比如,禁止ssh爆破就可以使用sshd:all:deny来防范,限定条件deny可加可不加。但是在使用deny all的时候要注意,hosts.allow文件的优先级更高,需要查看同目录的hosts.allow文件中是否添加允许访问的ip地址,例如sshd:1.2.3.4:allow。

此时简单的方法是使用如下命令 ,查找使用不同用户名对本机进行爆破的不同IP地址,然后手动添加到hosts.deny文件中。

cat /var/log/secure |grep Failed|grep invalid\ user

此外,也可以使用sh脚本文件将/var/log/secure中密码输入超过一个指定次数的IP添加到黑名单文件中,然后将原来hosts.deny文件输出到/dev/null中,然后将符合条件的黑名单IP以"sshd:$IP:deny"的格式输出到hosts.deny文件中,即可实现对ssh爆破的防范。

但是这种防范和使用deny all有很大的不同,在达到阈值之前,服务器的端口都是对所有IP开放的,但是在某个IP尝试的次数达到阈值之后,服务器就会主动终止与远程IP的连接,因此,脚本的方法在前期虽然没有deny all的方法那么有效,但是从长远上看,省去了每次向hosts.allow白名单中添加IP地址的麻烦。

但是在使用命令cronable –e 尝试将刚刚完成的脚本文件自定义每隔一分钟运行时,由于没有反馈,因此无法确定脚本文件是否成功运行。修改了crontab -e中的内容为:

在crontab –e 中的格式为:

*/1 * * * * sh /usr/local/bin/secure_ssh.sh

在等待一分钟后,再次检查black.list文件的大小,发现文件的大小发生了变化,由此可以确定脚本已经成功的运行了

继续修改之前的sh过滤脚本,在今天上午对服务器日志检查的时候发现,依旧有少量的未知IP在试图对服务器的ssh端口进行暴破。
在检查日志的时候发现,暴力的端口并不是ssh标准的22端口,而是大量端口,因此修改端口并不能一劳永逸的解决问题。在对之前的分析中,发现sh脚本文件中的规则并不严格,原先的脚本文件将可疑IP加入黑名单的条件是连接失败的次数大于一位数,即十次,但是在实际观察日志的过程中,有大部分IP都是只连接了六次。在搜索资料后发现,CentOS密码错误的最大尝试次数就是六次,但是ssh:notty,即ssh空连接的最大次数并不是六次,因此,原脚本文件的意义是使用防火墙过滤所有使用ssh空连接进行连接的用户,和该服务器的需求并不完全符合
该脚本文件的内容如下:

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
  if [ ${#NUM} -gt 1 ]; then
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

经过分析后发现,该脚本文件的操作是从日志中查找所有Failed,即登录失败的ip,然后排序并去重取重复次数,按照x.x.x.x=x的格式输入到/usr/local/bin/下的balck.list中。接着遍历black.list中所有数据,首先使用#参数获得第二位数据即登录失败的次数,然后比对是否大于一,然后将其打印到hosts.deny中,为了让防火墙过滤更严格,所以可以将判断条件的首次判断进行修改,将其更改为if [ ${NUM} -gt 2 ]; then,当服务器检测到一旦有未知IP连接失败的次数超过3次时 ,就将该IP地址导入到服务器的黑名单

修改后的文件为:

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
   if [ ${NUM} -gt 2 ]; then 
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
      #echo "transaform success" 
    fi
  fi
done

在重新检查日志后,发现之前小于十次连接的IP也成功导入到了防火墙的过滤名单中,但是为了以后会在新设备上对服务器进行连接,判断的条件也不能写的太小。因此服务器依旧会收到新的爆破攻击,但是这些流量算是在服务器的承载范围内,所以并不会有太大的问题

后期添加

不过在后期的使用过程中,虽然是没有没有了ssh爆破的困扰,但是现在又来新的问题了,现在日志中又出现了这种问题

Invalid user zenoss from 106.13.23.77 port 59988
破解不了密码直接弄用户,没办法,重新修改脚本文件
观察日志记录可发现该种日志和之前那种Failed日志IP地址的位置不一样
修改后就可以使用该脚本文件即可

#! /bin/bash
cat /var/log/secure|awk '/Invalid/{print $(NF-2)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
   if [ ${NUM} -gt 2 ]; then ##
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

直接执行 查看hosts.deny文件

sh /usr/local/bin/secure_user.sh
cat /etc/hosts.deny |grep 106.13.23.77

输出

sshd:106.13.23.77:deny

结束

一点小小的建议

其实如果有条件的话,还是建议使用密钥登录的方式。破解密钥肯定比破解密码麻烦,所以此时服务器的安全性还可以得到进一步的提升,关于这个的教程还是很简单的,随便弄一下就行了
————————————————
版权声明:本文为CSDN博主「東風谷早苗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40179508/article/details/100152437

/etc/hosts.allow和/etc/hosts.deny详解

今天遇到一台服务器22端口正常,但是通过ssh连接的问题。排查了防火墙和端口问题,半天没有找出来原因,后来求助大神,终于明白了通过etc目录下hosts.deny和hosts.allow文件可以限制远程访问,使用方法如下:

修改/etc/hosts.allow文件
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the ‘/usr/sbin/tcpd’ server.
#
sshd:210.13.218.*:allow
sshd:222.77.15.*:allow
以上写法表示允许210和222两个ip段连接sshd服务(这必然需要hosts.deny这个文件配合使用),当然:allow完全可以省略的。
当然如果管理员集中在一个IP那么这样写是比较省事的
all:218.24.129.110//他表示接受110这个ip的所有请求!

/etc/hosts.deny文件,此文件是拒绝服务列表,文件内容如下:
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the ‘/usr/sbin/tcpd’ server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow. In particular
# you should know that NFS uses portmap!
sshd:all:deny
注意看:sshd:all:deny表示拒绝了所有sshd远程连接。:deny可以省略。
所以:当hosts.allow和 host.deny相冲突时,以hosts.allow设置为准。

注意修改完后:
service network restart
重启网络服务才能让刚才的更改生效

配置优先级:
linux 系统会先检查/etc/hosts.deny规则,再检查/etc/hosts.allow规则,如果有冲突 按/etc/hosts.allow规则处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值