Ist es sicher, kritische Passwörter in Server-Umgebungsvariablen zu speichern?

23

Ich habe einen Cluster von Servern, von denen jeder Konfigurationsdateien enthält, die derzeit Nur-Text-Kennwörter für vertrauliche, geschäftskritische Systeme (Nachrichtenwarteschlangen, Datenspeicher und andere Dienste) enthalten.

Einige Personen verschieben wichtige Kennwörter aus Konfigurationsdateien in eine Umgebungsvariable der Benutzerkonten, unter denen die Serverprozesse ausgeführt werden. Auf diese Weise können Konfigurationsdateien der Versionskontrolle übergeben werden, und der Systemadministrator muss nur beim Einrichten des Serversystems eine entsprechende Umgebungsvariable erstellen. Natürlich ist der Zugriff auf die Konten, auf denen diese Dienste ausgeführt werden, sehr eingeschränkt.

Ist dies wirklich der beste Weg, um Passwörter in Klartext-Konfigurationsdateien zu vermeiden, oder gibt es einen besseren Weg?

Steve HHH
quelle
3
Nun, denken Sie daran, wenn Sie es als Variable speichern, ist es sowohl im Ruhezustand als auch dann im Klartext, wenn ein Benutzer es abfragt. Das bedeutet, dass Sie dem Angreifer ein Kennwort gegeben haben, wenn Sie die Kontrolle über die Serverschicht ein wenig verlieren. Ich würde wahrscheinlich Krypto verwenden und die Kennwortinformationen nach Bedarf entschlüsseln.
Frank Thomas
Gute Gedanken, Frank. Wenn Sie Krypto verwenden würden, welches System würden Sie verwenden? Etwas basierend auf einem RSA / SSH-Schlüssel, einem Schlüsselbund-Tool oder etwas anderem? Derzeit verwenden wir Linux> 2.6-Systeme wie CentOS und Amazon.
Steve HHH

Antworten:

11

Wenn Sie auf einem Linux-System arbeiten, lesen Sie / proc / * / environ und entscheiden Sie, ob Umgebungsvariablen ein guter Ort zum Speichern vertraulicher Informationen sind oder nicht. / proc / self ist der aktuelle Prozess:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

Es ist egal, dass das, was die Umgebungsvariable setzt, wahrscheinlich eine Datei irgendwo liest.

Beachten Sie, dass ein Passwort bedeutet, dass das Passwort dem Programm zur Verfügung steht. Wenn dieses Kennwort nicht von einem Benutzer bereitgestellt wird, der es jedes Mal eingibt, wenn ein Programm es benötigt, muss auf dieses Kennwort nur basierend auf dem Programmzugriff zugegriffen werden können. Sie können das Kennwort lokal verschlüsseln und das Programm mit einem Schlüssel entschlüsseln lassen. Das Kennwort kann jedoch nur vor versehentlicher Offenlegung geschützt werden. Jemand, der den gleichen Zugriff wie das Programm hat, kann die gleichen Aktionen ausführen, die das Programm ausführen kann, einschließlich des Lesens des Verschlüsselungsschlüssels.

Der richtige Weg, dies zu tun, besteht darin, die Anwendung als eingeschränktes Konto auszuführen und das Kennwort in einer Datei zu speichern, die mit Berechtigungen auf Dateisystemebene geschützt ist. Hoffentlich können Sie eine Datei oder ähnliches "einbinden", um das Kennwort aus einem Versionskontrollsystem herauszuhalten (vorausgesetzt, das VCS verfügt über keine Sicherheitskontrollen). Verdecken Sie zum Schutz vor versehentlicher Offenlegung das Kennwort, wie Sie möchten - Base64 verschlüsselt es, verschlüsselt es mit pgp, was auch immer in den Optionen Ihres Serverprogramms Sinn macht. Wenn Sie dazu ein Programm schreiben, müssen Sie einen Benutzer nur dann zur Eingabe des Kennworts auffordern, wenn dies erforderlich ist, und das Kennwort aus dem Speicher löschen, sobald es verwendet wird.

dannysauer
quelle
3
Ja, auf eine Datei im Modus 0600 des Benutzers, der das Programm ausführt, können dieselben Personen zugreifen, die auf die Programmumgebung zugreifen können. Wie ich bereits erwähnt habe, wird die Umgebung wahrscheinlich durch Lesen einer Datei konfiguriert. Wenn Sie also Daten in die Umgebung kopieren, erhöht sich lediglich die Anzahl der Stellen, an denen Daten verfügbar sind. Die Umgebung wird standardmäßig auf untergeordnete Prozesse dupliziert. Und eine Reihe von Programmen verfügt über externe Mittel, um Umgebungsvariablen aufgrund von Fehlern oder beabsichtigten Entwurfsentscheidungen abzufragen (think phpinfo ()). Wenn eine Datei in irgendeiner Weise betroffen ist, warum sollte die Angriffsfläche vergrößert werden?
Dannysauer
1
Der tr-Befehl, den Sie gaben, hat bei mir nicht funktioniert - das hat funktioniert:cat /proc/self/environ | tr '\0' '\n'
robocat
Ich bin in meinem Telefon, daher ist es schwer zu sagen ... Das sollte eine Null sein. Hast du den Buchstaben "o" eingegeben?
Dannysauer
8

Wenn Sie Daten haben, die sowohl gelesen als auch geschrieben werden müssen , werden Sie letztendlich etwas mit einem Passwort schützen (oder wenn Sie wirklich paranoid sind, mit einer physischen Hardware-Smartcard und einer PIN), nein Egal, wie viele Verschlüsselungsebenen Sie haben.

Dies läuft auf die grundlegende Frage von Systemsicherheit vs. Bequemlichkeit hinaus. Sie können die Tiefenverteidigung verbessern, indem Sie über eine Vielzahl von Sicherheitskontrollen verfügen, die ein böswilliger Akteur durchbrechen müsste, um an die "Ware" zu gelangen. Wenn ein legitimer Akteur jedoch Daten lesen oder ändern möchte, Sie müssen durch einen Haufen Reifen gehen. Die Alternative sind Klartext-Passwörter in Textdateien.

Was würde ich tun, wenn ich einige Informationen in einem unternehmenskritischen System wirklich schützen möchte:

  1. Verwenden Sie die vollständige Festplattenverschlüsselung, damit der Inhalt des gesamten beständigen Speichers verschlüsselt wird.

  2. Beschränken Sie den physischen Zugriff auf die Computer. Verschließen Sie das Maschinengehäuse mit einem sicheren Verriegelungsmechanismus und kontrollieren Sie den physischen Zugang zu den Schlüsseln. Stellen Sie Muskeln (bewaffnete Wachen) als Torwächter für den Zugang ein.

  3. Erzwingen Sie eine differenzierte obligatorische Zugriffskontrolle (MAC) im Betriebssystem des Geräts. Sie können mit so etwas wie SELinux unter GNU / Linux beginnen und es auf Erzwingen setzen und dann die Richtlinie an die genauen Anforderungen der Produktionssoftware anpassen, indem Sie diesen Konten genau (und nur) die Berechtigungen gewähren, die sie für die benötigten Dateien benötigen.

  4. Wenn Sie systemspezifische Kennwörter und eine Versionskontrolle für Konfigurationsdateien benötigen, sollten Sie unbedingt den möglichen Fehler vermeiden, dass ein Klartextkennwort fälschlicherweise zur Versionskontrolle festgeschrieben wird, da es schwierig sein kann, ein durchgesickertes Kennwort von einem zu entfernen VCS-Cache. Umgebungsvariablen sind dafür eine von mehreren realisierbaren Optionen. Das andere ist eine Passwortabfrage, wenn das Programm gestartet wird. Ein Neustart der Maschine und das Wiederherstellen des Betriebszustands ist jedoch manuell und kann nicht autonom durchgeführt werden.

  5. Stellen Sie sicher, dass Sie über Netzwerkspezialisten verfügen, die sich um die Firewall-Berechtigungen kümmern, um das Risiko eines Angriffs über das Netzwerk zu minimieren. Prüfung (Penetrationstest sowie Whitebox-Test des Codes) jeder Software, die mit externen Systemen, insbesondere dem öffentlichen Internet, verbunden ist. "Schnittstellen" umfassen nicht nur direkte Netzwerkverbindungen, sondern auch das Lesen oder Schreiben von "nicht vertrauenswürdigen" Daten (Daten, deren Bytes von außerhalb des RAM / der Festplatte / der CPU des sicheren Servers stammen).

Dies ist keine vollständige Liste, aber insbesondere Punkt 4 ist wahrscheinlich für Sie relevant. Wenn Sie jedoch nicht mindestens die Schritte 1 bis 3 ausführen, wird die Berücksichtigung von Punkt 4 und Punkt 5 Ihnen nicht viel helfen, da Ihre System ist auf einer ziemlich grundlegenden Ebene nicht sicher.

allquixotic
quelle
Ich würde # 1 überspringen. Wenn das System ausgeführt wird, ist das Dateisystem bereitgestellt und unverschlüsselt. Wenn es nicht läuft, sollte Ihre physische Zugangskontrolle angemessen sein. Wenn der Computer neu gestartet werden muss, muss entweder jemand den Entschlüsselungsschlüssel bei jedem Start bereitstellen (was ärgerlich ist), oder der Computer muss dies bereitstellen. In diesem Fall stehen die Anmeldeinformationen normalerweise auch jedem zur Verfügung, der Zugriff auf die Festplatte hat . Die meisten "Server" -Maschinen verwenden aufgrund dieser Kompromisskosten normalerweise keine Festplattenverschlüsselung. :)
dannysauer
"Das läuft auf die grundlegende Frage von Systemsicherheit vs. Bequemlichkeit hinaus" - zitiert nach meiner Antwort - die auch für Ihren Kommentar gilt. Sie können nicht gleichzeitig die Sicherheit und den Komfort maximieren .
Allquixotic
1
# 1 ist wichtig für den Fall, dass ein Teil des RAMs auf die Festplatte trifft (Swap) oder wenn er auf einen SSD-Sektor trifft, der später "schlecht" wird und vom Betriebssystem entfernt wird, aber immer noch diesen Teil des RAM hält. Selbst wenn die Festplatte gerade entsperrt ist, wird dieser Datenblock auf den Platten verschlüsselt.
Akira
3

Das Übergeben eines Kennworts in einer Umgebungsvariablen ist so sicher, als würde das Programm es aus einer Datei lesen. Nur Prozesse, die als derselbe Benutzer ausgeführt werden, dürfen die Umgebung eines Prozesses lesen , und diese Prozesse dürfen sowieso die gleichen Dateien lesen.

Beachten Sie, dass dies nicht mit der Übergabe eines Kennworts in der Befehlszeile identisch ist. Befehlszeilenargumente können von allen Prozessen gelesen werden, die auf demselben Computer ausgeführt werden (Härtungsmaßnahmen vorbehalten), nicht nur von Prozessen, die als derselbe Benutzer ausgeführt werden.

Wenn Sie eine Variable durch die Umgebung übergeben, achten Sie darauf, dass das Programm andere Programme startet. Diese anderen Programme erben die Umgebung ihrer Eltern. Tun Sie dies also nicht, wenn Sie befürchten, dass die anderen Programme versehentlich den Inhalt ihrer Umgebung verlieren könnten.

Der Fehler in Ihrem Szenario besteht darin, dass Sie beim Einrichten des Serversystems eine geeignete Umgebungsvariable erstellen. Eine Umgebungsvariable ist eine dynamische Eigenschaft eines Prozesses. Sie können es beim Einrichten eines Systems nicht erstellen, nicht wenn Sie mit dem Einrichten etwas meinen, das einen Neustart überlebt. Was Sie meinen , ist vermutlich , dass der Administrator für diese Variable angeordnet , die in der Umgebung vorhanden sein , wenn ein bestimmter Benutzer anmeldet. Dies wird durch eine Konfigurationsdatei durchgeführt wird ( in der Regel ~/.pam_environmentoder ~/.profileoder eine Datei lesen aus ~/.profile). Diese Lösung verschiebt das Kennwort also nicht aus den Konfigurationsdateien.

Das Einrichten von Kennwörtern in der Anmeldeumgebung eines Benutzers ist keine gute Idee. Dies bedeutet, dass jeder Prozess, der als dieser Benutzer ausgeführt wird, das Geheimnis hat, sodass er überall für ein Leck anfällig ist.

Ein Kennwort sollte in eine Datei eingefügt werden, die sich von den Konfigurationsdateien, die der Versionskontrolle unterliegen, und von den normalen Bereitstellungsmechanismen unterscheidet. Es ist in Ordnung, das Kennwort irgendwann in die Umgebung einzugeben, wenn dies zweckmäßig ist, es sollte jedoch für eine möglichst kleine Anzahl von Programmen durchgeführt werden.

Gilles 'SO - hör auf böse zu sein'
quelle