Das Übergeben von Geheimnissen (Kennwörtern) an ein Programm über eine Umgebungsvariable wird laut MySQL-Dokumenten als "äußerst unsicher" und als schlechte Wahl (unter Sicherheitsaspekten) für andere Ressourcen angesehen .
Ich würde gerne wissen warum - was fehlt mir? Im erwähnten MySQL-Handbuch (ich verwende dies als Beispiel) wird die Übergabe des Kennworts über die -p
Option in der Befehlszeile als " unsicher " und über env var als " extrem unsichere ", fett kursive Schrift betrachtet.
Ich bin kein Experte, aber ich kenne die Grundlagen: Ein einfacher ps
Befehl, der sogar von einem nicht privilegierten Benutzer ausgegeben wird, liest jedes Programm zusammen mit den Befehlsparametern, während nur derselbe Benutzer (und natürlich root) die Umgebung des Prozesses lesen darf. Also, nur root
und johndoe
darf die Umgebung des johndoe
gestarteten Prozesses lesen , während gehacktes www-data
Skript alles über liest ps
.
Es muss hier eine große Sache geben, die ich vermisse - also erklären Sie mir bitte, was ich vermisse.
Mein Ziel ist es, das Geheimnis von einem Programm auf ein anderes zu übertragen, im Allgemeinen nicht interaktiv.
quelle
mysql -ps3cret
Ihr Kennwort im Klartext in Ihre Shell-Verlaufsdatei eingefügt. Die Verwendung eines Skripts oder eines anderen Mittels zum Einfügen Ihres Kennworts in eine Umgebungsvariable bedeutet, dass sich das Kennwort (oder das Mittel zum Offenlegen des Kennworts) in diesem Skript befindet. Wenn Sie dies tunexport mysqlpasswd=s3cret
, wird Ihr Kennwort einfach wieder im Klartext zu Ihrem Shell-Verlauf hinzugefügt.ps
.export
in einem Skript und Ihr Passwort befindet sich jetzt im Klartext auf der Festplatte, was ebenfalls eine sehr schlechte Wahl ist.Antworten:
Ausgearbeitet hier ( via ):
[End-of-Lifed: 2009. Weiß jemand etwas über neuere AIX?]
...
[Erscheinungsjahr: 2012]
quelle
ps ewwwax
. Ich weiß nicht, wann sich das geändert hat. Zusätzliche Informationen: AIX 5.3 wurde am 30. April 2012 nicht mehr unterstütztDieser Rat in der MySQL-Dokumentation ist schlecht formuliert.
Das Übergeben eines Kennworts in einer Umgebungsvariablen ist nicht weniger sicher als das Übergeben über die Befehlszeile. Die meisten modernen Unices stellen Befehlszeilenargumente von Prozessen, jedoch nicht deren Umgebung, allen Benutzern über den
ps
Befehl und andere ähnliche Software zur Verfügung. Es gibt Ausnahmen, aber ich habe noch nie von einem System gehört, bei dem das Gegenteil der Fall ist (Offenlegung der Umgebung ohne Offenlegung der Argumente).Das Einfügen eines Kennworts in einen Befehl, der in eine interaktive Shell eingegeben wird, ist eine schlechte Idee, da das Kennwort im Shell-Verlauf endet. Es ist in Ordnung, wenn der Shell-Verlauf deaktiviert ist, aber Sie müssen daran denken, dies zu tun. Dies gilt unabhängig davon, ob das Kennwort als Argument oder in der Umgebung übergeben wird.
Was bei Umgebungsvariablen gefährlicher sein kann, ist, wenn die Variable an andere Prozesse übergeben wird. Das Festlegen eines Datenbankkennworts in
.profile
wäre beispielsweise eine sehr schlechte Idee, da es für alle Programme sichtbar wäre. Ebenso wäre es eine schlechte Idee , ein Skriptexport MYSQL_PWD=…
in der Nähe der Spitze auszuführen, das viele Befehle darüber hinausmysql
ausführt. Wenn die Umgebungsvariable jedoch nur anmysql
Befehle übergeben wird, ist daran nichts auszusetzen.In der MySQL-Dokumentation sollte keine Sprache verwendet werden, die die Übergabe eines Kennworts über eine Umgebungsvariable als weniger sicher bewertet als die Übergabe über ein Befehlszeilenargument. Es ist umgekehrt. (Es sei denn, die Umgebung ist auf mehr als den
mysql
Befehl eingestellt, dies ist jedoch nicht das in der Dokumentation beschriebene Szenario.)quelle
Das Hauptproblem beim Übergeben von Geheimnissen in Umgebungsvariablen besteht darin, diese Umgebung ordnungsgemäß auf den Prozess zu übertragen, der dieses Geheimnis verwendet, und es nicht an Prozesse weiterzugeben, die es nicht haben sollten.
Es ist sicher, eine Umgebungsvariable nur zum Starten eines bestimmten Prozesses festzulegen, der sie verwendet.
Aber es ist nicht global in der Shell in Umwelt Satz Geheimnisse zu sichern (für die aktuelle Sitzung) (und noch schlimmer in den globalen Startdateien der Schale (
.bash_profile
,.bashrc
,.profile
)) , weil alle Verfahren von dieser Shell gestartet werden , dieses Geheimnis haben in ihrem Umgebung. Einige verlieren sie möglicherweise absichtlich (Malware) oder nicht (denken Sie an den Shell-Befehlsverlauf oder an ein Absturzberichtsmodul, das den gesamten Inhalt der Umgebung in einer Protokolldatei oder auf einem Remote-Server speichert).Aus Sicht des Anwendungsentwicklers ist es leider unmöglich zu erzwingen, dass Benutzer Ihrer Anwendung die Umgebung ordnungsgemäß erfassen. Ich habe persönlich so viele Geheimnisse gesehen, die darin gespeichert sind
~/.profile
.Um eine schlechte Nutzung der Umgebung durch Benutzer zu vermeiden, ist es sicherer, keine Geheimnisse direkt in die Umgebung zu laden (um die Auswirkungen eines Lecks zu verringern) und stattdessen Umgebungsvariablen zu verwenden, um Links an den Ort zu übergeben, an dem das Geheimnis wirklich gespeichert ist: Verwenden Sie eine zusätzliche Indirektionsebene.
quelle