上次网站被入侵,害我花费了非常多的时间去整理数据,然后重装系统。因此本篇文章主要讲讲如何构建一套属于自己的服务器防御体系。当然最重要的还是介绍两款防火墙ufw和fail2ban。
有经验的朋友,相信都或多或少的听说过这两款防火墙。
UFW是Linux系统中一个非常常用的防火墙管理工具。它本质上是对底层防火墙(iptables 或 nftables)的一个简化封装,让你不用写复杂规则,也能快速构建安全策略。
Fail2Ban则是一款专门用来防御暴力破解和恶意扫描的安全工具。它通过实时分析日志文件,自动识别可疑行为,并把攻击者的IP拉黑,送进监狱。
接下来讲一下如何安装和使用方法:
Fail2Ban使用教程:
一.安装Fail2Ban
a.更新系统(建议先做)
1 2 3 sudo apt update && sudo apt upgrade -y
b.安装 Fail2Ban
1 2 3 sudo apt install fail2ban -y
安装完成后,它会自动启动。
c.查看运行状态
1 2 3 sudo systemctl status fail2ban
如果看到:
active (running)
说明已经正常运行
二.配置Fail2Ban
a.Fail2Ban不要直接改原配置文件,正确方式是复制一份,并命名jail.local:
1 2 3 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
b.修改默认的全局配置
找到DEFAULT选项,修改为:
1 2 3 4 5 6 7 8 9 10 11 12 [DEFAULT] # 封禁时间(秒) bantime = 3600 # 检测时间窗口(10分钟) findtime = 600 # 最大失败次数 maxretry = 5
此处还是解释一下:
bantime就是默认的封禁时间
如果封禁10分钟,就是10m
如果封禁1小时,就是3600,也可以写成1h
如果封禁1天,就是1d
如果永久封禁,就是-1,表示永久(不会自动解封)
findtime就是默认的检测时间窗口
就是检查日志中的时间,比如10分钟内发现该ip扫描5次错误,就封禁
这个你可以配合日志进行更改,有的脚本很奸诈,比如它每10分钟内只扫描3次,你不修改findtime,规则那就起不到作用了
maxretry就是最大失败次数,这个不用解释了,就是字面意思了,都懂
c.自然是修改监狱jails
启用SSH防护(必须开)
找到sshd,修改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [sshd] # To use more aggressive sshd modes set filter parameter "mode" in jail.local: # normal (default), ddos, extra or aggressive (combines all). # See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details. #mode = normal enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_ backend)sbantime = 30d action = iptables-allports[name=sshd]
enabled是启用的意思
port是监听端口,ssh默认是22端口
logpath日志路径,相当于/var/log/auth.log
backend日志读取方式,通常是:systemd或auto,一般不用动,默认就好
bantime封禁时间,这里会覆盖刚刚的default
action自然就是封禁方式,这里的意思是封禁这个IP的所有端口访问。需要的,前往/etc/fail2ban/action.d文件夹查看修改
d.修改Nginx网站的防护规则:
启用nginx-http-auth规则,修改为:
1 2 3 4 5 6 7 [nginx-http-auth] enabled = true port = http,https,1100:1200 logpath = /www/wwwlogs/*.log action = iptables-multiport[name=nginx-http-auth, port="http,https,1100:1200", chain="DOCKER-USER"]
规则的作用是:防止网站登录接口,后台被暴力破解。这对于启用了basic auth的网站很有作用
启用nginx-botsearch规则,修改为:
1 2 3 4 5 6 [nginx-botsearch] enabled = true port = http,https logpath = /www/wwwlogs/*.log
规则的作用是:拦截扫描器 / 恶意爬虫 / 探测路径的机器人
启用phpmyadmin-nginx规则,修改为:
1 2 3 4 5 6 7 [phpmyadmin-nginx] enabled = true port = http,https logpath = /www/wwwlogs/*.log filter = phpmyadmin-syslog
启用mysqld-auth规则,修改为:
1 2 3 4 5 6 7 8 9 10 [mysqld-auth] enabled = true port = 3306 logpath = /www/server/data/xxx.err backend = auto bantime = 10m findtime = 10m maxretry = 5
e.你可以自定义规则,举个例子
假如你有一个网站,你需要添加规则,那么在jail.local文件里面新增一个nginx-login
1 2 3 4 5 6 7 8 9 10 11 12 13 [nginx-login] enabled = true port = http,https filter = nginx-login logpath = /www/wwwlogs/xxx.com*.log #action = iptables-multiport[name=nginx-login, port="http,https,1100:1200", protocol=tcp] #action = ufw[name=nginx-login, port=http,https, protocol=tcp] #action = ufw[name=nginx-login, port=any, protocol=all] #action = iptables-allports[name=nginx-login] #action = iptables-allports[name=nginx-login, chain="DOCKER-USER"] action = iptables-multiport[name=nginx-login, port="http,https,1100:1200", chain="DOCKER-USER"]
之后在filter.d目录下新建一个nginx-login.conf,配合你的日志=进行规则更改
1 2 3 4 5 [Definition] failregex = ^<HOST > - .* "POST /admin/api/account/login\.php HTTP/.*" 401 .* $ ignoreregex =
再然后再action.d目录下新建iptables-multiport.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 sudo systemctl restart fail2ban (重启) systemctl status fail2ban (确认fail2ban 正常运行) sudo fail2ban-client status sshd (查看sshd封禁状态) sudo fail2ban-client status nginx-http-auth (查看nginx-http-auth封禁状态) sudo fail2ban-client status nginx-botsearch (查看nginx-botsearch封禁状态) sudo fail2ban-client get sshd bantime (查看封禁时间) sudo fail2ban-client status(检查监狱是否启用) sudo fail2ban-client -t (查看哪里出了问题) sudo fail2ban-client set sshd banip 1.2.3.4 (手动触发封禁) sudo fail2ban-client set sshd unbanip 1.2.3.4 (解封) sudo fail2ban-client set nginx-botsearch unbanip 1.2.3.4 sudo fail2ban-client set nginx-http-auth unbanip 1.2.3.4 sudo fail2ban-client set nginx-login unbanip 1.2.3.4 ignoreip = 127.0.0.1/8 ::1 172.22.0.0/16 192.168.0.0/16 (忽略自己的ip)
四.还有一件事,就是你如果使用了docker容器,比如使用docker安装nginx proxy manager反代理。那么需要在你网站的nginx目录下,获取真实的ip地址,然后在action添加chain,才能获取到真实ip。而且每次修改规则后,都需要重启才能生效。因为我用的是aapanel宝塔面板,所以日志在/www/wwwlogs/目录下。
UFW使用教程:
UFW是Ubuntu系统上最简单易用的防火墙工具,它本质是iptables的前端封装。用UFW,你可以轻松控制谁可以访问你的服务器端口
aapanel宝塔面板默认安装的,我就简单介绍一下流程
一.安装UFW
1 2 3 4 sudo apt update sudo apt install ufw -y
二.查看UFW状态
1 2 3 sudo ufw status verbose
三.启用 UFW
四.允许防火墙端口
1 2 3 4 sudo ufw allow 222/tcp sudo ufw allow 222/udp
五.删除对旧端口的允许
1 2 3 4 sudo ufw delete allow 22/tcp sudo ufw delete allow 22/udp
六.重启
作用:重新加载 /etc/ufw/ 下的规则
给网站添加basic auth密码验证
一.在网站根目录新建一个.htpasswd
二.粘贴用户名密码代码,账号和密码都是666
1 2 3 666:$apr1$R6H2hP8H$CjJQW6VYJ9p7F6sFzY3zA/
三.在本地nginx配置里设置
/www/server/panel/vhost/nginx/xxx.com.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 获取真实ip(关键) set_real_ip_from 172.16.0.0/12; real_ip_header X-Forwarded-For; real_ip_recursive on; location / { auth_basic "Restricted Area"; # 显示在弹窗上的提示文字 auth_basic_user_file /www/wwwroot/xxx.com/.htpasswd; # 处理 OPTIONS 预检请求 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } }
设置ssh秘钥登录
开始之前输入命令:
如果禁止root登录,那么用户在/home/xxx/.ssh
1.先打开vps的ssh密码登录,然后运行以下命令来生成 SSH 密钥对:
1 2 3 4 5 ssh-keygen -t rsa -b 4096 文件在/root/.ssh/authorized_keys
2.完成后运行:
屏幕上会显示一长串字符,那是公钥内容。复制下来备用。
3.继续在PuTTY里敲命令:
1 2 3 4 cd .ssh cat id_rsa.pub >> authorized_ keys
注意那个>>符号,是把公钥内容追加到authorized_keys文件里。
设置正确的文件权限(虽然系统一般会自动设好):
1 2 3 4 chmod 600 authorized_keys chmod 700 ~/.ssh
4.进入/root/.ssh/目录,把id_rsa这个文件下载到本地保存好。这就是你以后登录的钥匙。
5.配置 SSH 服务禁用密码登录:
编辑服务器上的 SSH 配置文件:
1 2 3 sudo vim /etc/ssh/sshd_config
修改或添加以下配置项:
禁用密码验证:
1 2 3 PasswordAuthentication no
确保以下选项启用:
1 2 3 4 5 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
6.重启 SSH 服务:
1 2 3 sudo systemctl restart ssh
7.PuTTY登录:
a.需要使用puttygen将id_rsa生成id_rsa.ppk
b.输入IP和端口
c.左侧菜单选:Connection—SSH—Auth—Credentials
d.在”Private key file for authentication”那里选择你的私钥文件
e.点Open连接。输入用户名即可自动登录
结束语录:
其实还有一款防火墙CSF,因为可能会和ufw起冲突,所以我这里就不介绍了,需要的自己去研究安装,哈哈。
说到底UFW是控制入口。Fail2Ban是自动反击,封禁攻击者ip。再给网站加密码验证。再使用秘钥登录。简直就是铜墙铁壁,神仙都难攻。哈哈