You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ACL中无法匹配变量子串问题求助

mTLS授权配置中ACL变量匹配失败问题解决方案

问题描述

我正在配置mTLS授权,但遇到了问题。需要检查变量ssl_c_s_dn是否包含txn.ou的内容(txn.ou通过http-request set-var(txn.ou) str(/OU=),concat(,txn.subdomain,/)定义)。

尝试了以下几种ACL写法:

acl app_auth2 ssl_c_s_dn -m sub txn.ou
acl app_auth3 ssl_c_s_dn -m sub var(txn.ou)
acl app_auth4 ssl_c_s_dn -m sub %[txn.ou]
acl app_auth5 ssl_c_s_dn -m sub %[var(txn.ou)]

所有ACL结果始终为否定,但已确认txn.ou确实是ssl_c_s_dn的子串。

编辑:补充测试
做了额外测试:

acl app_auth2 str(code/OU=code/code) -m sub str(code)
acl app_auth3 str(code/OU=code/code) -m sub code # 唯一结果为真的写法
acl app_auth4 str(code/OU=code/code) -m sub %[str(code)]
acl app_auth5 str(code/OU=code/code) -m sub %[code]
acl app_auth6 str(code/OU=code/code) -m sub %{+Q}[code]
acl app_auth7 str(code/OU=code/code) -m sub %{+Q}[str(code)]

看起来比较时完全没有解析函数,情况是否如此?

核心原因

HAProxy的ACL匹配规则中,-m sub这类匹配操作的右侧参数仅支持字面量字符串,不支持直接解析变量或表达式。所有你写的txn.ou、var(txn.ou)、%[txn.ou]都会被当作普通字符串处理,而不是解析为对应变量的内容,自然无法匹配成功。测试中只有直接写code的app_auth3能命中,就是因为这是唯一的字面量匹配。

解决方案

要实现变量内容的子串匹配,需要通过条件判断+变量存储的方式实现:

方法1:先存储匹配结果再用ACL判断

先通过http-request set-var计算匹配结果,再用ACL检查这个结果:

# 先判断ssl_c_s_dn是否包含txn.ou的内容,匹配成功则设置txn.ou_match为1
http-request set-var(txn.ou_match) str(1) if { ssl_c_s_dn -m sub %[var(txn.ou)] }
# 用ACL检查匹配结果
acl app_auth txn.ou_match eq 1

这里的关键是:if条件中的%[var(txn.ou)]会被HAProxy解析为变量的实际值,再执行子串匹配。

方法2:直接在授权规则中使用条件

如果不需要单独的ACL,可以直接在http-request deny/allow中使用匹配条件:

# 当ssl_c_s_dn不包含txn.ou内容时拒绝请求
http-request deny unless { ssl_c_s_dn -m sub %[var(txn.ou)] }

内容的提问来源于stack exchange,提问作者lapourgagner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:42:41