我有一个实时的 Django 网站项目(我们称之为 example.com)。这是一个用户可以提交评论并回复他们的论坛。它有一个 Postgresql 数据库,以及作为 Web 服务器设置的 gunicorn + nginx 反向代理。我托管在 Azure 驱动的虚拟机上,使用基于 Debian 的 Ubuntu 14.04 lts 作为操作系统。最后,请注意 Web 应用程序和服务器位于两个独立的虚拟机实例上。
我怀疑我的服务器可能受到了损害 - 我正处于数据收集阶段,我正在确定 (i) 我的服务器是否确实受到损害 (ii) 我的数据是否也受到损害 (iii) 损害是如何发生的,所以我不会再次被黑客入侵。
在 Django 应用程序中,有一个base.html
所有其他.html
文件都继承的文件(或extend
在 Django 中)。该base.html
文件包含<head>
带有所需元标记等的标记,因此不必在每个模板文件中复制它。
我的base.html
文件中有一些不是我编写的 javascript 代码。事实上,我根本不在我的代码中使用 javascript。这个恶意的 javascript 片段将我的用户重定向到广告(这是一种赚钱的黑客)。如果我登录到我的 Web 应用程序的生产服务器和文件(即在文本编辑器中打开它),那么有问题的 javascript 片段nano
不会出现在那里。base.html
其次,当我在我的实时网站(浏览器:Firefox)上检查元素时,我会在我的网站ev
的折叠标签旁边看到一个按钮:
这显然是在 Mozilla 的代码检查器中调试 JS 的事件按钮。如果我按下它,我会看到:
我不确定是什么:37
(端口 37?)。此外,如果我按下前面的暂停(调试)按钮click
,我会被带到我的base.html
代码中的一个 JS 片段:
我的困惑是,当我的生产服务器中的文件似乎没有这些 JS 片段时,它们如何成为我的实时网站的一部分?
我猜想找到黑客的来源需要更深入地研究这一点。我还没有安装 SSL,但我怀疑我的问题无法解决。这是一个两人项目 - 另一个人是非技术人员,文化人类学专业,专门研究南亚研究,所以我敢肯定她与此无关。
我已经准备rules.v4
好iptables
:
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
1COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT