使用的堆栈:ExpressJs、NodeJs、Docker、Nginx、Ubuntu 20.04
我的后端托管在DigitalOcean droplet使用上面提到的技术堆栈。我的服务器经常多次受到特定 http/s 请求的攻击,这些请求试图读取有时敏感的信息(例如 env 文件)。这些请求来自本地网络(::ffff:192.168.128.6)以及公众。例如:
1. /wp-admin/.env
2. /api.mydomain.com/.env
3. /library/.env
4. /new/.env
5. /old/.env
6. /local/.env
7. /app/config/.env
8. /api/.env
9. /conf/.env
10. /database/.env
11. /vendor/phpunit/src/Util/PHP/eval-stdin.php
12. /showLogin.cc
13. ... not the full list ...
好消息是,所有请求都以404 状态代码但我不确定他们是否还没有成功取回一些东西......
有没有办法保护我的服务器?
我已经对我的安全服务器进行了更新,记录了所有尝试访问错误 URL 的 IP 地址,并向我发送了包含错误 URL 和 IP 地址的电子邮件,我可以做些什么来阻止服务器机器上的这些 IP 地址,以便它们无法发出任何类型的请求?
我尝试过了:
ufw insert 1 reject from IP_ADDRESS to any
我还尝试在 nginx 配置中设置拒绝 IP_ADDRESS:
server {
include /var/www/blocked_ips.conf;
listen 443 ssl;
listen [::]:443 ssl;
server_name api.mydomain-staging.com;
server_tokens off;
...rest of the code
}
这是blocked_ips.conf文件:
deny IP_1;
deny IP_2;
deny IP_3;
但这种方法似乎不起作用。
UPD 看起来 DigitalOcean 本身正在针对我的服务器,这怎么可能?我该怎么办?
如何拒绝来自某些 IP 地址的任何网络级别(而不是 nginx 或 nodejs 级别)的访问?提前感谢各位朋友!
答案1
欢迎来到互联网,在这里这是很正常的:各种爬虫和机器人都在不断地搜索不应公开的漏洞和信息。
封锁IP地址的做法是有问题的:
- 它不会阻止此类流量。
- 如果发生以下情况,你最终可能会屏蔽合法访客:
- 它们共享同一个 IP(NAT、代理、VPN)或
- 你的禁令是无限的。
您的风险模型是什么?
保护你的服务器并不是要阻止这些请求。相反,你应该有一个风险模型:
- 会发生什么(不好的事情)?
- 那这个概率有多大?
- 这会有什么后果?
- 如何应对这一风险?
如果我们根据你问题的顾虑来回答这些问题:
- 坏人可能会扫描我的服务器以获取敏感数据。
- 100%。
- 这取决于存在什么样的漏洞或敏感数据。
- ???
这没什么帮助,不是吗?但你也可以重新表述一下以描述实际风险:
- 某人(或某些软件)可能会无意中留下一个
.env
可能包含密码等敏感信息的文件。 - 您可以根据开发和管理系统的人数、他们使用什么样的工具、以前是否发生过这种情况等来估计可能性。
- 有人可能会找到该文件并利用该信息来未经许可访问我们的系统等。
- 阻止对
.env
文件的访问。定期在文件系统中搜索公开目录中的此类文件。
使用 Nginx,你可以.env
使用以下命令阻止对所有文件的访问:
location ~* /\.env$ {
deny all;
}
Web 应用程序防火墙 (WAF)
阻止某些模式的配置很简单。真正的困难在于有太多模式需要考虑。幸运的是,有典型的攻击模式集合。在 Nginx 上,您可以使用,例如,ModSecurity(开源 WAF)&OWASP ModSecurity 核心规则集就是这样一个集合。
失败禁止
如果您确实要禁止 IP 地址,您应该自动且暂时地执行此操作。失败禁止是一种常用工具。它通常用于禁止多次身份验证失败的主机,以减缓暴力登录攻击。同样,它可以设置为监视来自 ModSecurity 的消息日志。互联网上有很多教程(例如搜索)Fail2Ban ModSecurity Nginx
。