【问题标题】:Nginx basic auth and number of authenticated locationsNginx 基本身份验证和已验证位置的数量
【发布时间】:2016-12-16 21:37:32
【问题描述】:

我在 nginx 中使用基本身份验证,没有问题,但我想限制用户通过身份验证的不同位置的数量, 最终目标是防止用户共享对网站的访问数据,因为网站会对某些数据进行实时“监控”,我不希望如果从另一个 IP 使用相同的用户/通行证组合,或者两个用户都停止获取数据, 或者其中一个停止获取数据。

【问题讨论】:

  • “监控”是如何发生的?它是通过 nginx 保持打开的永久连接吗?当使用相同的用户/密码时,期望的行为是什么,http 403 会这样做吗?一个用户可以同时拥有来自同一个 ip 的多个会话吗?
  • 每个 ip 一个会话

标签: authentication nginx


【解决方案1】:

我认为这不是一个好主意,因为一个用户可能同时通过电脑和手机登录,并且这样有两个不同的 IP 地址。 http-auth 也不是为了做你想做的事而设计的。当用户离开而没有注销时,它必须记住 IP 地址并以某种方式使其过期。总而言之,很难猜测会话的有效期有多长。另一个问题是,大多数用户没有静态 IP,并且每 24 小时就会被提供商断开连接。如果在有效登录后发生这种情况会怎样?

处理此类问题最流行的方法是会话cookie。这些可以被描述为一次性密码,您可以根据需要使用它,或者直到它过期。 SessionID 通常保存在某种数据库中,使这些会话独一无二并不是什么大问题,因此可能是您想要的。幸运的是 ngx_http_auth_request_module 将允许您只实现这个缺失的部分,并在不开发自己的 nginx 模块的情况下尽可能接近您(请参阅https://www.nginx.com/resources/wiki/modules/ 了解可用模块)。

另一方面:不要那样做。严重地。如果您关心安全性,请不要尝试重新发明轮子并使用已经证明的东西。例如。 ngx_http_auth_jwt_module 允许您使用 OpenID,这也使您无需在服务器上保存敏感的用户数据(因为除非绝对必要,否则没有人愿意保存密码)。

这两种方法都需要 nginx-modules,它可能没有安装在您的服务器上。如果您没有构建它们的权限,我建议您将其添加到您的问题中,以便其他人可以建议非根服务器的解决方案。

如果你想让它更简单,你还应该考虑每次都生成下载链接,并将 ip-address 和下载链接地址保存在数据库中。当用户下载该文件并且您完成时删除条目。为此,您可以使用 Content-Disposition: attachment; filename=FILENAME-HTTP-Header,这样您的 download.php 就不会保存名为 alike 的文件。

也许您还可以找到某种 javascript 来替换 ngx_http_auth_jwt_module 并将 OpenID 与 http-auth 一起使用。这可以工作,因为也可以使用 ajax 进行身份验证。

最后但同样重要的是:如果您仍想进行 http-auth,也请使用 HTTPS,因为默认情况下,您的密码不会被此 auth-method 加密。

【讨论】:

    【解决方案2】:

    您想要做的事情是不寻常的,因此您需要编写大量逻辑来处理该过程。

    您的代码需要为每个登录的用户存储一个用户 ID 和 IP 地址对,并以此验证每次尝试登录。正如前面的答案所指出的,您将需要使登录名等过期。基本上,您需要滚动一个会话处理程序。

    这不是不可能或特别困难,但您需要自己使用 Nginx 可用的脚本语言之一编写它到庞大的 Nginx lua 生态系统(例如由 Cloudflare 使用)。

    您将需要在3rd party Nginx Lua Module 和相关模块中进行编译,或者只需卸载 Nginx 并使用 Openresty Bundle,它已经包含了您需要的所有内容......如果您需要扩展,包括用于存储的 Redis。

    这里有一些工具可以用作构建块

    Openresty Session Library

    Openresty Redis Session Library

    Openresty Encrypted Session Module

    请注意,如果您愿意,可以直接在 Nginx 中实现 Openresty 的东西,而不必运行 Openresty,因为它只是 Nginx 和有用模块的方便捆绑。

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多