Benutzer-Authentifizierung über SSL-Zertifikate in Django

8

Ich schreibe eine Webapplikation für eine geschlossene Benutzergruppe. Es wird nur https geschaltet. Der Server sollte überprüfen, ob der Benutzer auf den Server zugreifen darf, indem er das SSL-Zertifikat des Benutzers überprüft. Ich würde es vorziehen, nur eine Whitelist (ex-Feld mit Benutzer cert in userprofile), als ihre Schlüssel von meiner CA signieren. Da es keinen Benutzer / Ausweis geben würde, hängt der Inhalt davon ab, welches Zertifikat vom Client bereitgestellt wurde.

Ich weiß, dass ich sie nur mit apache / nginx listen kann, aber ich mag diese Lösung nicht, weil ich diese Liste an zwei Stellen aufbewahren müsste: apache (access / deny) und django: auth middleware ( der Inhalt hängt davon ab, welches Zertifikat geliefert wurde). Das zu erhalten könnte ein Albtraum sein.

Gibt es noch eine andere schöne Möglichkeit? Vielleicht sollte ich Django das ssl-Ding nehmen lassen?

    
neutrinus 26.03.2012, 11:39
quelle

2 Antworten

10

Ich habe dafür ein Django-Modul erstellt, die unter MIT-Lizenz auf github zur Verfügung steht. Grundsätzlich ist der Ansatz so, dass:

  1. nginx behandelt alle SSL & amp; Zertifikatsverifikation Zeug
  2. Das Authentifizierungs-Backend von Django ordnet den definierten Namen des (validierten) Zertifikats einem beliebigen User -Modell zu, das Sie verwenden.
Kimvais 06.06.2013, 06:03
quelle
0

Zunächst einmal sprechen Sie über zwei völlig unterschiedliche Arten der Verwendung eines Zertifikats. Wenn Sie ein serversigniertes Zertifikat von einer Zertifizierungsstelle verwenden, authentifiziert sich der Benutzer vor dem Laden der Seite (beim Erstellen eines sicheren Kanals), und Sie wissen, wer sie sind. Die andere Art, die Sie erwähnen - Speichern des Benutzer-Cert in UserProfile - meinen Sie das private cert? Dies ist weit entfernt von einem sicheren Ansatz. Was genau erwarten Sie im Benutzerprofil, das Ihnen zur Authentifizierung dient? Und wenn Sie dieses Ding von UserProfile lesen, dann wie wird der Benutzer tatsächlich authentifizieren? Verwenden Sie Benutzername + Passwort? Was ist der Zweck des Zertifikats im Profil?

Ich würde das SSL-Ding in Django nicht machen. Ein besserer Ansatz, dies zu bewerkstelligen, besteht darin, alle SSL-Daten in Apache über einen HTTP-Header zu speichern. Sie stellen dem Benutzer ein Zertifikat aus, fügen es in seinen Browsern hinzu und wenn er eine Verbindung zur Site herstellt, überprüft Django das Zertifikat und extrahiert den mit der Anfrage verknüpften Benutzernamen. Übergeben Sie diesen Nutzernamen dann als HTTP-Header an die Django-App, z. HTTP_USER_NAME = ein_benutzer. Stellen Sie außerdem sicher, dass Apache alle solchen Header von der Anfrage des Clients streicht. Dann sollte deine Django-App nichts anderes mehr tun - es wird davon abhängen, dass Apache bereits den AUTH-Job ausgeführt hat und den Benutzernamen erhalten wird. (Dies funktioniert gut mit Nginx, und obwohl ich es nicht in Apache verwendet habe - ich sehe keinen Grund, dass es auch damit nicht möglich sein sollte, vielleicht brauchst du noch einen zusätzlichen Apache-Mod, um es zu installieren).

Der einzige Nachteil dieses Ansatzes besteht darin, dass Sie mit dem Signieren / Senden von Zertifikaten für den Benutzer wahrscheinlich einige manuelle Arbeiten erledigen müssen. Wenn dies jedoch keine häufig wiederkehrende Operation ist, scheinen die Sicherheitseinstellungen OK zu sein Angebote.

UPDATE : Hier sehen Sie ein Beispiel für die SSL-Authentifizierung in Apache: Ссылка und für nginx: Ссылка

    
Tisho 10.06.2012 08:39
quelle

Tags und Links