För vissa tjänster är det av största vikt att säkra och logga åtkomst. För HTTPS-trafik kan man ofta klara sig med grundläggande HTTP-autentisering . Att hantera en sådan lösning kan bli lite komplicerat (t.ex. behöver man implementera konto- och hemlighetshantering), så man försöker hitta det näst bästa alternativet.
Förutom de galna moderna grejerna finns det en enkel och mycket effektiv lösning i form av TLS-klientcertifikat. Den är mycket effektiv, du kan säkra TCP- eller HTTP-tjänster, och användarhantering kan pushas ut ur din applikation (till exempel kan du använda XCA för att skapa din egen CA). Det hjälper också att TLS har inbyggda mekanismer för certifikatåterkallelse, så du är helt täckt av den ofta förbisedda funktionen.
frontend myapp
bind :443 ssl crt myapp.pem verify required ca-file ca.pem crl-file crl.pem
http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]
...HAProxy hanterar autentisering del, och kan även hjälpa till med tillstånd del, genom att vidarebefordra information från klientcertifikatet. Här skickar vi vidare Vanligt namn från certifikatet till backend-tjänsten (vanligtvis, för TLS-klientcertifikat, skulle det konceptuellt matcha användarnamn). På så sätt kan din applikation auktorisera användare korrekt, med användarinformation tillgänglig i HTTP-rubriker. Det blir inte enklare än så för HTTP-appar.
Det finns mycket mer information om TLS- klientautentisering med HAProxy i det tio år gamla inlägget från Baptiste .
Om du har sett vårt tidigare avsnitt om TLS- klientautentisering kanske du också vill använda samma trick för OAuth/JWT-tokens. Varför ska du skriva samma autentiseringskod om och om igen, för varje tjänst bakom load balancer (och ofta har du tjänster skrivna på olika språk, så att du inte får dela koden i backend). JWT och OAuth är lite för komplicerade för det här blogginläggsformatet, så jag visar bara de mest intressanta konfigurationsdelarna här. För fullständig installation, kolla in länkarna. HAProxy-installationen är intressant eftersom det mesta av JWT-grejerna faktiskt implementeras i Lua , som ett tilläggsskript för HAProxy.
global
...
lua-load /path/to/lua/script/dir/jwtverify.lua
# Replace the Auth0 URL with your own:
setenv OAUTH_ISSUER <https://youraccount.auth0.com/>
setenv OAUTH_AUDIENCE <https://api.example.com>
setenv OAUTH_PUBKEY_PATH /etc/haproxy/pem/pubkey.pem
frontend myapp
bind :443 ssl crt /path/to/cert/myapp.pem alpn h2,http1.1
http-request deny unless { req.hdr(authorization) -m found }
http-request lua.jwtverify
http-request deny unless { var(txn.authorized) -m bool }
...Jag måste också ge en paj till Envoy-folket här, de verkar ha implementerat mycket av den nödvändiga funktionaliteten för JWT direkt i Envoy.
TLS Calzone + Wrap Crispy -essän är en del av en serie "recept" som utforskar sätt att bygga pålitliga applikationer med (HA)Proxy.
PS. Om du har några frågor om någon av ovanstående tankar, dela dem gärna i kommentarsfältet.
Klicka här för att läsa Del 3.: Docker Cake + Say my name — Logga in och få svar på dina frågor