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
相关产品推荐
相关产品推荐

