2016-04-28 3 views
1

Wir versuchen, einen einfachen Authentifizierungsmechanismus mit NGINX als Proxy-Server und auth_request zu implementieren, um einige statische Dateien zu schützen.Wie kann ich die Session-Cookie-Einstellung behandeln, um sie dann mit NGINX auth_request zu verwenden?

  • Die statischen Dokumente sind in docs.mydomain.com
  • Die API, um eine Session-Token mit einer E-Mail/Passwort zu erzeugen, ist in login.otherdomain.com (Es wird eine JSON mit der Rückkehr E-Mail und Session-Token)

Der aktuelle Prozess sieht wie folgt zu authentifizieren:

  1. Wenn Benutzer versuchen, auf docs.mydomain.com zuzugreifen, wird ihnen ein Anmeldeformular angezeigt. Dort geben sie ihre Anmeldeinformationen ein, die E-Mail/passwd wird dann über AJAX gesendet und die API wird uns ein Sitzungstoken geben, und wir speichern es in einem Cookie, etwas Ähnliches (bemerkte auch, dass ich in login.otherdomain.com habe aktivierte Authentifizierung).

    $("form").submit(function(event) { 
        $.ajax({ 
        async: false, 
        url: "http://login.otherdomain.com/api/user_sessions", 
        method: "POST", 
        data: { 
          user_sessions: 
          { 
          email: $("#email").val(), 
          password: $("#password").val(), 
          } 
          }, 
        success: function(resp_hash) { 
          $("form").reset() // Clearing form so email/pwd is not sent in POST request 
          document.cookie = "x_api_session_id="+resp_hash.user_sessions.id; 
         } 
        }); 
    }); 
    
  2. Dann wird das Formular tatsächlich (mit GET) gesendet werden, und Sie können die gelöschten Felder in der Anfrage (E-Mail & Passwort) sehen, die ein bisschen hässlich aussieht. Die Anforderung wird an docs.mydomain.com/docs gesendet, die das Sitzungstoken anhand von login.otherdomain.com überprüft und überprüft, ob es noch gültig ist, und zwar unter Verwendung von nginx auth_request (https://developers.shopware.com/blog/2015/03/02/sso-with-nginx-authrequest-module/). Etwas wie folgt aus:

    location /docs { 
        auth_request /auth; 
    } 
    
    location = /auth { 
        internal; 
        proxy_pass $auth_api; 
        proxy_pass_request_body off; 
        proxy_set_header Content-Length ""; 
        proxy_set_header X-Original-URI $request_uri; 
        proxy_set_header X-Api-Session-Id $cookie_x_api_session_id; 
    } 
    

Und dann werden die Dokumente angezeigt. Wir müssen noch eine saubere Handhabung der Fehlermeldungen implementieren, aber das funktioniert zunächst. Dennoch fühlt es sich hässlich an (besonders die AJAX-Anfrage, um den Session-Token zu bekommen) und ich denke, dass es einen besseren Weg geben sollte, dies zu tun. Irgendwelche Ideen, wie könnte das verbessert werden? Gibt es sicherheitsrelevante Auswirkungen auf die Art und Weise, wie wir dies umsetzen wollen?

Antwort

0

Ich hatte vor ein paar Tagen die gleichen Anforderungen für den Zugriff auf private Dienste in einem Cluster und ich komme mit einer ähnlichen Lösung. Ich implementierte eine einfache mit einer AJAX-Anfrage auf Client-Seite zu authentifizieren und das Session-Token zu bekommen.

In Bezug auf die Sicherheit, soweit die Anfrage über HTTPS geht, sollte alles in Ordnung sein. Was mich jedoch beunruhigte, war das schwache Authentifizierungssystem selbst, es war eine einfache LDAP-Bindeoperation ... Ich entschied mich, eine Zwei-Faktor-Authentifizierung mit TOTP einzurichten, und es löste einen großen Teil meiner Bedenken. Es ist sicher genug für mich, um eine Mehrheit der Angriffe zu vermeiden, oder zumindest bis Quantencomputer auftauchen!

Ich hoffe, es hat geholfen!

Verwandte Themen