fail2ban

如何防止别人暴力破解你的密码!

Fail2ban阻止暴力破解
简介:Fail2ban能够监控系统日志,匹配日志中的错误信息(使用正则表达式),执行相应的屏蔽动作(支持多种,一般为调用 iptables ),是一款很实用、强大的软件。如:攻击者不断尝试穷举SSH、SMTP 、FTP 密码等,只要达到预设值,fail2ban 就会调用防火墙屏蔽此 IP ,并且可以发送邮件通知系统管理员。功能、特性:1、支持大量服务:sshd 、apache 、qmail 等2、支持多作动作:iptables 、tcp-wrapper 、shorewall 、mail notifications 等3、logpath 选项中支持通配符4、需要 Gamin 支持(Gamin 用于监控文件和目录是否更改)5、如果需要邮件通知,则系统事先要确保能够正常发送邮件

1、fail2ban 安装

yum install -y epel-release
yum install -y fail2ban

2、fail2ban 结构/etc/fail2ban

fail2ban服务配置目录/etc/fail2ban/action.d **
**iptables、mail 等动作文件目录/etc/fail2ban/filter.d

**条件匹配文件目录,过滤日志关键内容/etc/fail2ban/jail.conf **
**fail2ban防护配置文件/etc/fail2ban/fail2ban.conf **
**fail2ban配置文件,定义日志级别、日志、sock 文件位置等 **

3、fail2ban.conf 配置

shell > grep -v ^# /etc/fail2ban/fail2ban.conf
[Definition]
loglevel = 3 ##定义日志级别,默认
logtarget = /var/log/fail2ban.log ##定义 fail2ban 日志文件
socket = /var/run/fail2ban/fail2ban.sock ## sock文件存放位置,默认
pidfile = /var/run/fail2ban/fail2ban.pid ## pid文件存放位置,默认

4、jail.conf 防护配置

配置fail2ban并实现防暴力破解

1.官方的文档写到:在配置时,我们应该避免修改由fail2ban安装创建的文件,我们应该去编写具有.local扩展名的新文件。在.local新文件里配置的内容会覆盖jail.conf内容里相同的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    vim /etc/fail2ban/jail.d/jail.local

文件内容:

#defalut这里是设定全局设置,如果下面的监控没有设置就以全局设置的值设置。
[DEFAULT]
# 用于指定哪些地址ip可以忽略 fail2ban 防御,以空格间隔。
ignoreip = 127.0.0.1/8 40.244.62.17
# 客户端主机被禁止的时长(默认单位为秒)
bantime = 3600
# 过滤的时长(秒)
findtime = 600
# 匹配到的阈值(次数)
maxretry = 3



[ssh-iptables]
# 是否开启
enabled = true
# 过滤规则
filter = sshd
# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
# 用于指定哪些地址可以忽略 fail2ban 防御
ignoreip = 127.0.0.1
# 客户端主机被禁止的时长(秒),永久封禁 -1
bantime = 86400
# ssh 服务的最大尝试次数
maxretry = 3
# 查找失败次数的时长(秒)
findtime = 600
backend = auto
# 动作
action = iptables[name=SSH, port=ssh, protocol=tcp]
mail[name=SSH,dest=cleartly.org@etlgr.com,sender=fail2ban@email.com] #这行不配置也行,这样就不发送邮件了

# Red Hat 系的发行版
# 日志文件的路径
logpath = /var/log/secure

# nginx防护

[nginx-get-dos]
enabled = true
#port = http,https
#filter.d/nginx-get-dos.conf 文件名
filter = nginx-get-dos
ignoreip = 127.0.0.1 40.244.62.17
#需要监控nginx日志log
logpath = /var/log/nginx/access.log
maxretry = 1500
findtime = 60
bantime = 1200
action = iptables-multiport[name=nginx,port=\"http,https,666,888,2018,2019,2020\",protocol=tcp]
mail[name=nginx,dest=cleartly.org@etlgr.com]

编辑nginx防护规则文件

vim /etc/fail2ban/filter.d/nginx-get-dos.conf

1
2
3
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

在这里需要注意一点就是:我们上面的action设置的时候,port=ssh,如果我们更改了sshd服务的端口号,我能需要在这里设置对应的端口号,否则配置不生效。

防暴力破解测试

在上面配置好了之后,我们需要让配置生效:

1
fail2ban-client reload

测试:故意输入错误密码3次,再进行登录时,会拒绝登录

我们可以查看当前被禁止登陆的ip:

1
2
3
4
5
6
7
8
9
10
11

[root@server1 jail.d]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- Filter
| |- Currently failed: 1 #当前失败次数
| |- Total failed: 4 #当前失败次数
| `- File list: /var/log/secure
`- Actions #日志文件路径
|- Currently banned: 1 #当前禁止的ip数量
|- Total banned: 1
`- Banned IP list: 192.168.224.11 #当前禁止的ip- Total banned: 1 #禁止的ip总数

fail2ban常用的命令
3.1 启动暂停查看状态

service fail2ban start/restart/stop/status fail2ban

3.2 fail2ban-client
start 启动fail2ban server和监狱
reload 重新加载配置文件
stop 暂停fail2ban和监狱
status 查看运行的监控服务数量和列表
set loglevel 设置日志等级,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG
get loglevel 获取当前日志的等级
set idle on|off 设置某个监控(监狱)的状态。
set addignoreip 设置某个监控(监狱)可以忽略的ip
set delignoreip 删除某个监控(监狱)可以忽略的ip
set banip 将ip加入 监控(监狱)
set unbanip 将ip从监控(监狱)移除

还有很多没有列出来,我只在列出了我常用的一些。

3.3 fail2ban-regex

测试筛选规则设否匹配当前的日志格式:

fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf

fail2ban邮件预警
fail2ban 利用sendmail 进行发邮件也可以用mail进行发邮件,在尝试了sendmail无果后,决定使用mail。

具体步骤:

4.1 在/etc/mail.rc末尾配置发件人的信息:

set ssl-verify=ignore
set from=djx
set smtp=smtps://mail.163.com:25
set smtp-auth-user=dj
set smtp-auth-password=
set smtp-auth=login
set nss-config-dir=/root/.certs

4.2 然后在jail.local(自己的配置文件里),加入:

mail-whois[name=SSH, dest=1120@qq.com, sender=djx@163.com]

dest 是填入收件人邮箱

sender 是填入 发送邮箱

最后重新加载下配置即可。

  1. 注意的问题:

时区问题:

http://www.fail2ban.org/wiki/index.php/FAQ_english:If time reference is not the same everywhere, then fail2ban won’t ban any IP!

当我们更改了时区后,然后日志的时间并没有修改过来,导致两者的时间不一致,这样fail2ban的工作就失效了

解决办法:重启日志服务:systemctl restart rsyslog,保证两者的时间一致。

修改端口问题:

sshd更改端口号后使用fail2ban需要注意在填写配置的时候也需要更改端口号。否则会出现就算会将ip添加到防火墙,但是由于我更改了端口号,是起不到禁止作用的。

解决方法:配置文件中 action = iptables[name=SSH, port=ssh, protocol=tcp] ,port位置修改为新的端口。

shell > cat /var/log/secure ##系统登陆日志

Jun 5 17:39:01 localhost sshd[1341]: Failed password for root from 192.168.214.1 port 2444 ssh2Jun 5 17:39:06 localhost sshd[1341]: Failed password for root from 192.168.214.1 port 2444 ssh2Jun 5 17:39:11 localhost sshd[1341]: Failed password for root from 192.168.214.1 port 2444 ssh2Jun 5 17:39:14 localhost sshd[1341]: Failed password for root from 192.168.214.1 port 2444 ssh2Jun 5 17:39:18 localhost sshd[1341]: Failed password for root from 192.168.214.1 port 2444 ssh2Jun 5 17:41:39 localhost login:
pam_unix(login:session): session opened for user root by LOGIN(uid=0)

6、加入 Nginx 防护( httpd 代替 )##目的是把规定时间内达到限定访问次数的 IP 封锁(例如,一分钟内有几百次请求)
shell > vim /etc/fail2ban/jail.conf

1
2
3
4
5
6
7
8
9
10
[nginx]   ## nginx防护
enabled = true
filter = nginx ##访问规则定义文件,位置在 /etc/fail2ban/filter.d/nginx.conf
action = iptables[name=nginx, port=http, protocol=tcp]
sendmail-whois[name=nginx,dest=1355*******@139.com,sender=fail2ban@aoath.com,
sendername="Fail2Ban"]
logpath = /var/log/nginx/access_log ## nginx访问日志
bantime = 86400 ##符合规则的屏蔽一天,如果参数值与全局有冲突,优先级大于全局配置
findtime = 600 ## 10分钟内访问超过 maxretry 次数的封锁 IP
maxretry = 1000 ##最大尝试次数

在etc/fail2ban/filter.d目录下新增nginx.conf文件并追加以下内容:

1
2
3
4
5
 vim /etc/fail2ban/filter.d/nginx.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* 404 .*$
ignoreregex =
---------------------
1
2
3
4
vim /etc/fail2ban/filter.d/nginx.conf
[Definition]
failregex =.*-.*-.*$ ## 表示访问 IP ,其余的其实是最简单匹配了。因为这里没有要匹配精确的 URL ,只是限制访问次数
ignoreregex =

shell > fail2ban-regex /var/log/nginx/access_log /etc/fail2ban/filter.d/nginx.conf ##可以测试条件规则是否可用
重启失败就手动创建access_log文件
touch /var/log/nginx/access_log
shell > service fail2ban restart ##重启服务
shell > fail2ban-client status ##可以看到有两个实例在监控中
Status
|- Number of jail: 2
- Jail list: nginx, ssh-iptables ##开始测试,通过脚本或者不管刷新页面测试 Nginx 防护( 便于测试,可以将 maxretry 的值调为 10 ) shell > fail2ban-client status nginx ##可以看到被 Ban 掉的 IP Status for the jail: nginx |- filter | |- File list: /var/log/httpd/access_log | |- Currently failed: 1 | - Total failed: 39`

  • action
    |- Currently banned: 1
    | - IP list: 192.168.214.1 - Total banned: 1

7、需要安装python,iptables,tcp-wrapper,shorewall,Gamin。如果想要发邮件,那必需安装postfix或sendmail

Linux下使用extundelete实现文件/文件夹数据恢复注意事项

恢复文件的时候一定要卸载磁盘分区
1.首先关闭防火墙和SELINUX

2.在虚拟机上创建一个2G的磁盘
fdisk /dev/sdb
n+p+1+回车+回车+w
4.使分区无需重启就能生效
partx -a /dev/sdb
5.格式化为ext4分区并挂载
mkfs.ext4 /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
注: 在实际线上恢复过程中,切勿将extundelete安装到你误删的文件所在硬盘,这样会有一定几率将需要恢复的数据彻底覆盖。
建议加装一块硬盘将extundelete安装到此硬盘,再做以下操作。
二.extundelete安装
2.下载并安装extundelete

1
2
3
4
5
 wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
# tar -jxvf extundelete-0.2.4.tar.bz2
# cd extundelete-0.2.4
# ./configure --prefix=/usr/local/extundelete
# make && make install

3.验证是否安装成功
cd /usr/local/extundelete/bin
./extundelete -v

4.设置环境变量
echo “PATH=/usr/local/extundelete/bin:$PATH” >> /etc/profile
echo “export PATH” >> /etc/profile
source /etc/profile

5.上传一些图片,安装包等文件到/data目录

cd /data
yum install lrzsz -y
rz


本地文件…..

ls
lost+found mysql-5.6.10.tar.gz nginx.conf pic.jpg

6.全部删除

rm -rf *

7.查看被删除文件
1).查看前需卸载该磁盘分区

cd ~

umount /dev/sdb1

2).查看文件注:一般一个分区挂载到一个目录下时,这个”根”目录的inode值为2我们为了查看根目录所有文件,所以查看分区inode为2的这个部分# extundelete /dev/sdb1 –inode 2——————————–…..

File name | Inode number | Deleted status.
2
.. 2
lost+found 11 Deleted
mysql-5.6.10.tar.gz 12 Deleted
nginx.conf 13 Deleted

pic.jpg 14 Deleted

注:标记为”Deleted”的文件则是被删除的文件

8.恢复指定的文件
注: 默认被删文件会恢复到当前目录下的RECOVERED_FILES目录中去

extundelete –restore-file pic.jpg /dev/sdb1

cd RECOVERED_FILES/

ll

-rw-r–r– 1 root root 52592 8月 13 07:18 pic.jpg

9.完全恢复设备上文件

extundelete –restore-all /dev/sdb1

ll

总用量34464
-rw-r–r– 1 root root 35174149 8月 13 07:24 mysql-5.6.10.tar.gz
-rw-r–r– 1 root root 4551 8月 13 07:24 nginx.conf
-rw-r–r– 1 root root 52592 8月 13 07:18 pic.jpg

-rw-r–r– 1 root root 52592 8月 13 07:24 pic.jpg.v1

注:这里完全恢复并不会把之前恢复的pic.jpg文件覆盖掉,而是重命名为pic.jpg.v1

10.恢复指定的时间点后被删文件
1).指定一个时间点

date -d “Sep 4 03:09:13 2013” +%s


1378235353

2).恢复这个时间点后的文件

extundelete –restore-all –after “1378235353” /dev/sdb1

注:如果要恢之前的就用before参数。extundelete命令与after结合使用,在进行恢复时非常有用,可以过滤掉那太旧的文件,减小恢复压力。

11.检验是否恢复成功

md5sum RECOVERED_FILES/mysql-5.6.10.tar.gz


9dcee911fb4bc7e977a6b63f4d3ffa63 RECOVERED_FILES/mysql-5.6.10.tar.gz

上传刚才误删的mysql安装包

rz

md5sum mysql-5.6.10.tar.gz

9dcee911fb4bc7e977a6b63f4d3ffa63 mysql-5.6.10.tar.gz


MD5值相同,恢复成功。。。

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...