3

需要一些帮助来为自定义应用程序创建自定义过滤器,这是用 node.js 编写的 websocket 服务器。根据我对其他文章的理解,自定义 node.js 应用程序需要编写一个日志,其中输入任何身份验证失败的尝试,Fail2ban 将进一步读取这些尝试以阻止有问题的 IP。现在我需要帮助我的应用程序应该创建的日志示例,该日志可以由 fail2ban 读取或扫描,并且还需要为 fail2ban 添加自定义过滤器以读取该日志以阻止 ip 以进行暴力破解。

4

1 回答 1

2

这是一个非常老的问题,但我在谷歌找到了它,所以我会写答案。

最重要的是你记录的那一行需要有正确的时间戳,因为fail2ban使用它来禁止和取消禁止。如果日志文件中的时间与系统时间不同,fail2ban 将找不到它,因此请在主机系统中设置正确的时区和时间。在给定的示例中,我使用了 UTC 时间和时区偏移,一切正常。Fail2Ban 识别不同类型的时间戳,但我没有找到描述。但是在fail2ban手册中你可以找到两个例子。还存在用于检查您的行是否被书面正则表达式识别的命令。我真的建议使用它。我还建议使用“正则表达式测试器”。比如这个。日志行的其余部分并不重要。您只需要传递用户 ip。

这是最重要的信息,但我也会写例子。我只是在学习,所以我这样做是为了教育目的,我不确定给出的例子是否有意义,但它确实有效。我使用 nginx、fail2ban、pm2 和 node.js 以及在 Debian 10 上使用 express 来禁止基于 google recaptcha 的空/坏帖子请求。所以在你的系统中设置正确的时间:对于 debian 10 工作:

timedatectl list-timezones
sudo timedatectl set-timezone your_time_zone
timedatectl <-to check time

首先你需要在 nginx 中传递真实的用户 ip。这对我有帮助,因此您需要在您的服务器块中添加行。

sudo nano /etc/nginx/sites-available/example.com.

找到位置并添加这一行:

location / {
...
proxy_set_header X-Forwarded-For $remote_addr;
...
}

更多关于反向代理。现在在 node.js 应用程序中只需添加

app.set('trust proxy', true)

您现在可以使用以下方法获取用户 ip:

req.ip

让它与 recaptcha 一起工作:关于 recaptcha 的一切都在这里:Google Developers

当您获得用户响应令牌时,您需要向谷歌发送发布请求以进行验证。我是用 axios 做的。这是发送post请求的方法。秘密是你的秘密,回应是用户的回应。

const axios = require('axios'); 
axios
    .post(`https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${response}`, {}, {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
      },
    })
    .then(async function (tokenres) {

      const {
        success, //gives true or false value
        challenge_ts,
        hostname
      } = tokenres.data;

      if (success) {
        //Do something
      } else { 
        //For fail2ban. You need to make correct timestamp.
        //Maybe its easier way to get this but on my level of experience
        //I did it like this:
        const now = new Date();
        const tZOffset = now.getTimezoneOffset()/60; 
        const month = now.toLocaleString('en-US', { month: 'short' });
        const day = now.getUTCDate();
        const hours = now.getUTCHours()-tZOffset;
        const minutes = now.getUTCMinutes();
        const seconds = now.getUTCSeconds();    
        console.log(`${month} ${day} ${hours}:${minutes}:${seconds} Captcha verification failed [${req.ip}]`); 
        res.send(//something)
}

时区偏移以设置正确的时间。现在 pm2 在 /home/youruserdir/.pm2/logs/yourappname-out.log 的日志文件中保存 console.log 指令

现在发出空帖子请求。错误请求的示例行如下所示:

Oct 14 19:5:3 Captcha verification failed [IP ADRESS]

现在我注意到分钟和秒没有 0 但fail2ban 仍然可以识别它们,所以没问题。但请检查日期和时间是否与您的系统时间一致。

现在为fail2ban制作过滤器文件:

sudo nano /etc/fail2ban/filter.d/your-filter.conf

粘贴:

[Definition]

failregex = Captcha verification failed \[<HOST>\]

ignoreregex =

现在 ctrl+o,ctrl+x,您可以使用 fail2ban-regex 命令检查 fail2ban 是否会识别错误行:

fail2ban-regex /home/youruserdir/.pm2/logs/yourappname-out.log /etc/fail2ban/filter.d/your-filter.conf

结果将是:

Failregex: 38 total
|-  #) [# of hits] regular expression
|   1) [38] Captcha verification failed \[<HOST>\]
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [38] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?
`-

Lines: 42 lines, 0 ignored, 38 matched, 4 missed
[processed in 0.04 sec]

如您所见,匹配了 38 个。你会有一个。如果您没有匹配项,请检查 pm2 日志文件。当我在 localhost 上进行测试时,我的应用程序给出的 IP 地址为 ::127.0.0.1。它可以与 ipv6 相关。它可能会造成问题。

下一个:

sudo nano /etc/fail2ban/jail.local

添加以下块:

[Your-Jail-Name]
enabled = true
filter = your-filter
logpath = /home/YOURUSERDIR/.pm2/logs/YOUR-APP-NAME-out.log
maxretry = 5
findtime = 10m
bantime  = 10m
 

所以现在。确保您编写的过滤器名称不带 .conf 扩展名。在 logpath 中确保写入正确的用户目录和日志名称。如果您在 10 分钟内收到 5(maxrety)个错误的帖子请求(finditme),则用户将被禁止 10 分钟。您可以更改此值。现在只需重新启动 nginx 和 fail2ban:

sudo systemctl restart nginx
sudo systemctl restart fail2ban

之后您可以使用命令检查您的监狱是否正在工作:

sudo fail2ban-client status YOUR-JAIL-NAME

将记录找到了多少匹配项以及禁止了多少 ips。更多信息您可以在 fail2ban 日志文件中找到。

 cat /var/log/fail2ban.log
 Found IPADDR - 2021-10-13 13:12:57
 NOTICE  [YOUR-JAIL-NAME] Ban IPADDRES

我一步一步地写了这个,因为可能只有没有经验的人会寻找这个。如果您发现错误或者您可以向我提出一些建议,请发表评论。

于 2021-10-14T18:00:23.953 回答