Ich schreibe ein kleines Python-Skript, das regelmäßig Informationen von einem Drittanbieter-Dienst mithilfe einer Kombination aus Benutzername und Kennwort abruft. Ich muss nichts erstellen, das zu 100% kugelsicher ist (gibt es überhaupt 100%?), Aber ich möchte ein gutes Maß an Sicherheit einbeziehen, sodass es zumindest lange dauern würde, bis jemand es kaputt macht.
Dieses Skript hat keine grafische cron
Benutzeroberfläche und wird regelmäßig von ausgeführt. Daher funktioniert die Eingabe eines Kennworts bei jeder Ausführung zum Entschlüsseln nicht wirklich, und ich muss den Benutzernamen und das Kennwort entweder in einer verschlüsselten Datei oder verschlüsselt speichern in einer SQLite-Datenbank, was vorzuziehen wäre, da ich sowieso SQLite verwenden werde und möglicherweise das Kennwort irgendwann bearbeiten muss. Außerdem werde ich wahrscheinlich das gesamte Programm in eine EXE-Datei packen, da es derzeit ausschließlich für Windows ist.
Wie kann ich die Kombination aus Benutzername und Passwort sicher speichern, um sie regelmäßig über einen cron
Job zu verwenden?
quelle
Antworten:
Ich empfehle eine ähnliche Strategie wie ssh-agent . Wenn Sie ssh-agent nicht direkt verwenden können, können Sie so etwas implementieren, sodass Ihr Kennwort nur im RAM gespeichert wird. Der Cron-Job könnte Anmeldeinformationen konfiguriert haben, um das tatsächliche Kennwort bei jeder
del
Ausführung vom Agenten abzurufen, es einmal zu verwenden und es sofort mithilfe der Anweisung zu de-referenzieren .Der Administrator muss noch das Kennwort eingeben, um ssh-agent beim Booten oder was auch immer zu starten. Dies ist jedoch ein vernünftiger Kompromiss, der verhindert, dass ein Klartextkennwort irgendwo auf der Festplatte gespeichert wird.
quelle
Die Python-Schlüsselbundbibliothek ist in die
CryptProtectData
API unter Windows (zusammen mit den relevanten APIs unter Mac und Linux) integriert, die Daten mit den Anmeldeinformationen des Benutzers verschlüsselt.Einfache Verwendung:
Verwendung, wenn Sie den Benutzernamen auf dem Schlüsselbund speichern möchten:
Später, um Ihre Informationen vom Schlüsselbund zu erhalten
Elemente werden mit den Anmeldeinformationen des Betriebssystems des Benutzers verschlüsselt, sodass andere Anwendungen, die in Ihrem Benutzerkonto ausgeführt werden, auf das Kennwort zugreifen können.
Um diese Sicherheitsanfälligkeit ein wenig zu verschleiern, können Sie das Kennwort auf irgendeine Weise verschlüsseln / verschleiern, bevor Sie es auf dem Schlüsselbund speichern. Natürlich kann jeder, der auf Ihr Skript abzielt, nur auf die Quelle schauen und herausfinden, wie das Kennwort entschlüsselt / entschlüsselt werden kann, aber Sie würden zumindest verhindern, dass eine Anwendung alle Kennwörter im Tresor aufsaugt und auch Ihre abruft .
quelle
keyring
Abrufen Unterstützung sowohl den Benutzernamen und das Passwort?get_password
für den Benutzernamen. Obwohl, ich denke, Sie sollten die Antwort mit dem ursprünglichen vereinfachten Beispiel vonkeyring.set_password()
undkeyring.get_password()
keyring
ist nicht Teil der Python-StandardbibliothekNachdem ich die Antworten auf diese und verwandte Fragen durchgesehen habe, habe ich einen Code zusammengestellt, der einige der vorgeschlagenen Methoden zum Verschlüsseln und Verschleiern geheimer Daten verwendet. Dieser Code ist speziell für den Fall gedacht, dass das Skript ohne Benutzereingriff ausgeführt werden muss (wenn der Benutzer es manuell startet, ist es am besten, ihn in das Kennwort einzugeben und es nur im Speicher zu behalten, wie die Antwort auf diese Frage nahelegt). Diese Methode ist nicht besonders sicher. Grundsätzlich kann das Skript auf die geheimen Informationen zugreifen, sodass jeder, der über vollständigen Systemzugriff verfügt, über das Skript und die zugehörigen Dateien verfügt und auf diese zugreifen kann. Was dies bewirkt, verdeckt die Daten bei gelegentlicher Überprüfung und lässt die Datendateien selbst sicher, wenn sie einzeln oder zusammen ohne das Skript geprüft werden.
Meine Motivation dafür ist ein Projekt, bei dem einige meiner Bankkonten abgefragt werden, um Transaktionen zu überwachen. Ich muss es im Hintergrund ausführen, ohne dass ich alle ein oder zwei Minuten Passwörter erneut eingebe.
Fügen Sie diesen Code einfach oben in Ihr Skript ein, ändern Sie den saltSeed und verwenden Sie dann store () retrieve () und require () in Ihrem Code nach Bedarf:
Die Sicherheit dieser Methode würde erheblich verbessert, wenn für die geheimen Dateien OS-Berechtigungen festgelegt würden, damit nur das Skript sie lesen kann, und wenn das Skript selbst kompiliert und als nur ausführbar (nicht lesbar) markiert würde. Einiges davon könnte automatisiert werden, aber ich habe mich nicht darum gekümmert. Es würde wahrscheinlich erfordern, einen Benutzer für das Skript einzurichten und das Skript als diesen Benutzer auszuführen (und dem Benutzer den Besitz der Skriptdateien festzulegen).
Ich würde mich über Vorschläge, Kritik oder andere Schwachstellen freuen, die sich jeder vorstellen kann. Ich bin ziemlich neu im Schreiben von Kryptocode, daher könnte das, was ich getan habe, mit ziemlicher Sicherheit verbessert werden.
quelle
Es gibt einige Optionen zum Speichern von Kennwörtern und anderen Geheimnissen, die ein Python-Programm verwenden muss, insbesondere ein Programm, das im Hintergrund ausgeführt werden muss und den Benutzer nicht einfach zur Eingabe des Kennworts auffordern kann.
Zu vermeidende Probleme:
Option 1: SSH
Dies ist nicht immer eine Option, aber wahrscheinlich die beste. Ihr privater Schlüssel wird niemals über das Netzwerk übertragen. SSH führt lediglich mathematische Berechnungen durch, um zu beweisen, dass Sie den richtigen Schlüssel haben.
Damit es funktioniert, benötigen Sie Folgendes:
Option 2: Umgebungsvariablen
Dieser ist der einfachste, also könnte es ein guter Anfang sein. Es ist gut in der Twelve Factor App beschrieben . Die Grundidee ist, dass Ihr Quellcode nur das Kennwort oder andere Geheimnisse von Umgebungsvariablen abruft und Sie diese Umgebungsvariablen dann auf jedem System konfigurieren, auf dem Sie das Programm ausführen. Es kann auch eine nette Geste sein, wenn Sie Standardwerte verwenden, die für die meisten Entwickler funktionieren. Sie müssen das abwägen, um Ihre Software "standardmäßig sicher" zu machen.
Hier ist ein Beispiel, in dem Server, Benutzername und Kennwort aus Umgebungsvariablen abgerufen werden.
Suchen Sie nach Informationen zum Festlegen von Umgebungsvariablen in Ihrem Betriebssystem und erwägen Sie, den Dienst unter einem eigenen Konto auszuführen. Auf diese Weise haben Sie keine vertraulichen Daten in Umgebungsvariablen, wenn Sie Programme in Ihrem eigenen Konto ausführen. Achten Sie beim Einrichten dieser Umgebungsvariablen besonders darauf, dass andere Benutzer sie nicht lesen können. Überprüfen Sie beispielsweise die Dateiberechtigungen. Natürlich können alle Benutzer mit Root-Berechtigung sie lesen, aber das kann nicht geholfen werden.
Option 3: Konfigurationsdateien
Dies ist den Umgebungsvariablen sehr ähnlich, aber Sie lesen die Geheimnisse aus einer Textdatei. Ich finde die Umgebungsvariablen immer noch flexibler für Dinge wie Bereitstellungstools und Server für die kontinuierliche Integration. Wenn Sie sich für die Verwendung einer Konfigurationsdatei entscheiden, unterstützt Python verschiedene Formate in der Standardbibliothek, z. B. JSON , INI , netrc und XML . Sie können auch externe Pakete wie PyYAML und TOML finden . Ich persönlich finde JSON und YAML am einfachsten zu verwenden, und YAML erlaubt Kommentare.
Drei Dinge, die bei Konfigurationsdateien zu beachten sind:
~/.my_app
und eine Befehlszeilenoption, um einen anderen Speicherort zu verwenden.Option 4: Python-Modul
Einige Projekte stecken ihre Geheimnisse einfach direkt in ein Python-Modul.
Importieren Sie dann dieses Modul, um die Werte abzurufen.
Ein Projekt, das diese Technik verwendet, ist Django . Natürlich sollten Sie sich nicht
settings.py
auf die Quellcodeverwaltung festlegen, obwohl Sie möglicherweise eine Datei festlegen möchten,settings_template.py
die Benutzer kopieren und ändern können.Ich sehe einige Probleme mit dieser Technik:
.gitignore
wird dieses Risiko verringert.Wenn Ihr Projekt diese Technik bereits verwendet, ist der Übergang zu Umgebungsvariablen einfach. Verschieben Sie einfach alle Einstellungswerte in Umgebungsvariablen und ändern Sie das Python-Modul so, dass es aus diesen Umgebungsvariablen liest.
quelle
Es macht nicht viel Sinn, das Passwort zu verschlüsseln: Die Person, vor der Sie es verstecken möchten, verfügt über das Python-Skript, das den Code zum Entschlüsseln enthält. Der schnellste Weg, um das Kennwort zu erhalten, besteht darin, dem Python-Skript eine Druckanweisung hinzuzufügen, bevor es das Kennwort mit dem Dienst eines Drittanbieters verwendet.
Speichern Sie das Kennwort also als Zeichenfolge im Skript, und codieren Sie es von base64 so, dass das Lesen der Datei nicht ausreicht. Rufen Sie es dann einen Tag lang auf.
quelle
Ich denke, das Beste, was Sie tun können, ist, die Skriptdatei und das System, auf dem sie ausgeführt wird, zu schützen.
Grundsätzlich machen Sie Folgendes:
quelle
Betriebssysteme unterstützen häufig das Sichern von Daten für den Benutzer. Bei Fenstern sieht es so aus http://msdn.microsoft.com/en-us/library/aa380261.aspx
Sie können win32 apis von Python mit aufrufen http://vermeulen.ca/python-win32api.html
Soweit ich weiß, werden die Daten so gespeichert, dass nur über das Konto, auf dem sie gespeichert wurden, auf sie zugegriffen werden kann. Wenn Sie die Daten bearbeiten möchten, können Sie dazu Code schreiben, um den Wert zu extrahieren, zu ändern und zu speichern.
quelle
Ich habe Cryptography verwendet, weil ich Probleme beim Installieren (Kompilieren) anderer häufig genannter Bibliotheken auf meinem System hatte. (Win7 x64, Python 3.5)
Mein Skript wird in einem physisch sicheren System / Raum ausgeführt. Ich verschlüssele Anmeldeinformationen mit einem "Verschlüsselungsskript" in eine Konfigurationsdatei. Und dann entschlüsseln, wenn ich sie verwenden muss. "Encrypter script" befindet sich nicht auf dem realen System, sondern nur in einer verschlüsselten Konfigurationsdatei. Jemand, der den Code analysiert, kann die Verschlüsselung leicht durch Analysieren des Codes aufheben, aber Sie können ihn bei Bedarf trotzdem in eine EXE-Datei kompilieren.
quelle