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?
quelle
Antworten:
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:
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.
quelle
cat /proc/self/environ | tr '\0' '\n'
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:
Verwenden Sie die vollständige Festplattenverschlüsselung, damit der Inhalt des gesamten beständigen Speichers verschlüsselt wird.
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.
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.
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.
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.
quelle
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_environment
oder~/.profile
oder 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.
quelle