我目前正在使用 HAProxy 的
http-request auth
操作来有条件地限制对资源的访问。我想继续将与成功授权相关的用户名添加到传递到后端的请求标头中,模拟 Apache 环境变量HTTP_AUTH_USER
。
我可以通过
http_auth_group
获取与该操作关联的组,但更愿意拥有用户名。
我很感激我可以将此操作移至 Web 服务器,但当我可以通过代理在 2 个地方执行此操作时,我宁愿不在 10 台计算机上管理少量用户名和密码。
http_auth_group
第7层样本获取乍一看命名有点混乱,其中出现了“group”一词,暗示它返回的是group。 事实上,它以组作为参数并且不返回任何值,除非请求已使用指定组成员的凭据进行身份验证...在这种情况下,它返回用户名。
因此它有两个目的:测试其真实性以确定该组的任何成员是否已验证该请求,或者提取用户名。 所以...
http-request set-header X-Username %[http_auth_group(GROUP_NAME)]
...将删除传入请求中的任何
X-Username:
标头(不区分大小写)(如果已存在),并使用经过身份验证的用户的用户名填充新的X-Usernane:
标头,否则为空白值(如果您的配置允许匿名请求)。
使用
set-header
很重要,不是add-header
,因为添加标头不会删除传入请求中的任何匹配标头,这会带来安全风险。 除非您有特定原因要添加,否则请始终进行设置。
我也有类似的问题,但我不能使用 basic-auth 列表和
http_auth_group
,因为我需要从后端服务器上进行的 BasicAuth 身份验证记录 user
- HaProxy 这里只是负载均衡器。
经过多次尝试 LUA 脚本,我做出了更简单的解决方案:
defaults
(...)
# I need SSL protocol and user at the end of log:
log-format "%ci:%cp (...) %sslv user=%[var(txn.user)]"
frontend example
(...)
#Use header "authorization", use string after "Basic ", decode with base64, use string before ":"
http-request set-var(txn.user) req.hdr(Authorization),regsub(Basic\s*,),b64dec,field(1,:) if { req.hdr(Authorization) -m found }
您必须意识到,在这种情况下(后端服务器上的基本身份验证,而不是 HaProxy)使用此标头进行 ACL 可能不安全:变量
txn.user
存储客户端提供的 user
,但它没有说明是否用户是否在后端服务器上进行了身份验证。