Haproxy ACL 用于比较标头中的值

问题描述 投票:0回答:3

我使用 Haproxy 作为 SSL 终止来识别客户端证书。我想检查客户端证书中的 CN 值是否与客户端发送的标头值匹配。如果证书中的 CN 值与标头中的值不匹配,是否可以设置 ACL?

类似:

http-request set-header X-SSL-Client-CN     %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match hdr(client-id) -m hdr(X-SSL-Client-CN)

ssl haproxy
3个回答
3
投票

用于检查 CN 并允许基于列表进行身份验证的示例配置:

frontend www-https
   ....
   http-request set-header X-SSL-Client-CN             %{+Q}[ssl_c_s_dn(cn)]
   use_backend www-backend
backend www-backend
   acl allow_users req.fhdr(X-SSL-Client-CN) -m str -f /etc/haproxy/ssl/userslist
   http-request deny if !allow_users
   ....
   server www-1 <ip>:<port> check
   server www-2 <ip>:<port> check

1
投票

由于 HAProxy ACL 语法的限制,您只能将样本(例如标头值)与文字(例如字符串)进行比较。

如果你必须做这样的比较,你可以使用Lua来比较任何你想要的东西。请参阅来自 HAProxy 社区的此帖子


0
投票
http-request set-var-fmt(txn.client_cn) %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match req.fhdr(client-id),strcmp(txn.client_cn) eq 0

这使用

set-var-fmt
设置事务范围 (
txn
) 变量,然后我们将其与客户端 id 标头与
strcmp
过滤器
进行比较。

如果不需要使用格式字符串,则可以只使用

set-var
:

http-request set-var(txn.client_cn) ssl_c_s_dn(cn)

如果您只想在请求处理中使用该变量,则可以使用

req
范围(仅在请求处理期间可用):

http-request set-var(req.client_cn) ssl_c_s_dn(cn)
acl id_not_match req.fhdr(client-id),strcmp(req.client_cn) eq 0
© www.soinside.com 2019 - 2024. All rights reserved.