Ich arbeite an einigen Apps in Rails, Django (und ein bisschen PHP), und eines der Dinge, die ich in einigen von ihnen angefangen habe, ist das Speichern von Datenbanken und anderen Passwörtern als Umgebungsvariablen anstelle von einfachem Text in bestimmten Konfigurationsdateien ( oder in settings.py für Django-Apps).
Als er dies mit einem meiner Mitarbeiter diskutierte, schlug er vor, dass dies eine schlechte Praxis sei - dass dies möglicherweise nicht so sicher ist, wie es auf den ersten Blick scheinen mag.
Ich würde gerne wissen, ob dies eine sichere Praxis ist. Ist es sicherer, Passwörter als einfachen Text in diesen Dateien zu speichern (stellen Sie natürlich sicher, dass diese Dateien nicht in öffentlichen Repos oder Ähnlichem verbleiben)?
Wie bereits erwähnt, bieten beide Methoden keine zusätzliche "Sicherheitsebene", sobald Ihr System gefährdet ist. Ich glaube, dass einer der stärksten Gründe für die Bevorzugung von Umgebungsvariablen die Versionskontrolle ist : Ich habe gesehen, dass viel zu viele Datenbankkonfigurationen usw. versehentlich im Versionskontrollsystem wie GIT gespeichert wurden, als dass jeder andere Entwickler sie sehen könnte (und whoops! Es ist passiert) ich auch ...).
Wenn Sie Ihre Passwörter nicht in Dateien speichern, können sie nicht im Versionskontrollsystem gespeichert werden.
quelle
Jedes Mal, wenn Sie ein Passwort speichern müssen, ist es unsicher. Zeitraum. Es gibt keine Möglichkeit, ein unverschlüsseltes Passwort sicher zu speichern. Welche Umgebungsvariablen im Vergleich zu Konfigurationsdateien "sicherer" sind, ist möglicherweise umstritten. IMHO, wenn Ihr System kompromittiert ist, spielt es keine Rolle, wo es gespeichert ist, ein fleißiger Hacker kann es aufspüren.
quelle
cat /proc/1/environ
zum Beispiel.ps axe
.strace -e open ps axe
zeigt, dass es diese Informationen von erhält/proc/[pid]/environ
, die die Durchsetzung von Berechtigungen haben (daher eine Reihe vonopen("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)
).ps
, das Ihnen gerne die Umgebung von so ziemlich allem zeigen würde).Es tut mir leid, dass ich nicht genug Repräsentanten hatte, um einen Kommentar abzugeben, aber ich wollte auch hinzufügen, dass Ihre Shell dieses Kennwort möglicherweise auch im Befehlsverlauf erfasst, wenn Sie nicht vorsichtig sind. So etwas wie
$ pwd=mypassword my_prog
manuell auszuführen ist also nicht so kurzlebig, wie Sie es sich erhofft haben.quelle
read -s MY_PASS_VAR
die sowohl vor Shell-History-Suchen als auch vor Schulter-Surfern schützt.HISTCONTROL
aufignorespace
oder gesetzt istignoreboth
, so dass sie technisch ein- und ausgeschaltet werden kann.Ich denke, wenn möglich, sollten Sie Ihre Anmeldeinformationen in einer gitignored Datei und nicht als Umgebungsvariablen speichern.
Wenn Sie Anmeldeinformationen in ENV-Variablen (Umgebungsvariablen) im Vergleich zu einer Datei speichern, sollten Sie berücksichtigen, dass ENV-Variablen sehr einfach von jeder von Ihnen verwendeten Bibliothek oder Abhängigkeit überprüft werden können.
Dies kann böswillig geschehen oder nicht. Zum Beispiel könnte ein Bibliotheksautor Stack-Traces und die ENV-Variablen zum Debuggen per E-Mail an sich selbst senden (keine bewährte Methode, aber möglich).
Wenn sich Ihre Anmeldeinformationen in einer Datei befinden, ist es viel schwieriger, sie abzurufen.
Denken Sie insbesondere an eine npm im Knoten. Für eine npm ist es eine einfache Sache, Ihre Anmeldeinformationen zu überprüfen, wenn sie in der ENV enthalten sind
process.ENV
. Wenn sie sich andererseits in einer Datei befinden, ist das viel mehr Arbeit.Ob Ihre Anmeldeinformationsdatei versioniert ist oder nicht, ist eine separate Frage. Nicht die Versionskontrolle Ihrer Anmeldeinformationsdatei setzt sie weniger Personen aus. Es ist nicht erforderlich, dass alle Entwickler die Produktionsdaten kennen. Da dies dem Prinzip der geringsten Privilegien entspricht, würde ich empfehlen, dass git Ihre Anmeldeinformationsdatei ignoriert.
quelle
Dies hängt von Ihrem Bedrohungsmodell ab.
Versuchen Sie zu verhindern, dass Ihre Benutzer Kennwörter über ihre Dateisysteme verteilen, in denen sie wahrscheinlich vergessen und misshandelt werden? Wenn ja, dann ja, da Umgebungsvariablen weniger persistent sind als Dateien.
Versuchen Sie, sich gegen etwas Bösartiges zu schützen, das direkt auf Ihr Programm abzielt? Wenn ja, dann nein, da Umgebungsvariablen nicht die gleiche Zugriffssteuerung haben wie Dateien.
Persönlich denke ich, dass fahrlässige Benutzer häufiger sind als motivierte Gegner, daher würde ich mich für den Ansatz der Umgebungsvariablen entscheiden.
quelle