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?
18
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Wenn Ihre Passwörter im Klartext gespeichert sind, verwenden Sie die Hashes (MD5, SHA), Luke!
quelle
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.quelle