Reverse proxy mit OTP

WernerH

Member
Hallo zusammen,

nachdem ich nun schon fast den ganzen Tag und die halbe gestrige Nacht gegoogelt und verschieden Dinge mit Apache und Nginx ausprobiert habe, aber nichts so funktioniert, wie ich es mir eigentlich wünsche, hab' ich gedacht ich frag mal hier nach ob von euch vielleicht einer Idee oder noch besser, auch ein paar Links dazu hat.

Also, worum gehts?

Nun, ich monitore meine Server mit Icinga2 und es geht um den Zugriff auf IcingaWeb2 übers Internet. IcingaWeb2 ist nur User/Pw geschützt, ich würde aber gerne 2FA dafür implementieren. Bei den Icinga2 Developern gab's dazu letztes Jahr im April schon eine Diskussion, aber eine Einigung oder Anpassung des Webinterfaces kann ich bisher nicht erkennen.

Also hab' ich mir gedacht, ich schalte einen Reverse Proxy dazwischen. Im Moment ist das bei mir ein Apache, ich kann aber auch auf nginx wechseln, wenn das, was ich möchte, damit einfacher geht.

Ich möchte, dass sich der Benutzer, wenn er über den Reverse Proxy auf IncingaWeb2 zugreift, zunächst mit dem Token aus der Google Authenticator App am Reverse Proxy authentifizieren muss und dann zum IcingaWeb2-Server weitergeleitet wird. Was ich gefunden habe sind nur Lösungen, die zunächst im Proxy User/Pw abfragen, dann den Code der Google Authenticator App abfrageb und danach die Weiterleitung an den IcingaWeb2-Server ausführen. Dort muss ich mich dann aber nochmal mit User/Pw anmelden und das ist mir einmal zu viel.

Ich suche als eine Lösung für einen Reverse Proxy, der (ohne vorherige Abfrage von User/Pw) direkt meinen Token aus der Google Authenticator App abfragt und mich danach sofort weiterleitet.

Habt Ihr vielleicht 'ne Idee, wie ich das hinbekomme oder ob es dafür bereits irgendwelche Lösungen gibt?

Grüße

Werner
 

d4f

Kaffee? Wo?
Die drei Lösungen die mir spontan einfallen wären:

a) Cloud-Lösung mit niedrigem Aufwand
Anbieter wie Cloudflare bieten neben klassischem CDN/Intrusion-protection auch Access-Control an. Bei Cloudflare heisst das Teams und kann je nach Anforderungen bis 50 User kostenfrei benutzt werden.

b) Auth-Request Server
Nginx kann über eine externe URL Anfragen validieren.
Möglich wären zb:

- OAuth:
Dein Login kann entweder über OAuth-Login der Applikation oder durch den Nginx Reverse-Proxy abgesichert werden
Beispiel: https://developer.okta.com/blog/2018/08/28/nginx-auth-request

- Radius Provider

- Direkte TOTP-Implementierung (Beispiel)
 

marce

Well-Known Member
nur für einen Service evtl. ein wenig oversized - aber ein Blick Richtung API-Gateways könnte da auch passen:
z.B. https://docs.gravitee.io/apim/3.x/apim_policies_oauth2.html

Wenn's nur um's Absichern von Icinga geht und nur um eine minimale Anzahl User würde ich aber eher auf ein Client-SSL-Zert. setzen als da das große Fass aufzumachen, vor allem wenn es von Icinga nicht direkt supported wird...
 

WernerH

Member
Hallo zusammen,

zunächst einmal vielen Dank an @d4f und @marce für eure beiden Antworten - damit habt ihr mir schon mal ein gutes Stück weiter geholfen!

Nachdem ich es möglichst einfach halten möchte werde ich es zunächt einmal mit der von @d4f unter b) - Direkte TOTP-Implementierung (Beispiel) skizzierten Lösung versuchen. Ich denke, das ist genau das was ich suche bzw. haben möchte.

Bevor ich meine Frage hier im Forum gestellt habe, hatte ich mir auch schon überlegt, einen oauth2-proxy aufzusetzen und den die Authentifizierung machen zu lassen. Das Problem ist nur, dass ich nichts an Doku dazu gefunden haben, wie ich den oauth2-proxy zur Zusammenarbeit mit dem Token aus der Google Authenticator App (also OTP) überreden kann bzw. ob das im oauth2-proxy überhaupt implementiert ist. Grundsätzlich findet man schon einiges an Doku für die Zusammenarbeit mit dem Google Authenticator, aber die geht davon das, dass man (s)einen Google-Account für die Authentifizierung verwenden möchte und genau das möchte ich ja eben nicht. Ein Beispiel dazu findet sich z.B. hier.

Für den Webindianer gibt's auch eine Authentifizierung mit OTP, aber erst nach der Authentifizierung mit User/Pw. Beispiele dazu gibt's hier und hier. Aber das ist ja genau das, was ich eben nicht möchte!

Also, ich probier das o.g. Beispiel jetzt mal aus und wenn's nicht funktionieren sollte rühr ich mich nochmal.
 
Top