it-swarm.com.de

Halten Sie die geheimen Schlüssel fern

Eine der Ursachen des Anti-Musters local_settings.py besteht darin, dass das Ablegen von SECRET_KEY-, AWS -Schlüsseln in Einstellungsdateien zu Problemen führt:

  • Geheimnisse sollten oft genau das sein: Geheimnis! Wenn Sie sie in der Versionskontrolle behalten, bedeutet dies, dass jeder mit Repository-Zugriff darauf Zugriff hat.

Meine Frage ist, wie man alle Schlüssel geheim hält.

27
user2015666

Ich mache meine Django-Projekte mit Windows 7 und Powershell, daher war es für mich etwas anders, die Umgebungsvariable zu setzen. Sobald es eingestellt wurde, habe ich einfach Folgendes in meiner settings.py-Datei gemacht:

import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]

Um eine Umgebungsvariable in Windows mit PowerShell festzulegen, folgen Sie den Anweisungen in der folgenden Verknüpfung:

http://technet.Microsoft.com/de-de/library/ff730964.aspx

6
Aaron Lelevier

Speichern Sie Ihre local_settings.py-Daten in einer mit GPG verschlüsselten Datei - vorzugsweise als strikte key=value-Zeilen, die Sie parsen und einem Diktat zuweisen (der andere attraktive Ansatz wäre, es als ausführbares Python zu haben, aber ausführbarer Code in Konfigurationsdateien lässt mich zittern).

Es gibt ein Python-GPG-Modul, das ist also kein Problem. Holen Sie sich Ihre Schlüssel von Ihrem Schlüsselbund und verwenden Sie die GPG-Schlüsselbundverwaltungstools, damit Sie nicht mehr Ihr Schlüsselbundkennwort eingeben müssen. Stellen Sie sicher, dass Sie die Daten direkt aus der verschlüsselten Datei lesen und nicht nur eine entschlüsselte temporäre Datei erstellen, die Sie einlesen. Dies ist ein Rezept für einen Fehler.

Das ist nur eine Gliederung, Sie müssen es selbst bauen.

Auf diese Weise verbleiben die geheimen Daten ausschließlich im Speicherbereich des Prozesses und nicht in einer Datei oder in Umgebungsvariablen.

5
Spacedman

Idealerweise sollte local_settings.py nicht für den Produktions-/Bereitstellungsserver eingecheckt werden. Sie können die Sicherungskopie an einem anderen Ort aufbewahren, jedoch nicht in der Quellcodeverwaltung.

local_settings.py kann einfach mit der Entwicklungskonfiguration eingecheckt werden, so dass jeder Entwickler es ändern muss.

Löst das dein Problem?

4
Rohan

Die ursprüngliche Frage war, wie Geheimnisse in Umgebungsvariablen aufbewahrt werden können. Dies wird ausführlich in dem Buch Two Scoops of Django diskutiert. Nachfolgend finden Sie eine Zusammenfassung der Aussagen, gefolgt von einer Einschränkung bezüglich der Verwendung dieser Technik.

Ab Seite 48 (Abschnitt 5.3) der Ausgabe für 1.11:

Jedes von Django (und Python) unterstützte Betriebssystem enthält die einfache Möglichkeit, Umgebungsvariablen zu erstellen.

Hier sind die Vorteile der Verwendung von Umgebungsvariablen für geheime Schlüssel:

  • Wenn Sie die Geheimnisse von den Einstellungen fernhalten, können Sie jede Einstellungsdatei ohne zu zögern in der Versionskontrolle speichern. Der gesamte Python-Code sollte wirklich in der Versionskontrolle gespeichert werden, einschließlich Ihrer Einstellungen.
  • Anstatt, dass jeder Entwickler seine eigene kopierte und eingefügte Version von local_settings.py.example für die Entwicklung pflegt, teilt jeder die gleichen versiongesteuerten Einstellungen/local.py.
  • Systemadministratoren können das Projekt schnell bereitstellen, ohne dass Dateien geändert werden müssen, die Python-Code enthalten.
  • Die meisten Plattformen als Dienst empfehlen die Verwendung von Umgebungsvariablen für die Konfiguration und verfügen über integrierte Funktionen für die Einstellung und sie verwalten.

Auf der folgenden Seite wird das Buch fortgesetzt:

Bevor Sie mit dem Einstellen von Umgebungsvariablen beginnen, sollten Sie über die .__ verfügen. folgende:

  • Eine Möglichkeit, die geheimen Informationen zu verwalten, die Sie speichern möchten.
  • Ein gutes Verständnis für die Funktionsweise von Bash-Einstellungen auf Servern oder die Bereitschaft, Ihr Projekt von einem Plattform-als-Service-Server hosten zu lassen.

Sie beschreiben, wie die Umgebungsvariablen lokal und in der Produktion festgelegt werden (am Beispiel von Heroku - Sie müssen prüfen, ob Sie einen anderen Host verwenden. Dies ist nur eine Möglichkeit):

So setzen Sie Umgebungsvariablen lokal
export SOME_SECRET_KEY = 1c3-cr3am-15-yummy

So setzen Sie Umgebungsvariablen in der Produktion
heroku config: setze SOME_SECRET_KEY = 1c3-cr3am-15-yummy

Auf Seite 52 finden Sie schließlich Anweisungen zum Zugriff auf den Schlüssel. Zum Beispiel könnten Sie die ersten beiden Zeilen unten in Ihre Einstellungsdatei einfügen, um die standardmäßig dort enthaltene Rohschlüsselzeichenfolge zu ersetzen:

>>> import os
>>> os.environ['SOME_SECRET_KEY'] 
'1c3-cr3am-15-yummy'

Dieses Snippet ruft einfach den Wert der SOME_SECRET_KEY-Umgebung ab Variable vom Betriebssystem ab und speichert sie in einer Python-Variablen genannt SOME_SECRET_KEY.

Wenn Sie diesem Muster folgen, kann der gesamte Code in der Versionskontrolle verbleiben. und alle Geheimnisse bleiben sicher.

Beachten Sie, dass dies in einigen Fällen nicht funktioniert, beispielsweise wenn Sie einen Apache-Server verwenden. Wenn Sie mit Situationen umgehen möchten, in denen dieses Muster nicht funktioniert, sollten Sie Abschnitt 5.4 ihres Buchs lesen ("Wenn Sie keine Umgebungsvariablen verwenden können"). In diesem Fall empfehlen sie die Verwendung einer geheimen Datei.

Seit Ende 2017 ist diese Methode zum Speichern von Geheimnissen in den Umgebungsvariablen die empfohlene bewährte Methode in Two Scoops und im Designmuster der Zwölf-Faktor-App. Es wird auch bei den Django-Dokumenten empfohlen. Es gibt jedoch einige Sicherheitsrisiken: Wenn ein Entwickler oder ein Code Zugriff auf Ihr System hat, haben diese Zugriff auf Ihre Umgebungsvariablen und können diese versehentlich (oder werblich) öffentlich machen. Dieser Punkt wurde von Michael Reinsch hier gemacht:
http://movingfast.io/articles/umweltvariablen-considered-harmful/

3
Aaron Hall

Ich habe eine getcreds () - Funktion geschrieben, die den geheimen Schlüssel aus einer Datei abruft. Ich behalte die Datei an einem für www-Daten zugänglichen Ort. Wo auch immer ich Anmeldeinformationen in settings.py benötige, mache ich einfach den Aufruf von getcreds (), der den Dateinamen als Argument übergibt. Es gibt eine Liste aller Zeilen in der Datei und Bingo, in dem ich die verborgenen Geheimnisse habe. Hier ist der Code ...

from __future__ import unicode_literals, absolute_import
import os


def getcreds(fname, project, credsroot='/var/www/creds', credsdir=None):
    """ return a list of userid and password and perhaps other data """
    if credsdir is None:
        credsdir = os.path.join(credsroot, project)
    creds = list()
    fname = os.path.join(credsdir, fname).replace("\\", "/")
    with open(fname, 'r') as f:
        for line in f:
            # remove leading/trailing whitespace and append to list
            creds.append(line.strip())
    assert creds, "The list of credentials is empty"
    return creds
2
Mike Dewhirst

Hier ist eine Möglichkeit, die mit der Bereitstellung auf Heroku kompatibel ist:

  1. Erstellen Sie eine gitignored-Datei mit dem Namen .env, die Folgendes enthält:

    export Django_SECRET_KEY = 'replace-this-with-the-secret-key'

  2. Bearbeiten Sie dann settings.py, um den tatsächlichen SECRET_KEY zu entfernen, und fügen Sie stattdessen Folgendes hinzu:

    SECRET_KEY = os.environ['Django_SECRET_KEY']

  3. Wenn Sie dann den Entwicklungsserver lokal ausführen möchten, verwenden Sie Folgendes:

    source .env
    python manage.py runserver

  4. Wenn Sie sich endgültig in Heroku bereitgestellt haben, wechseln Sie zur Registerkarte Einstellungen Ihrer App und fügen Sie den Konfigurationsvariablen Django_SECRET_KEY hinzu.

0
krubo

Möglicherweise müssen Sie os.environ. get ("SOME_SECRET_KEY") verwenden.

0
lava-lava