DB-Passwörter sichern

18

Wenn man sich die Struktur der meisten PHP / MySQL-basierten Websites ansieht, die ich gesehen habe, scheint es nicht besonders schwierig zu sein, das Datenbankkennwort zu erkennen, wenn Sie ein wenig suchen, da es immer eine Setup- oder Konfigurationsdatei gibt, in der die Informationen für die Protokollierung gespeichert sind in die DB. Abgesehen von der grundlegenden Vorsichtsmaßnahme, dass sichergestellt wird, dass die Berechtigungen meiner Datenbank für Remoteanforderungen angemessen eingeschränkt sind, welche Optionen stehen zur Verfügung, die ich in meinen eigenen Projekten implementieren kann, um diese Informationen zu schützen?

Kaji
quelle
1
Zur Verdeutlichung: Sie möchten die Anmeldeinformationen speichern, um sich von der Website aus bei der Datenbank anzumelden, und nicht, wie Kennwörter für die Benutzer der Website ordnungsgemäß in der Datenbank gespeichert werden sollen.
Joe
Richtig; Das ist es, worauf ich hinaus will.
Kaji

Antworten:

10

Keine direkte Antwort auf die Speicherung der Passwörter, aber ich verwende im Allgemeinen mindestens zwei Datenbankverbindungen beim Erstellen von Webapps - eine verwendet 99% der Zeit für benutzerbezogene Aktivitäten mit eingeschränkten Berechtigungen und die andere für die "Administrator" -Funktionalität (Benutzer löschen usw.).

In einigen Fällen, in denen ich das Paket einer anderen Person installiere, installiere ich zwei Instanzen ... eine öffentlich zugängliche Instanz, die nur über Datenbankzugriff für allgemeine Benutzertypen verfügt, und eine zweite Instanz, die auf IP-Adressen beschränkt ist Mein lokales Subnetz (möglicherweise sogar auf einem anderen Computer), das für Aktivitäten vom Typ "Administrator" verwendet werden muss. Keiner von beiden hat Zugriff auf das Ändern von Tabellen usw. Ich möchte lieber die nativen Datenbanktools verwenden, als der Webanwendung zu gestatten, ihre eigenen Aktualisierungsaufgaben auszuführen, die noch nicht überprüft wurden.

Sie können jedoch noch einen Schritt weiter gehen und speziell für bestimmte Aufgaben weitere Verbindungen hinzufügen. Die Aufgaben zur Benutzererstellung und Kennwortverwaltung werden also von einem Benutzer ausgeführt, der über zusätzliche Berechtigungen für die Benutzertabellen verfügt. Die Anmeldung verfügt über Datenbankberechtigungen zur Authentifizierung und nicht über viel mehr , etc.

Auf diese Weise kann bei einer SQL-Injection-Attacke auf den meisten Webseiten nicht wirklich etwas Bedeutendes getan werden - die Passwort-Hashes können nicht angezeigt werden, es kann kein neuer Administrator hinzugefügt werden (nicht, dass er dazu in der Lage wäre) Trotzdem hilft es nicht, wenn sie es schaffen, eine Shell auf Ihren Computer zu bekommen, aber es verlangsamt sie.

Joe
quelle
1
Wir machen etwas Ähnliches. Im Allgemeinen erstellen wir jedoch ein neues Konto für jeden Benutzer / jede Anwendung der Datenbank, anstatt dies nach Funktionalität zu tun. Dies löst zwei Probleme für uns: 1) Wir können die Verwendung der Datenbank in Tools wie OEM unterscheiden (dh wir können sehen, wer die Datenbank granular bearbeitet) und 2) wir können individuell anpassen, was jeder Benutzer sieht und auf was er Zugriff hat Datenbank.
ScottCher
7

Verwenden Sie Einmalpasswörter , Kerberos , LDAP oder was auch immer, um Ihre Kontodaten zu speichern und Benutzer zu authentifizieren / zu autorisieren. Verzeichnisdienste sind ein gutes Mittel, um Benutzerinformationen zu speichern und als Backend für Kontodaten zu verwenden.

Yasir Arsanukaev
quelle
4

Ich bin ein großer Fan von PostgreSQLs 'Ident'-Authentifizierung über lokale Sockets, wann immer ich kann. Auf diese Weise werden lokale Benutzer direkt den Unix / Windows-Benutzern des lokalen Computers zugeordnet, und ich muss mich überhaupt nicht um das Speichern von Kennwörtern kümmern. Ich glaube jedoch nicht, dass dies eine Option in MySQL ist.

Wenn sich die Datenbank und der Webserver auf zwei separaten Computern befinden, verwende ich MD5-Kennwörter über SSL: Wenn ein Feind Zugriff auf meinen Frontend-Server hat, ist es nur eine Frage der Zeit, bis er herausfindet, wie er mit der Datenbank kommuniziert.

Gaurav
quelle
3

Wenn Sie .NET Framework verwenden, können Sie die Verwendung verschlüsselter Verbindungszeichenfolgen untersuchen. Ich weiß nicht, ob so etwas in anderen Sprachen / Frameworks möglich ist, aber das wäre ein weiterer Schutz, um sicherzustellen, dass Ihre Verbindungen nicht beeinträchtigt werden.

Neben der Verwendung verschlüsselter Verbindungszeichenfolgen ist die Verwendung von LDAP / Kerberos / Active Directory die sicherste Option.

Jeremiah Peschka
quelle
3

Wenn Ihre Passwörter im Klartext gespeichert sind, verwenden Sie die Hashes (MD5, SHA), Luke!

Yasir Arsanukaev
quelle
Das OP fragt nicht nach dem Speichern von Benutzerkennwörtern. Aber ja, sicher haben Sie Ihre Benutzerkennwörter, aber niemals den Benutzer MD5 oder die SHA-Familie, um dies zu tun! Verwenden Sie bcrypt oder PBKDF2. Andernfalls finden Sie sich bald in den Nachrichten dieser Unternehmen wieder, die MD5 und SHA1 verwendet haben und ihre Benutzer damit einfachen Brute-Force-Angriffen ausgesetzt haben.
Nick Chammas
Sicher, Salzen und andere Techniken sind neben dem Haschisch erforderlich. Und man sollte niemals selbst Krypto-Primitive implementieren, sondern einige weit verbreitete Krypto-Bibliotheken verwenden.
Yasir Arsanukaev
2

Abhängig von Ihrer Programmiersprache können Sie die Anmeldeinformationen verschlüsseln. Wenn Sie jedoch eine interpretierte Sprache verwenden, können Sie nicht sicherstellen, dass jemand die Anmeldeinformationen nicht herausfindet, wenn er Zugriff auf das System erhält.

Wenn Sie C ++ oder ähnliches ausführen, empfehle ich Ihnen, eine gesalzene Verschlüsselungs- / Entschlüsselungsfunktion zu erstellen / zu finden, die Anmeldeinformationen darüber auszuführen und den resultierenden Hash als Datei auf dem System zu speichern.

Wenn Sie PHP oder ähnliches mcrypt_encrypt()ausführen , würde ich Ihnen empfehlen, einen Wrapper für das zu schreiben und die Anmeldeinformationen zu sperren. Führen Sie dann eine Codeverschleierung aus, um alle Hacker zu verlangsamen, wenn sie Zugriff auf das System erhalten.

Patrick
quelle
Wenn Sie die Anmeldeinformationen verschlüsseln, benötigen Sie ein anderes Geheimnis, um sie erneut zu entschlüsseln. Oder alternativ wird die verschlüsselte Form zum Geheimnis, sodass ein Angreifer dies nutzen kann. Einige Details fehlen.
Peter Eisentraut