身份验证(护照)是否足以确保 Node js 后端服务器的安全性?

Authentication (Passport) enough for security with Node js backend server?

使用 Facebook 身份验证的 PassportJS 是否足以用于 iOS Node JS 后端?

我也有 toobusy 包,当事情变得繁忙时我会拒绝请求(我猜这对 DDOS 有好处)。

我也在考虑使用 nginx 作为我的 Node.JS 服务器的反向代理。

还有哪些可以扩展的安全措施?一些建议和技巧?我应该担心 PassportJS 的身份验证会话无法处理的任何与安全相关的问题?

根据护照文件: "support authentication using a username and password, Facebook, Twitter, and more."

它是中间件,它提供了将多种类型的安全方法与 NodeJS 集成的可行性。

您应该考虑应用程序的用途,是仅支持 Facebook 身份验证还是自定义 register/login 流程。如果它提供第二种选择,那么在这种情况下,最好不要依赖任何社交网站的授权令牌,例如 Facebook/Twitter 或任何其他网站。

更好的选择是创建自己的令牌,如 JWT 令牌,并将其与来自多个平台的用户绑定。它将帮助您扩展项目范围以集成其他社交网站。

这里是 link 在 NodeJS 中集成 JWT。

https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens

同样,市场上还有许多其他博客和教程可以将 JWT 与 NodeJS 集成

将所有 security-related 最佳实践塞进一个 post 中有点困难,但对于它的价值,这是我对这个问题的看法。

提供 身份验证和保护 这是两个不同的事情。 PassportJS 将能够处理与 身份验证 相关的所有事情,但防止它被愚弄或不知所措是完全不同的事情。

将 PasswordJS 置于反向代理 (RP) 之后的一个(重要)原因是您将能够为与 HTTP 相关的任何事情提供第一道防线:header/body lengths/data , 允许的方法, duplicate/unwanted headers, 等等

Nginx/Apache/HAProxy 都提供了很好的工具来处理这些情况,在 up-side 上,您也可以很好地分离关注点:让反向代理处理安全性,让 PassportJS 处理身份验证。 Architecture-wise,它也会更有意义,因为您将能够隐藏 PassportJS 节点的数量和基础设施。基本上,您想让它看起来像您的客户只有一个入口点。使用这种架构,横向扩展也会更容易。一如既往,确保您的 RP(s) 保持尽可能少的状态,最好是 none,以便线性扩展。

为了正确配置您的 RP,您需要真正了解 PassportJS 的协议(如果您想提供比 Facebook 的更多的身份验证方法)是如何工作的。了解这一点,您可以将您的 RP 设置为:

  • 拒绝任何不允许的请求 HTTP 方法(TRACE、OPTION、PUT、DELETE 等)。
  • 拒绝 requests/headers/payload 大于已知尺寸。
  • Load-balance 你的 PassportJS 节点。

就 load-balancing 而言,需要注意的一件事是 粘性 sessions。一些身份验证器将其所有状态存储在加密的 cookie 中,其他身份验证器将是一个简单的 session 句柄,只有创建 session 的节点才能理解。因此,除非你为后一种类型启用了 session 共享(如果你需要 PassportJS 弹性),你需要配置你的 RP 来处理粘性 sessions。这应该是他们应该处理的最大状态量。如果配置正确,如果您需要重新启动 RP,这甚至可以工作。

正如您认真指出的那样,toobusy(或等效项)应该到位以处理节流。根据我的经验,HAProxy 在节流方面比其他 RP 更容易使用,但 toobusy 应该也能正常工作,特别是如果你已经熟悉它的话。

另一件您可能无法控制的事情是网络分区。显然,RP 需要可访问,但它们应该充当 PassportJS 节点的中继。如果可能的话,最佳做法是将您的身份验证节点放在与后端服务器分开的 network/DMZ 上,这样除了通过 RP 之外无法直接访问它们。如果遭到破坏,它们不应该被用作 backend/internal 网络的垫脚石。