我们的开发团队一直在考虑将 Node.js 用于需要高级别安全性的新企业应用程序。用户包括联邦警察,因此我们最终很有可能接受安全审计。
- 鉴于 Node.js 相对较新,它是否仍存在需要解决的安全问题?
- 有谁有使用 Node.js 的开发经验,并且对利用其结构进行潜在攻击有任何见解?
我很感谢你的帮助。
编辑:StackOverflow 上的一些用户建议使用反向代理,但我很好奇是否有人有更多建议。
答案1
虽然我无法指出任何具体报告的缺陷,但我对 node.js 架构感到不安 - 您的代码作为 Web 服务器代码的一部分运行。虽然使用类似 mod_php 的东西,仍然只有一个进程处理 HTTP 层和逻辑层,但两者之间有明显的功能分离,并且 Web 服务器和逻辑层之间的接口经过明确设计和测试,可以适应故障 - 特别是在逻辑层中。
此外,还有许多可用于网络服务器(尤其是 Apache)的工具,可以方便管理并(正确使用)增强安全性。
另一个主要考虑因素是技能/支持/培训的可用性 - 无论其质量/实用性如何,与其他 Web 开发平台相比,node.js 还有很大的进步空间。
我们的开发团队一直在考虑使用 Node.js
你专门试图在一个你并不十分熟悉的平台上提供本应非常安全的应用程序(从你上面的陈述来看),这似乎非常鲁莽。Web 应用程序中的大多数安全漏洞不是由于开发环境中的错误而产生的,而是由于在上面添加的定制代码中的错误而产生的。
当然,使用反向代理将有助于获取标准 HTTP 日志记录、异常检测并减少协议级攻击的影响。
构建安全 Web 应用程序的最佳工具之一是mod_security- 据我所知,这只能在 Apache 中运行 - 但它提供了可能性(以及mod_proxy) 部署一个前端系统,提供常见的 Web 服务器功能(日志记录、静态内容)以及身份验证服务,并使用 node.js 作为后端。
答案2
您可能知道,如果并发性受 IO 限制,它主要对并发性有帮助。
比 NodeJS 快得多的选项是使用 mono + F# 及其异步支持。然后,您可以使用 HttpListener 尽可能接近套接字,就像使用 NodeJS 一样。
忽略上述选择;SELinux 和 chroot 可能是其余的选择的好工具。
根据我的经验,代码中大多数导致执行任意代码的安全漏洞都是由于对数据库/磁盘的错误写入权限而导致您请求已上传的文件,或者由于非托管代码执行了错误的内存管理/边界检查。
反向代理也是一个不错的选择,因为它们久经沙场。例如 HAProxy - 它的最新版本可以同时处理 WebSockets 和普通 HTTP。
然后,您可以使用一些工具来实际测试实现。Google 使用一个名为 skipfish 的工具:https://code.google.com/p/skipfish/
您可以在协议级别和应用程序级别使用模糊测试器,但是随着编译器为您证明的内容越多,模糊测试器的重要性就越低,例如使用 JS 时您无法更改对象实例的类型,或者使用 F# 时需要进行更多静态检查,例如使用可区分联合和度量单位。
最后,如果您追求极高的代码安全性,我建议您使用 Haskell 的 Stact Framework,您可以使用编译器来实现非常高的安全性。使用 Haskell,您甚至可以使用 Coq(证明助手)或 Agda 编写小型证明(请参阅Haskell 定理证明器)
为了与服务器通信,您可能需要 DNS。您还需要使用 DNSSec 来保护 DNS,否则可能会遭受 DNS 中毒。
如果他们获得了对 LAN 的访问权限,您就会受到 ARP 毒害,这意味着有人可以窃取您的 IP;但您可以让 DNS 服务器对所有主机都会检查的 IP 到 MAC 查找表中的网络上的所有用户进行静态维护。
最后,你可以添加一个 IDS,例如呼噜到您的网络并记录程序的“正常”执行,以便您也可以对异常做出反应。
答案3
理想情况下,整个应用程序应该受到内部网或 VPN 的限制,或者非常少客户端的 IP 地址,尤其是当它要被任何类型的联邦官员使用时。如果攻击者甚至无法访问 Web 服务器,那么他们肯定无法利用 Node.js,对吧?