赞
踩
1、使用堡垒机登录(Jumpserver)
2、ssh远程登录端口设置为5位数(不能超过65534)
3、sshd服务,直接编写脚本检查/var/log/secure 内登录失败次数超过某个阈值的ip并将它添加到/etc/hosts.deny(fail2ban的优点更多)
4、禁止root登录设置(PermitRootLogin yes修改为no)使用其他用户登陆并且拥有root用户权限。
5、将密码设置复杂,长度大于8位或者最好大于14位,密码的复杂度:由大小写字母以及字符和数字组成。 0-9 a-z A-Z @!#$%*. 等
6、使用fail2ban,起到登录失败多次后直接禁止某个时间段此ip登陆。
查看/var/log/secure 文件可以看到很多认证失败的Failure的ip登录信息。所以想到根据secure文件查看失败的ip如果超过五次,那么就把此ip写入/etc/hosts.deny文件,禁止此ip登录。
收集 /var/log/secure 里面的信息,若是某个IP 链接次数超过一定次数 ,则把此ip记录到/etc/hosts.deny里面。
通过crontab来执行,每分钟执行一次。
- #!/bin/bash
- #Denyhosts SHELL SCRIPT
- cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"=" $1;}' >/root/Denyhosts/Denyhosts.txt
- DEFINE="5"
- for i in `cat /root/Denyhosts/Denyhosts.txt`
- do
- IP=`echo $i|awk -F= '{print $1}'`
- NUM=`echo $i|awk -F= '{print $2}'`
- if [ $NUM -gt $DEFINE ]
- then
- ipExists=`grep $IP /etc/hosts.deny |grep -v grep |wc -l`
- if [ $ipExists -lt 1 ]
- then
- echo "sshd:$IP" >> /etc/hosts.deny
- fi
- fi
- done
#基本思路是设置ssh的登录权限,统计secure中ssh认证失败的ip设置黑名单
- #!/bin/bash
-
- LIMET=30
- LOGFILE="/var/log/block_ssh.log"
- TIME=$(date '+%b %e %H')
- BLOCK_IP=$(grep "$TIME" /var/log/secure |grep Failed|awk '{print $(NF-3)}'|sort |uniq -c |awk '$1>"$LIMET"{print $1":"$2}')
-
- for i in $BLOCK_IP
- do
- IP=$(echo $i |awk -F: '{print $2}')
- iptables-save |grep INPUT|grep DROP|grep $IP >/dev/null
- if [ $? -ne 0 ];then
- iptables -A INPUT -s $IP -p tcp --dport 22 -j DROP
- NOW=$(date '+%Y-%m-%d %H:%M')
- echo -e "%NOW : $IP" >>${LOGFILE}
- fi
- done
统计出1小时ssh认证失败超过30次的IP,如果没屏蔽过的就将其加入iptables屏蔽。
这里就不设置白名单了,正常ip在一个小时内不会有那么多的Failed认证。
加入定时任务:
crontab -e
*/1 * * * * /bin/bash /root/Denyhosts/Denyhosts.sh
*/10 * * * * /bin/bash /root/block_ssh.sh
#echo "*/10 * * * * root /root/block_ssh.sh" >>/etc/crontab
fail2ban是一个用于检查服务器日志以查找重复或自动攻击的应用程序。如果找到任何内容,它将更改防火墙以永久地或在指定的时间内阻止攻击者的IP地址
从CentOS7开始,官方的标准防火墙设置软件从iptables变更为firewalld。 为了使Fail2ban与iptables联动,需禁用自带的firewalld服务,同时安装iptables服务。
yum list | grep epel-release
yum -y install epel-release
yum install fail2ban -y
fail2ban的配置文件路径:/etc/fail2ban
fail2ban安装目录:/usr/share/fail2ban
日志文件:/var/log/fail2ban.log
达到阈值之后的执行的动作的配置文件: action.d/
包含所有的过滤规则:filter.d/
配置fail2ban并实现防暴力破解
官方的文档写到:在配置时,我们应该避免修改由fail2ban安装创建的文件,我们应该去编写具有.local扩展名的新文件。在.local新文件里配置的内容会覆盖jail.conf内容里相同的值。
当我们的配置发生改变了我们可以使用 fail2ban-client reload ,来加载新的配置。
配置fail2ban
编辑配置文件 jail.local 并实现防暴力破解:
vim /etc/fail2ban/jail.d/jail.local
文件内容:
#defalut这里是设定全局设置,如果下面的监控没有设置就以全局设置的值设置。
[DEFAULT]
# 用于指定哪些地址ip可以忽略 fail2ban 防御,以空格间隔。
ignoreip = 127.0.0.1/8
# 客户端主机被禁止的时长(默认单位为秒)
bantime = 3600
# 过滤的时长(秒)
findtime = 600
# 匹配到的阈值(次数)
maxretry = 3[ssh-iptables]
# 是否开启
enabled = true
# 过滤规则
filter = sshd
# 动作
action = iptables[name=SSH, port=ssh, protocol=tcp]
# 日志文件的路径
logpath = /var/log/secure
# 匹配到的阈值(次数)
maxretry = 3
在这里需要注意一点就是:我们上面的action设置的时候,port=ssh,如果我们更改了sshd服务的端口号,我能需要在这里设置对应的端口号,否则配置不生效。
防暴力破解测试
在上面配置好了之后,我们需要让配置生效:
fail2ban-client reload
测试:故意输入错误密码3次,再进行登录时,会拒绝登录
[root@121~]# ssh 192.168.1.121
root@192.168.1.121's password:
Permission denied, please try again.
root@192.168.1.121's password:
Permission denied, please try again.
root@192.168.1.121‘s password:
Permission denied (publickey,password).
[root@121~]# ssh 192.168.1.121
ssh: connect to host 192.168.1.121 port 22: Connection refused
我们可以查看当前被禁止登陆的ip:
[root@121]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure #日志文件路径
| |- Currently failed: 0 #当前失败次数
| `- Total failed: 3 #总失败次数
`- action
|- Currently banned: 1 #当前禁止的ip数量
| `- IP list: 192.168.1.112 #当前禁止的ip
`- Total banned: 1 #禁止的ip总数
wget https://codeload.github.com/fail2ban/fail2ban/tar.gz/0.8.14
成功下载之后,解压源码包并进行安装。
tar -xf 0.8.14.tar.gz
cd fail2ban-0.8.14
python setup.py install
安装完成后要手动生成一下程序的启动脚本。
cp files/redhat-initd /etc/init.d/fail2ban
chkconfig --add fail2ban
使用下列命令检查Fail2ban是否加入开机启动项。结果如下图所示。
chkconfig --list fail2ban
安装完成后程序文件都是保存在/etc/fail2ban目录下,其中jail.conf为主配置文件
配置Fail2ban联动iptables
新建jail.local来覆盖Fail2ban在jail.conf的默认配置。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local
对jail.conf做以下两种修改。
防止SSH密码爆破
[ssh-iptables]模块的配置修改如下。其中,port应按照实际情况填写。
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=22, protocol=tcp]
logpath = /var/log/secure
maxretry = 3
findtime = 300
阻止恶意扫描
新增[nginx-dir-scan]模块,配置信息如下。此处,port和logpath应按照实际情况填写。
[nginx-dir-scan]
enabled = true
filter = nginx-dir-scan
action = iptables[name=nginx-dir-scan, port=443, protocol=tcp]
logpath = /path/to/nginx/access.log
maxretry = 1
bantime = 172800
findtime = 300
然后在filter.d目录下新建nginx-dir-scan.conf。
cp /etc/fail2ban/filter.d/nginx-http-auth.conf /etc/fail2ban/filter.d/nginx-dir-scan.conf
vim /etc/fail2ban/filter.d/nginx-dir-scan.conf
#对nginx-dir-scan.conf进行修改,具体配置信息如下:
[Definition]
failregex = <HOST> -.*- .*Mozilla/4.0* .* .*$
ignoreregex =
此处的正则匹配规则是根据nginx的访问日志进行撰写,不同的恶意扫描有不同的日志特征。
本文采用此规则是因为在特殊的应用场景下有绝大的把握可以肯定Mozilla/4.0是一些老旧的数据采集软件使用的UA,所以就针对其做了屏蔽。不可否认Mozilla/4.0 这样的客户端虽然是少数,但仍旧存在。因此,此规则并不适用于任何情况。
使用如下命令,可以测试正则规则的有效性。
fail2ban-regex /path/to/nginx/access.log /etc/fail2ban/filter.d/nginx-dir-scan.conf
变更iptables封禁策略
Fail2ban的默认iptables封禁策略为 REJECT --reject-with icmp-port-unreachable,需要变更iptables封禁策略为DROP。
在/etc/fail2ban/action.d/目录下新建文件iptables-blocktype.localcd /etc/fail2ban/action.d/
cp iptables-blocktype.conf iptables-blocktype.local
vim iptables-blocktype.local
#修改内容如下:
[INCLUDES]
after = iptables-blocktype.local
[Init]
blocktype = DROP
#最后,别忘记重启fail2ban使其生效。
Fail2ban常用命令
查看被ban IP,其中ssh-iptables为名称,比如上面的[ssh-iptables]和[nginx-dir-scan]。
fail2ban-client status ssh-iptables
添加白名单。
fail2ban-client set ssh-iptables addignoreip IP地址
删除白名单。
fail2ban-client set ssh-iptables delignoreip IP地址
查看被禁止的IP地址。
iptables -L -n
systemctl restart fail2ban
systemctl enable fail2ban
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。