gpt4 book ai didi

自定义 node.js 应用程序的 fail2ban 自定义过滤器

转载 作者:行者123 更新时间:2023-12-04 16:48:54 32 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

首先你需要在nginx中传递真实用户ip。 This helped me所以你需要在你的服务器 block 中添加一行。

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

查找位置并添加此行:

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

更多关于 reverse proxy .现在在 node.js 应用程序中只需添加

app.set('trust proxy', true)

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

req.ip

让它与 recaptcha 一起工作:所有关于 recaptcha 的信息都在这里:Google Developers

当您获得用户响应 token 时,您需要向谷歌发送发布请求以验证它。我是用 axios 做的。这是发送post请求的方法。 secret 是你的 secret ,回应是用户的回应。

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 将 console.log 指令保存在/home/youruserdir/.pm2/logs/yourappname-out.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 是否会使用 fail2ban-regex 命令识别错误行:

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 日志文件。当我在本地主机上测试时,我的应用程序使用::127.0.0.1 提供了 IP 地址。可能是ipv6相关的。它可能会造成问题。

下一步:

sudo nano /etc/fail2ban/jail.local

添加以下 block :

[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 分钟内 (finditme) 收到 5(maxrety) 个错误的帖子请求,则用户将被禁止 10 分钟。您可以更改此值。现在只需重新启动 nginx 和 fail2ban:

sudo systemctl restart nginx
sudo systemctl restart fail2ban

之后您可以使用命令检查您的 jail 是否正常工作:

sudo fail2ban-client status YOUR-JAIL-NAME

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

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

我是一步一步写的,因为可能只有经验不足的人才会寻找它。如果您看到错误或者可以给我一些建议,请发表评论。

关于自定义 node.js 应用程序的 fail2ban 自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866070/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com