2017-03-16 15 views
5

私は、* .mysubdomain.comへのリクエストを受け入れるように設定されたHAProxyを持っています。 HAProxyは、サブドメイン(prod.mysubdomain.comまたはdev.mysubdomain.comからprodまたはdev)を解析し、正しいバックエンドに転送します。 2つのバックエンドが存在し、1つはプロダクト用、もう1つはdev用です。各バックエンドには、各サブドメイン上のMarathon LBインスタンスを指す2つのサーバーエントリが含まれています。HAProxyでのJWT検証

サブドメインには、バックエンドでの認証にJWTクッキーが必要です。私は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 
+0

私も! HAPがクレームをリクエストヘッダーとして注入することができればさらに良いでしょう。 –

答えて

0

私の知る限り言うことができるよう、HAProxyは、JWTを検証するためのロジックを実行する機能を持っていません。代わりに、私は検証を実行するために呼び出すhaproxy.cfgためのLuaでスクリプトを実装:

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 
+0

luaスクリプトも共有できますか? –

0

他の答えは指摘したように、あなたはLuaのスクリプトを使用する必要があります。 lua-resty-jwtまたはKongの既存の実装を使用できます。

注:

  • これらのコードベースが簡潔ではありません。単純なコピー&ペーストは動作しません。だからあなたは必要最小限のものを抽出する必要があります。
  • Luaスクリプトに依存関係を設定することはできません。ただプレーンなバニラルア。だからあなたはすべてrequireステートメントを取り除かなければならない。
  • トリッキーな部分は、HMACの実装です。
  • LuaスクリプトでI/O操作が行われないようにします。ファイル、データベース、ネットワーク操作。

これは簡単な作業ではありません。がんばろう!それは価値があるものです。

関連する問題