2017-03-16 30 views
5

Mam konfigurację HAProxy skonfigurowaną do przyjmowania żądań do * .mysubdomain.com. HAProxy przeanalizuje poddomeny (prod lub dev od prod.mysubdomain.com lub dev.mysubdomain.com) i przekazuje do właściwego backendu. Istnieją dwa backendy, jeden dla prod i jeden dla dev. Każdy backend zawiera dwa wpisy serwera wskazujące na instancje Marathon LB w każdej poddomenie.Walidacja JWT w HAProxy

Poddomeny wymagają pliku cookie JWT do uwierzytelnienia w zapleczu. Mam klucz publiczny do sprawdzania ważności JWT, ale chciałbym to zrobić w HAProxy. Czy istnieje sposób na dodanie własnego kodu do sprawdzania poprawności JWT w konfiguracji HAProxy?

Plik konfiguracyjny HAProxy jest następujący:

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

Ja też! Byłoby jeszcze lepiej, gdyby HAP mógł wstrzykiwać roszczenia jako nagłówki żądań. –

Odpowiedz

0

O ile mogę powiedzieć, HAProxy nie posiada funkcjonalności do wykonywania logiki dla walidacji JWT. Zamiast tego, I wdrożone w Lua skrypt dla haproxy.cfg zadzwonić do przeprowadzenia walidacji:

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

Czy możesz również udostępnić skrypt Lua? –

0

Jako druga odpowiedź wskazał, trzeba użyć skryptu Lua. Możesz użyć istniejących implementacji z lua-resty-jwt lub Kong.

Uwagi:

  • te kodowej zasady nie są zwięzłe. Wklejenie prostej kopii & nie działa. Musisz więc wyodrębnić niezbędne minimum.
  • Nie możesz mieć zależności w swoim skrypcie Lua. Tylko zwykła wanilia Lua. Musisz więc pozbyć się wszystkich stwierdzeń require.
  • Najtrudniejszą częścią jest implementacja HMAC.
  • Unikaj operacji we/wy w swoim skrypcie Lua, np. plik, baza danych, operacje sieciowe.

To nie jest łatwe przedsięwzięcie. Powodzenia! To jest coś, co warto udostępnić.