收起左侧

给nginx的网页配上密码验证并配置fail2ban防止暴力破解

3
回复
769
查看
[ 复制链接 ]

1

主题

4

回帖

0

牛值

江湖小虾

2025-1-1 23:19:12 显示全部楼层 阅读模式

fail2ban是什么

Fail2Ban是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以Python程序设计语言编写,并能够在类Unix系统上运行,这些系统具有本地安装的数据包控制系统或防火墙的接口,例如Iptables或TCP Wrapper。 --wiki

为什么需要fail2ban

为了更好的保护网站,服务(ssh等)的密码不被暴力破解

使用环境

系统:fnos docker:nginx

Linux ***2 6.6.38-trim #80 SMP PREEMPT_DYNAMIC Tue Dec 10 20:45:43 CST 2024 x86_64 GNU/Linux

如何操作

以下操作都要使用root账户

安装以及配置fail2ban

软件安装

# 使用root
sudo su root
# 更新软件源
apt-get update
# 更新所有软件到最新
apt-get upgrade
# 安装jail2ban
apt-get install jail2ban

对于debian系统,由于日志系统写到systemd,所以需要对配置文件进行修改才能成功启动fail2ban。否则,会出现如下错误。

fail2ban.configreader   [2192]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
fail2ban                [2192]: ERROR   Failed during configuration: Have not found any log file for sshd jail
fail2ban                [2192]: ERROR   Async configuration of server failed

修改sshd配置

# 进入软件配置主目录
cd /etc/fail2ban
# 修改默认的配置文件
vim ./jail.d/defaults-debian.con

在中间加一条 backend=systemd 最后文件内容如下

[sshd]
backend=systemd
enabled = true

[可选]去掉烦人的warning

启动fail2ban的使用,可能会遇到如下warning

WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'

需要在主路径建立 fail2ban.local文件,并写入

[DEFAULT]
allowipv6 = auto

重启软件即可去掉warning。

启动软件

启动

systemctl start fail2ban

开机自启

systemctl enable fail2ban

查看状态

systemctl status fail2ban

● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-01-01 19:02:16 CST; 25min ago
       Docs: man:fail2ban(1)
   Main PID: 1999795 (fail2ban-server)
      Tasks: 5 (limit: 7031)
     Memory: 29.1M
        CPU: 1.237s
     CGroup: /system.slice/fail2ban.service
             **─1999795 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

查看封锁列表

fail2ban-client status

Status
|- Number of jail:  1
`- Jail list:   sshd

查看SSH封锁情况

fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned: 0
   `- Banned IP list:

配置nginx的网页密码验证,失败自动封锁ip

  • 安装htpasswd
apt-get install apache2-utils
  • 添加用户生成和密码
htpasswd -B -c /home/yuzu/disk/docker/nginx/password username

其中 /home/yuzu/disk/docker/nginx/为你nginx配置的路径。

  • 配置 Nginx 认证
server {
  listen 80;
  server_name  localhost;
  # ...

  auth_basic "请输入用户和密码"; # 验证时的提示信息
  auth_basic_user_file  /home/yuzu/disk/docker/nginx/password; # 认证文件

  location / {
      root   /var/www;
      index  index.html index.htm;
  }
  # ...
}

重载 Nginx 配置文件后生效

# 进入docker
docker exec -it nginx bash
# 测试配置文件
nginx -t
# 重载配置文件
nginx -s reload
# 退出docker
exit

配置用于nginx验证的fail2ban

fail2ban配置主路径

cd /etc/fail2ban

修改filter

使用正则表达式定义要封禁的主机(登录失败的主机),用 <HOST>标识主机IP地址部分。

vim filter.d/nginx-auth.conf
# 写入下面内容
[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
              user .* was not found in.*client: <HOST>
              user .* password mismatch.*client: <HOST>
ignoreregex = 

修改jail

vim jail.d/nginx.local
# 写入下面内容
[nginx-auth]
enabled = true
filter = nginx-auth   # 填写filter的文件名
# 如果你的nginx在系统中运行,可以把chain改为INPUT或者不填写
action = iptables-allports[name=NoAuthFailures,chain="FORWARD"] # 由于我的nginx在dokcer里,给FORWARD链加reject规则

bantime = 3600 # 1h # 测试封锁时间3600s
maxretry = 10 # 尝试10次封锁
logpath = /home/yuzu/disk/docker/nginx/logs/error.log # 填写nginx的error路径

测试

重启fail2ban

systemctl restart fail2ban

11次后,应该封锁ip,也就是访问不了网页了,可以使用以下命令之一查看封锁了ip 1.2.3.4

  • iptables
# 使用grep抓取指定位置
iptables -L -n --line-numbers -t filter|grep -i "chain f2b" -A5
——————

Chain f2b-NoAuthFailures (1 references)
num  target     prot opt source               destination       
1    REJECT     0    --  1.2.3.4       0.0.0.0/0            reject-with icmp-port-unreachable
2    RETURN     0    --  0.0.0.0/0            0.0.0.0/0   
  • fail2ban
fail2ban-client status nginx-auth
——————
Status for the jail: nginx-auth
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 21
|  `- File list:    /home/yuzu/disk/docker/nginx/logs/error.log
`- Actions
   |- Currently banned: 1
   |- Total banned: 3
   `- Banned IP list:   1.2.3.4
  • 用手机进行外网测试后,解除IP封锁
# 解除ip封锁1.2.3.4
fail2ban-client set nginx-auth unbanip 1.2.3.4

未解决的问题

由于我为了让NAS能更快的下载东西,把网关改到旁路由上了,所以nginx的error.log都是旁路由的ip。 在网上查询是由于SNAT转换导致的,目前还没有什么好的解决办法,只能把网关指向改回来了。

查询资料用到的资料

Nginx配置密码访问 nginx无法获取真实ip的原因 fail2ban如何配置iptables的forward链 关于nginx验证的fail2ban配置文件的写法

收藏
送赞 1
分享

4

主题

93

回帖

0

牛值

fnOS系统内测组

飞牛百度网盘玩家

2025-1-12 22:07:43 显示全部楼层
这个办法好 支持了
让我们一起实现梦想

6

主题

40

回帖

0

牛值

fnOS系统内测组

2025-4-22 16:00:06 显示全部楼层

不错,但是有些地方貌似写错了

1

主题

1

回帖

0

牛值

江湖小虾

syslog中只会在用户名正确密码错误时才会记录登录错误日志, ssh登录错误日志找不到这个也是个问题

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则