Wie melde ich mich sicher per Skript in der Datenbank an?

6

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.

user1766760
quelle
3
Dein Verständnis ist korrekt. Sie sollten Ihre Anmeldeinformationen niemals im Klartext eingeben. Ein Benutzer mit böswilliger Absicht kann sie aus einer kompilierten Binärdatei oder gar einem Klartext-Skript abrufen. Sie sollten überprüfen, ob Ihre Datenbankanwendung die Anmeldung ohne Kennwort mit privaten Schlüsseln zulässt.
Joseph R.
1
Es sieht so aus, als ob Oracle Wallet das ultimative Ende der Passwörter für die DB-Authentifizierung im Klartext bereitstellt (yay!).
msw

Antworten:

2

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").

Joseph R.
quelle
1

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 ein psä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.

Frostschutz
quelle
2
/proc/<pid>/environist 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.
Goldlöckchen
Hoppla, muss beim Testen die falsche PID gehabt haben. :) Danke für die Korrektur. Könnte aber an untergeordnete Prozesse weitergegeben werden ... die eine Datenbank wahrscheinlich nicht hat.
Frostschutz
@goldilocks Ich bin ein wenig verwirrt. Können Sie erläutern, warum die Verwendung einer env-Variablen sicherer sein kann? Wenn ich mehr über dieses Thema erfahren möchte, wie würde ich das ausdrücken (z. B. in einer Google-Suche)?
user1766760
@ user1766760: Ein Grund wäre, dass mit der Datei das Passwort irgendwo dauerhaft gespeichert wird (und ich vermute im Klartext!). Wenn jemand physischen Zugriff auf das System erhält (z. B. Ihren Laptop stiehlt), werden Sie durch Dateiberechtigungen nicht gerettet. Mit der env-Variablen wird sie nur bei Bedarf im Speicher abgelegt und ist "bereichsabhängig". Damit meine ich, dass sie nur für die Subshells sichtbar ist, für die sie bearbeitet wurde 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 ...
Goldilocks
Um welche Umgebungsvariable handelt es sich überhaupt? cmd $VARKommandozeile 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.
Frostschutz
1

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.

Ryan A. Chapman
quelle
0

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):

sqlplus /nolog<<!!

connect $USER/$PASSWD@$SID;

...
--some SQL
...

!!

Wenn Sie dies tun, pswird das Passwort in der Liste der Prozesse nicht angezeigt.

amphibient
quelle
Dies ist die gleiche Antwort, die Sie zu dieser Frage gegeben haben: stackoverflow.com/a/13478804/33204 . Ich würde sie also genauso charakterisieren wie @DavidAldridge bei diesem Stackoverflow Q und feststellen, dass dies kein guter Weg ist verstecken Sie Ihre Passwörter. Die meisten Unternehmen verbieten dies strikt.
SLM