NGINX Lua 基本 HTTP Authorization/Authentication 允许一定次数的尝试

NGINX Lua Basic HTTP Authorization/Authentication Allow Certain Number of Attempts

我正在尝试使用我在 Git 存储库中找到的 Lua 脚本:https://github.com/knq/nginx-crowd-lua/blob/master/crowd-auth.lua 授权用户针对 Atlassian Crowd 用户管理系统限制内容。

当我按原样使用此脚本时会发生什么,如果用户输入不正确 username/password,则浏览器 returns 403 禁止响应,不允许用户重试,除非用户关闭浏览器并返回页面。

我想做的是在显示 403 页面之前允许尝试登录 3 次。

我试过循环此脚本,但循环不起作用,错误的 user/pass 在第一次尝试时直接进入 403 页面,或者循环是无限的,允许无限次尝试.

有人可以就此提出建议吗?如果您需要更多详细信息,请发表评论,我会提供。

谢谢

我明白了。对于那些也对此感兴趣的人,我已经发布了解决方案:

ngx.header['WWW-Authenticate'] 命令停止脚本并发送新请求。没有任何类型的变量,无论是在 NGINX 还是 Lua 中,都可以跨请求保存它的值。您可以做的是设置一个 cookie 来保存最大身份验证尝试次数,如下所示:

local auth_tries = ngx.var.cookie_AuthAttempts

if not auth_tries then
  auth_tries = 1
end

if type(auth_tries) == "string" then
  auth_tries = tonumber(auth_tries)
end

然后在循环结束时设置计数器,并将 cookie 设置为其值:

auth_header = nil
auth_tries = auth_tries + 1

ngx.header['Set-Cookie'] = "AuthAttempts="..auth_tries.."; Path=/; Expires="..ngx.cookie_time(ngx.time() + 3600*24)

然后,如果已达到最大失败尝试次数,则清理并发送 401 响应:

ngx.header['Set-Cookie'] = "AuthAttempts=0; Path=/; Expires="..ngx.cookie_time(ngx.time() + 3600*24)

if res ~= nil then
if res.status ~= 200 then
  ngx.exit(ngx.HTTP_FORBIDDEN)
end
else
  ngx.exit(ngx.HTTP_FORBIDDEN)
end

使用 Fail2Ban。 这是一个示例操作方法: https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04

上述解决方案不能防止 DDoS 攻击。