我正在设置两台计算机来运行Web应用程序。 web-host
托管MongoDB数据库和NodeJS Web服务器,而worker
运行一些要求更高的进程并填充数据库。使用来自worker
的SSH隧道,可以使用web-host:27017
中的localhost:9999
访问worker
。 web-host:80
已设置为可在http://our.corporate.site/my_site/
上访问。
目前MongoDB没有对其进行身份验证 - 任何可以联系web-host:27017
的内容都可以读取或写入任何数据库。
通过这种设置,我应该如何对MongoDB的请求进行身份验证? this question的答案似乎并不是很明显。考虑只能从localhost
进行访问,它似乎与本地文件系统一样安全。在MySQL中,我通常有一个特殊的'web'用户,它具有有限的权限来限制注入攻击的损害,以防我错误地清理输入,但是与MySQL相比,MongoDB似乎不太容易注入(或者至少更容易消毒)。
答案 0 :(得分:1)
以下是问题:如果您设置了Mongo身份验证,则需要将密钥存储在访问它的计算机上。
因此,假设web-host:80
被泄露,密钥也很脆弱。
您可以使用一些缓解流程来保护您的环境,但如果攻击者获得对您环境的root访问权限,则没有灵丹妙药。
首先,我会考虑将mongodb放在专用内部网络上的单独机器上,该机器只能由DMZ中的机器访问(机器可以与内部网络和外部世界通信的网络部分)。
接下来,假设您运行的是基于Linux的系统,您应该能够使用AppArmor或SELinux来限制允许哪些进程发出出站网络请求。在这种情况下,只有您的webapp进程应该能够启动网络请求,例如连接到Mongo数据库。
如果攻击者能够在您的计算机上获得非root访问权限,则SELinux / AppArmor系统策略将阻止他们从自己的脚本启动与数据库的连接。
使用这种架构,您应该比仅通过身份验证扩充当前架构更安全。在SELinux / AppArmor之间进行选择时,我会使用SELinux,因为它更加成熟,并且在我上次检查时具有更精细的控制。