HAProxy中的JWT验证

时间:2017-03-16 13:57:48

标签: jwt haproxy

我已将HAProxy配置为接受对* .mysubdomain.com的请求。 HAProxy将解析子域(prod或dev来自prod.mysubdomain.com或dev.mysubdomain.com)并转发到正确的后端。存在两个后端,一个用于产品,一个用于开发。每个后端包含两个服务器条目,指向每个子域上的Marathon LB实例。

子域需要JWT cookie才能在后端进行身份验证。我有公钥来检查JWT的有效性,但是希望在HAProxy中这样做。有没有办法添加我自己的代码来执行HAProxy配置中的JWT有效性检查?

HAProxy配置文件如下:

global
    maxconn 256

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80
    mode http

    # Returns true when one of the headers contains one of the strings either isolated or delimited by dots. This is used to perform domain name matching.
    acl host_dev hdr_dom(host) -i dev
    acl host_prod hdr_dom(host) -i prod

    acl jwtPresent req.cook(JWT) -m found

    use_backend prod_domain if jwtPresent host_prod
    use_backend dev_domain if jwtPresent host_dev

    default_backend prod_domain

backend prod_domain
    balance roundrobin
    server prodDomain1 "${MARATHON_LB_PROD_1}" maxconn 32 check
    server prodDomain2 "${MARATHON_LB_PROD_2}" maxconn 32 check

backend dev_domain
    balance roundrobin
    server devDomain1 "${MARATHON_LB_DEV_1}" maxconn 32 check
    server devDomain2 "${MARATHON_LB_DEV_2}" maxconn 32 check

3 个答案:

答案 0 :(得分:1)

据我所知,HAProxy没有执行验证JWT的逻辑的功能。相反,我在Lua中为haproxy.cfg实现了一个脚本来调用以执行验证:

global
    maxconn 256
    lua-load /choose_backend.lua

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80

    http-request set-header X-SSL-Client-DN             %{+Q}[ssl_c_s_dn]


    http-request set-var(txn.backend_name) lua.backend_select()
    use_backend %[var(txn.backend_name)]

backend prod_domain
    balance roundrobin
    server prodDomain1 "${MARATHON_LB_PROD_1}" maxconn 32 check
    server prodDomain2 "${MARATHON_LB_PROD_2}" maxconn 32 check

backend dev_domain
    balance roundrobin
    server devDomain1 "${MARATHON_LB_DEV_1}" maxconn 32 check
    server devDomain2 "${MARATHON_LB_DEV_2}" maxconn 32 check

答案 1 :(得分:1)

正如另一个答案指出的那样,你必须使用Lua脚本。您可以使用lua-resty-jwtKong中的现有实施。

备注:

  • 那些代码库并不简洁。一个简单的副本&粘贴不起作用。因此,您必须提取所需的最低限度。
  • 您的Lua脚本中不能包含依赖项。只有普通的香草Lua。所以你必须摆脱所有require陈述。
  • 棘手的部分是HMAC实施。
  • 避免在Lua脚本中执行任何I / O操作,例如文件,数据库,网络运营。

这不是一件容易的事。祝好运!这是值得分享的东西。

答案 2 :(得分:0)

HAProxy可以充当API网关,并针对公共密钥验证JWT令牌。他们写了一篇博客文章,并提供了示例代码来向您展示如何操作。

帖子在这里:https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-2-authentication/

示例lua代码在这里:https://github.com/haproxytech/haproxy-lua-jwt