Administrator
Published on 2024-10-31 / 52 Visits
0
0

linux防止ssh爆破与nginx访问爆破封禁,可以挡nginx-cc轻量攻击

1.安装fail2ban,要看简介或者使用方式请自行百度

## 安装epel_release源
yum install -y epel-release

## 建立缓存
yum makecache

## 安装fail2ban
yum install -y fail2ban fail2ban-firewalld fail2ban-systemd

## Centos7支持tcpd,需要安装fail2ban-hostsdeny
yum install -y fail2ban-hostsdeny

## 现在启动并开机自启
systemctl enable --now fail2ban

#######
## 源码安装方式
## 安装sqlite3
yum install -y sqlite

## 安装依赖
yum install -y python2 python3

## 下载Fail2ban源码
wget -c https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz

## 解压Fail2ban
tar xvf 1.0.2.tar.gz

## 进入解压后的Fail2ban目录
cd fail2ban-1.0.2

## 安装Fail2ban
python3 setup.py install --record fail2ban_install.log

## 如果是1.0以下低版本,请使用python2安装
python2 setup.py install --record fail2ban_install.log

## 卸载Fail2ban
cat fail2ban_install.log | xargs rm -rf

Fail2ban目录结构如下:

  1. yum安装的/etc/fail2ban --目录结构:

  2. /etc/fail2ban/action.d ----- iptables 、mail 等动作文件目录

  3. /etc/fail2ban/fail2ban.conf ----- 定义日志级别、日志、sock文件位置等

  4. /etc/fail2ban/filter.d ----- 条件匹配(过滤器)文件目录,过滤日志关键内容

  5. /etc/fail2ban/jail.conf ----- 主配置文件,主要设置启用ban动作的服务及动作阀值,不建议修改

  6. /etc/fail2ban/jail.d/ ----- fail2ban模块化子配置文件

2.配置ssh 防止爆破信息

## 备份一下原本配置
cp /etc/fail2ban/jail.conf{,.bak}

## 全局配置白名单IP --可以不配置,如果有跳板机则可以配置
vim /etc/fail2ban/filter.d/jail.local

## 全局配置部分
[DEFAULT]
## 要忽略的 IP 地址。这些 IP 地址不会被封禁。
## 可以指定多个 IP 地址,使用 CIDR 表示法表示一个 IP 段。
## 在这个例子中,忽略的 IP 范围是 10.0.0.0 到 10.0.0.255
ignoreip = 10.0.0.0/24

## 封禁 IP 的时间长度(秒为单位)。
## 如果设置为负数(如 -1),则表示永久封禁。
## 当前设置为 864000 秒(即 10 天)
bantime = -1

## 发现同一 IP 进行多次失败尝试的时间窗口(秒为单位)。
## 例如,如果 findtime 设置为 1200(20 分钟),
## 则在 20 分钟内如果检测到多次失败尝试将触发封禁。
findtime  = 1200

## 最大失败尝试次数。
## 如果某个 IP 在 findtime 时间窗口内超过这个次数,IP 将被封禁。
## 当前设置为 2 次
maxretry = 3

## 采取的封禁动作。可以指定不同的动作来处理封禁 IP。
## 默认封禁动作是 `iptables-multiport`,即使用 iptables 管理多个端口的规则。
## 在这个配置文件中,这行被注释掉了,使用系统默认的封禁动作。
## banaction = iptables-multiport

## 后端日志分析引擎。
## `systemd` 表示使用 systemd 作为日志分析后台。
## 可选值包括:`polling`(基于文件系统的轮询),`gamin`(基于 gamin 的监视),`systemd`(使用 systemd 日志)。
backend = systemd

配置防止ssh爆破策略

vim /etc/fail2ban/jail.d/sshd_jail.local

[sshd]
## 启用防护
enabled = true
## 选择过滤器
filter = sshd

## 启用抗攻击防护模式--防护策略敏感度最高
## 正常(默认)、ddos、额外或 aggressive (攻击性 全部组合)。
## normal (default), ddos, extra or aggressive (combines all).
## 有关使用示例和详细信息,请参阅“tests/files/logs/sshd”或“filter.d/sshd.conf”。
mode = aggressive

## 禁止 IP 的持续时间(以秒为单位)。负数-1为“永久”禁止。
## 864000秒为10天
bantime = 864000
## 如果在“findtime”秒内未找到匹配,则计数器设置为零。默认 600s
findtime = 1200
## ssh登录失败阈值默认为 3
maxretry = 1
## 指定封禁的端口,默认为0:65535,也就是所有端口,但可以在jail中设定
port = ssh   #ssh 默认端口是22,如果有改了ssh连接端口则填写对应的
## 使用哪个工具方法阻止IP
## firewall防火墙: firewallcmd-ipset
## iptables防火墙: iptables 或 iptables-multiport
## 拉黑到/etc/hosts.deny: hostsdeny
banaction = iptables-multiport
            hostsdeny
## 日志路径
logpath = %(sshd_log)s
## 指定用于修改日志文件的后端
##backend = %(sshd_backend)s
backend = systemd



## 重新加载配置或重启服务
systemctl reload-or-restart fail2ban.service

## 查看服务是否正常运行
systemctl status fail2ban.service -l

sshd防护常用命令

## 查看哪些IP被ban
fail2ban-client status sshd

## 将IP从黑名单中移除
fail2ban-client set sshd unbanip 8.8.8.8

## 将IP添加到黑名单中
fail2ban-client set sshd banip 8.8.8.8

## 清空黑名单
fail2ban-client unban --all

配置后的效果,防火墙会拒绝恶意连接

防止爆破效果

3.配置nginx请求过滤,主要过滤agent伪装等

## 前言:根据nginx 设定的日志不同匹配的规则会不一样,根据自己日志中的爬虫或者注入进行规则修改,下方是我定义的nginx日志
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      'Authorization:"$http_Authorization" sec-ch-ua:"$http_sec_ch_ua" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time "$connection" "$upstream_addr" $upstream_response_time $upstream_status "$http_host"';


## 创建文件 
vim /etc/fail2ban/jail.d/nginx_jail.local

[nginx-custom-advanced]
enabled = true
port    = http,https
filter  = nginx-custom-advanced
logpath = /var/log/nginx/access.log
maxretry = 3
bantime  = -1
findtime = 600    # 10分钟内匹配3次则触发

## 配置规则文件
 vim /etc/fail2ban/filter.d/nginx-custom-advanced.conf

[Definition]
failregex = ^<HOST> - - .* "(GET|POST|HEAD|OPTIONS) /.*" .*"(Mozilla|curl|Go-http-client|python-requests|XMRig|Hello World|ethminer|ethereumstratum|.*Crypto.*)" .*
            ^<HOST> - - .* "\x.*"
            ^<HOST> - - .* ".*\{.*\"method\": \"(mining\.subscribe|mining\.hello|eth_submitLogin).*"
            ^<HOST> - - \[.*\] "(GET|HEAD|POST|\\x[0-9A-F]{2}.*?) HTTP/1\.[01]" .+ (400|444) .*$
failregex = ^<HOST> - - \[.*\] "(GET|HEAD|POST|OPTIONS|\\x[0-9A-F]{2}.*?) HTTP/1\.[01|2]" Authorization:"-" sec-ch-ua:".*?" (400|404|444|500) .*$

## 匹配恶意的User-Agent或伪造的User-Agent
failregex += ^<HOST> - - \[.*\] ".*" Authorization:"-" sec-ch-ua:".*?" \d+ \d+ ".*" "(Mozilla/5\.0 zgrab/0\.x|Baiduspider-render/2\.0.*|Mozilla/5\.0 \(Windows NT 10\.0; Win64; x64; rv:107\.0\).*|Mozilla/5\.0 \(Linux; U; Android 4\.0\.3; ko-kr; LG-L160L Build/IML74K\) AppleWebkit/534\.30.*|Mozilla/5\.0 \(Linux; Android 4\.4\.2; Nexus 4.*Tencent/BrandProtection.*)" .*$

## 匹配返回错误状态码的特殊请求
failregex += ^<HOST> - - \[.*\] ".*" Authorization:"-" sec-ch-ua:".*?" (400|444|500|302|404) .*$

ignoreregex =

重启并且检查

sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-custom-advanced

Comment