我用 Django 1.6 和 PostgreSQL 数据库建立了一个网站,该网站托管在 Ubuntu 12.04.3 上,使用 Apache 2.2.22,最近我注意到每天都有大量来自不同 IP 的黑客攻击(探测)尝试,我的收件箱里塞满了报告,这开始让人很烦。
一些服务器请求的摘录(路径和 IP 被屏蔽):
'PATH_INFO': u'/myadmin/scripts/setup.php',
'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/myadmin/scripts/setup.php',
'QUERY_STRING': '',
'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
'REMOTE_PORT': '62637',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/myadmin/scripts/setup.php',
'PATH_INFO': u'/phpTest/zologize/axa.php',
'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/phpTest/zologize/axa.php',
'QUERY_STRING': '',
'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
'REMOTE_PORT': '60853',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/phpTest/zologize/axa.php',
'PATH_INFO': u'/pma/scripts/setup.php',
'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/pma/scripts/setup.php',
'QUERY_STRING': '',
'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
'REMOTE_PORT': '64751',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/pma/scripts/setup.php',
'CSRF_COOKIE': u'bmbTHkbfWOeldHyAWBwj6rLb2yEopMnZ',
'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/HNAP1/',
'QUERY_STRING': '',
'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
'REMOTE_PORT': '57303',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/HNAP1/',
在某种程度上,我并不关心这些尝试,因为它们主要在检查 php 漏洞(据我所知),但我想对此采取一些措施,而不仅仅是对这些 IP 进行 fail2ban。
因为这是我第一次遇到这个问题,所以我想确保我的网络服务器真的足够安全,我想知道我能做些什么来确保那些机器人不会对我的网站和数据库造成任何损害。数据库中的信息本身并不是那么重要,即使有人获得了它的副本,也不会有人受到伤害,但仍然…… :)
所以,我的问题是:
1) 到目前为止,我的网站和数据库真的“安全”吗?因为我没有在上面提供任何 PHP 网站?
2) 除了他们请求的 IP/PORT 和 PATH 之外,我还能用 Python/Django 收集有关此尝试的更多信息吗(例如,获取“人”试图运行的实际脚本的源代码)?
3) 是否有任何非常知名的 IP 列表可用于扫描此类漏洞,以便我可以自动更新我的禁用 IP 列表?
4) 是否有任何服务可以报告我收集的 IP?
5) 通常,哪些最佳实践可以使您的网站/服务器不仅免受这些脚本的攻击,而且免受任何其他常见渗透尝试的攻击(我知道可能存在大量不同的尝试,但我只对我的特定服务器配置感到好奇 - Django/PostgreSQL/Apache/Ubuntu)?
非常感谢您对此提供的任何帮助和提示!
答案1
例如,您可以使用 mod_security 来限制来自单个 IP 地址的探测请求量。
像这样:
LoadModule security2_module modules/mod_security2.so
<IfModule !mod_unique_id.c>
LoadModule unique_id_module modules/mod_unique_id.so
</IfModule>
SecRuleEngine On
SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecTmpDir /var/lib/mod_security
SecDataDir /var/lib/mod_security
SecRule REQUEST_URI "\.php$" id:1,phase:request,initcol:IP=%{REMOTE_ADDR},pass,nolog
SecRule IP:COUNTER "@gt 5" d:2,phase:request,t:none,setvar:IP.COUNTER=+1,expirevar:IP.COUNTER=900,deny,status:503,nolog
SecRule REQUEST_URI "\.php$" id:3,phase:request,t:none,setvar:IP.COUNTER=+1,expirevar:IP.COUNTER=900,nolog
这将返回503 Service Unavailable
尝试访问 URI.php
超过 5 次的任何 IP,每次尝试之间的暂停时间少于 15 分钟。
如果您的服务器上运行着任何 PHP 软件,请不要这样做。