Erstens ist es , wie bereits von mehreren Personen erwähnt, unerlässlich, die Anmeldeinformationen vom Skript zu trennen. (Zusätzlich zur erhöhten Sicherheit bedeutet dies auch, dass Sie dasselbe Skript für mehrere Systeme mit unterschiedlichen Anmeldeinformationen wiederverwenden können.)
Zweitens sollten Sie nicht nur die Sicherheit der Anmeldeinformationen berücksichtigen, sondern auch die Auswirkungen, wenn diese Anmeldeinformationen kompromittiert werden. Sie sollten nicht nur ein Kennwort für den gesamten Zugriff auf die Datenbank haben, sondern unterschiedliche Anmeldeinformationen mit unterschiedlichen Zugriffsebenen. Sie könnten zum Beispiel einen DB-Benutzer haben, der die Möglichkeit hat, eine Suche in der Datenbank durchzuführen - dieser Benutzer sollte nur Lesezugriff haben. Ein anderer Benutzer hat möglicherweise die Berechtigung, neue Datensätze einzufügen, diese jedoch nicht zu löschen. Ein dritter kann berechtigt sein, Datensätze zu löschen.
Zusätzlich zur Einschränkung der Berechtigungen für jedes Konto sollten Sie auch die Verwendungsmöglichkeiten der einzelnen Konten einschränken. Beispielsweise darf das von Ihrem Webserver verwendete Konto keine Verbindung von einer anderen IP-Adresse als der des Webservers herstellen. Ein Konto mit vollständigen Root-Berechtigungen für die Datenbank sollte in der Tat in Bezug auf den Verbindungsaufbau stark eingeschränkt sein und nur interaktiv verwendet werden. Ziehen Sie auch in Betracht, gespeicherte Prozeduren in der Datenbank zu verwenden, um genau einzuschränken, was von jedem Konto ausgeführt werden kann.
Diese Einschränkungen müssen auf der DB-Server-Seite des Systems implementiert werden, damit die Einschränkungen auch bei einer Beeinträchtigung der Client-Seite nicht geändert werden können. (Und natürlich muss der DB-Server zusätzlich zur DB-Konfiguration mit Firewalls usw. geschützt werden ...)
Bei einem DB-Konto, das nur über eingeschränkten Lesezugriff und nur über eine bestimmte IP-Adresse verfügt, sind möglicherweise keine weiteren Anmeldeinformationen erforderlich, abhängig von der Vertraulichkeit der Daten und der Sicherheit des Hosts, auf dem das Skript ausgeführt wird läuft ab. Ein Beispiel kann ein Suchformular auf Ihrer Website sein, das mit einem Benutzer ausgeführt werden kann, der nur eine gespeicherte Prozedur verwenden darf, die nur die Informationen extrahiert, die auf der Webseite angezeigt werden. In diesem Fall bietet das Hinzufügen eines Kennworts keine zusätzliche Sicherheit, da diese Informationen bereits öffentlich sind und der Benutzer nicht auf andere Daten zugreifen kann, die vertraulicher sind.
Stellen Sie außerdem sicher, dass die Verbindung zur Datenbank über TLS hergestellt wird. Andernfalls kann jeder, der im Netzwerk empfangsbereit ist, Ihre Anmeldeinformationen abrufen.
Drittens überlegen Sie, welche Art von Anmeldeinformationen verwendet werden sollen. Passwörter sind nur eine Form und nicht die sicherste. Sie könnten stattdessen eine Form eines öffentlichen / privaten Schlüsselpaars oder AD / PAM oder dergleichen verwenden.
Viertens betrachten Sie die Bedingungen, unter denen das Skript ausgeführt wird:
Wenn es interaktiv ausgeführt wird, sollten Sie das Kennwort oder das Kennwort für den privaten Schlüssel oder den privaten Schlüssel eingeben oder mit einem gültigen Kerberos-Ticket angemeldet sein, wenn Sie es ausführen. Mit anderen Worten, das Skript sollte sein Kennwort erhalten Anmeldeinformationen direkt von Ihnen zum Zeitpunkt der Ausführung, anstatt sie aus einer Datei zu lesen.
Wenn es von einem Webserver ausgeführt wird, sollten Sie die Anmeldeinformationen zum Zeitpunkt des Starts des Webservers einrichten. Ein gutes Beispiel hierfür sind SSL-Zertifikate - sie haben ein öffentliches Zertifikat und einen privaten Schlüssel, und der private Schlüssel hat ein Passwort. Sie können den privaten Schlüssel auf dem Webserver speichern, müssen jedoch das Kennwort eingeben, wenn Sie Apache starten. Sie können auch die Anmeldeinformationen für eine bestimmte Hardware, z. B. eine physische Karte oder ein HSM, haben, die nach dem Start des Servers entfernt oder gesperrt werden können. (Der Nachteil dieser Methode ist natürlich, dass der Server nicht von selbst neu gestartet werden kann, wenn etwas passiert. Ich würde dies dem Risiko vorziehen, dass mein System kompromittiert wird, aber Ihre Laufleistung kann variieren ...)
Wenn das Skript von Cron ausgeführt wird, ist dies der schwierige Teil. Sie möchten nicht, dass die Anmeldeinformationen irgendwo auf Ihrem System herumliegen, wo jemand darauf zugreifen kann - aber Sie möchten, dass sie herumliegen, damit Ihr Skript darauf zugreifen kann, oder? Na ja, nicht ganz richtig. Überlegen Sie genau, was das Skript tut. Welche Berechtigungen benötigt es für die Datenbank? Kann es eingeschränkt werden, damit es egal ist, ob die falsche Person eine Verbindung zu diesen Berechtigungen herstellt? Können Sie das Skript stattdessen direkt auf dem DB-Server ausführen, auf den kein anderer Zugriff hat, anstatt von dem Server, der andere Benutzer hat? Wenn aus irgendeinem Grund , dass ich nicht denken kann, absolut Sie müssen das Skript läuft auf einem unsicheren Server haben , und es muss in der Lage sein, etwas Gefährliches / Zerstörerisches zu tun ... Jetzt ist ein guter Zeitpunkt, Ihre Architektur zu überdenken.
Fünftens sollten Sie, wenn Sie die Sicherheit Ihrer Datenbank schätzen, diese Skripts nicht auf Servern ausführen, auf die andere Personen Zugriff haben. Wenn jemand auf dem System angemeldet, dann sie werden die Möglichkeit an , Ihre Anmeldeinformationen erhalten haben. Beispielsweise besteht bei einem Webserver mit einem SSL-Zertifikat zumindest eine theoretische Möglichkeit, dass sich jemand als Root anmelden und auf den Speicherbereich des httpd-Prozesses zugreifen und die Anmeldeinformationen extrahieren kann. In letzter Zeit gab es mindestens einen Exploit, bei dem dies über SSL möglich war, ohne dass der Angreifer angemeldet sein musste.
Erwägen Sie auch die Verwendung von SELinux oder Apparmor oder was auch immer für Ihr System verfügbar ist, um einzuschränken, welche Benutzer was tun können. Sie ermöglichen es Ihnen, Benutzern nicht einmal zu erlauben, eine Verbindung zur Datenbank herzustellen, selbst wenn sie Zugriff auf die Anmeldeinformationen erhalten.
Wenn Ihnen das alles übertrieben vorkommt und Sie es sich nicht leisten können oder keine Zeit dafür haben - dann sollten Sie meiner (arroganten und elitären) Meinung nach nichts Wichtiges oder Sensibles in Ihrer Datenbank speichern. Und wenn Sie nichts Wichtiges oder Sensibles speichern, ist es auch nicht wichtig, wo Sie Ihre Anmeldeinformationen speichern - in welchem Fall sollten Sie überhaupt ein Passwort verwenden?
Schließlich , wenn Sie absolut nicht irgendeine Art von Anmeldeinformationen vermeiden speichern, können Sie die Anmeldeinformationen schreibgeschützt und von Wurzel und Stamm im Besitz Eigentum auf einen sehr vorübergehend gewähren könnte , wenn dies durch ein Skript dazu aufgefordert wird (weil Ihr Skript sollte nicht sein Als root ausführen, es sei denn, dies ist unbedingt erforderlich, und eine Verbindung zu einer Datenbank ist nicht erforderlich. Aber es ist immer noch keine gute Idee.