nginx conditional reverse proxy

Asta e un post din categoria despre cat de jmecher e nginx.

Am avut relativ de curand o speta in care  aveam un setup de genul:

[aplicatie interna] <---> [reverse proxy] <---> [internet clients]

si trebuia s-o securizez cumva pentru ca [aplicatia interna] e o aplicatie care accepta niste cereri HTTP (si doar HTTP) si raspunde la ele. Nu stie autentificare, nimic. E doar un fel de API endpoint super dumb. Si, evident software comercial care asa vine el si e treaba ta ca si client sa-l securizezi cumva.

[internet clients] reprezinta un software scris in-house care sta pe niste servere undeva prin internet si care are nevoie sa faca query-uri in [aplicatie interna].

Cerinta a fost relativ simpla: sa accept query-uri doar de la [internet clients] si orice alte request-uri sa le ignor.

Prima ideea a fost aia enterprise si complicata: facem SSL mutual authentication pe nginx si doar clientii care au certificat client valid in contextul asta sunt acceptati. Da era mega complicat de mentinut, ca dupa aia trebuia sa fac si management de certificate, sa le schimb periodic etc.

Varianta simpla a fost sa fac passthrough doar la cererile care aveau un header cu o anumita valoare.

location / {
 if ($http_Secret_Header = 'secretheadervalue')
  { proxy_pass http://aplicatie.interna }
 return 301 https://google.com
}

De ce e nginx super jmecher? Pentru ca toate headerele dintr-un request HTTP le pune la dispozitie in variabile prefixate cu $http_ urmat de numele header-ului. Daca headerul are cratime in el, gen My-Header, atunci ele vor fi transformate in _ (underscore) si va deveni My_Header in contextul nginx.

nginx are activat doar HTTPS cand vorbeste cu clientii si in felul asta nu se poate intercepta ce se transmite intre clienti si aplicatie.

Si variabilele pot fi folosite in reguli de genul celei de mai sus, care trimite cererea mai departe doar daca Secret-Header are valoarea secretheadervalue. Daca nu, trimite clientii la google sa caute acolo stuff pe internet ca sigur au ajuns din greseala pe serverul meu :)

Cum ziceam, [internet clients] reprezinta o aplicatie in-house si a fost mai simplu sa adauge programatorii un header in plus decat sa implementeze SSL mutual authentication.

Leave a Reply

Your email address will not be published. Required fields are marked *