Ich frage mich, ob es akzeptabel ist (sicherheitstechnisch), Anmeldeinformationen für die Datenbank (Benutzer / Pass) in einer Umgebungsvariablen festzulegen oder als Befehlszeilenparameter zu übergeben.
Beide Methoden scheinen mir riskant zu sein, da andere möglicherweise die Umgebungsvariable lesen oder die laufenden Prozesse / den Verlauf lesen können und die Anmeldeinformationen im Klartext vorliegen (Ist mein Verständnis hier korrekt?).
Was wäre ein akzeptabler Weg, um sich anzumelden? Es würde in einem Skript als Teil eines automatisierten Jobs / Prozesses ausgeführt.
Bearbeiten: Dies ist eine Oracle-Datenbank (11g)
Bearbeiten # 2: Oracle Wallet wurde an einem Punkt in Betracht gezogen, kann aber noch nicht verwendet werden, wo ich arbeite.
Antworten:
Ich habe keine wirkliche Erfahrung mit Oracle-Datenbanken (oder Datenbanken für diese Angelegenheit), aber es scheint, dass eine Perl-Lösung mit Oracle Wallet wie hier gezeigt möglich ist (Google-Suchbegriffe "Oracle Database Passwordless Login").
quelle
Befehlszeilenparameter können von jedem über gelesen werden
/proc/<pid>/cmdline
. Bei Prozessen, die sofort beendet werden, können sie weiterhin jemandem angezeigt werden, der einps
ähnliches Überwachungsprogramm verwendet.Passwörter im Speicher sollten dagegen nicht das Problem sein. Auf den Speicher kann nicht ohne Superuser-Rechte zugegriffen werden, und eine sichere Software überschreibt normalerweise Kennwörter im Speicher, bevor sie für andere Prozesse freigegeben wird.
Am häufigsten werden Dateiberechtigungen verwendet. Das Passwort geht in eine Datei, die nur von dem gelesen werden kann, der dazu in der Lage sein soll. Somit sind die Anmeldeinformationen als Datei (sei es ein Schlüssel oder ein Passwort) vor den üblichen Cmdline-Lecks geschützt.
quelle
/proc/<pid>/environ
ist auf 400 gesetzt (schreibgeschützt vom Eigentümer). Ich bezweifle, dass es ein legitimes Mittel gibt, um die Umgebungsvariablen eines anderen direkt zu lesen, sodass diese Methode wahrscheinlich sicherer ist als das Speichern in einer Datei.export
. Wenn Sie Dinge wie das von der Kommandozeile gesetzt werden, halten nicht eine permanente.bash_history
, oder aber Ihr Passwort wird im Klartext in einer Datei am Ende ...cmd $VAR
Kommandozeile ist wieder, das ist also nutzlos. Es müsste vom betreffenden Kunden unterstützt werden. Zumindest laut dev.mysql.com/doc/refman/5.0/de/password-security-user.html gelten Umgebungsvariablen auch nicht als sicher.Best Practices schreiben vor, dass Sie Kennwörter nicht im Klartext auf der Festplatte oder im Speicher speichern sollten. Umgebungsvariablen sind ebenfalls problematisch. Stellen Sie sich vor, auf einem Produktionssystem wird ein Überwachungsprogramm ausgeführt, das regelmäßig "ps auxwwe" ausführt und die Ausgabe in eine Protokolldatei schreibt. Ihre sqlplus-Anmeldeinformationen werden versehentlich in die Monitorprotokolle geschrieben, die möglicherweise weltweit lesbar sind. Das häufigere Szenario ist, dass die Protokolle an Splunk / ElasticSearch / Hadoop / Loggly gesendet werden.
Ich habe ein Programm geschrieben, das Anmeldeinformationen sicher über Dateistreams überträgt: https://github.com/ryanchapman/safe_sqlplus
Nachdem die Anmeldeinformationen an das sqlplus-Programm gesendet wurden, setzt safe_sqlplus den Teil des Speichers auf Null, in dem sie gespeichert wurden.
quelle
Sie müssen die Befehlszeile, die Ihren DB-Client öffnet, und die passwd-Übermittlung trennen. Natürlich funktionieren verschiedene RDBMSs / Clients unterschiedlich. Hier ist ein Beispiel für
sqlplus
(Standard-ORCL-Befehlszeilenprogramm):Wenn Sie dies tun,
ps
wird das Passwort in der Liste der Prozesse nicht angezeigt.quelle