Ist es jemals ratsam, für jeden Benutzer einer Anwendung ein eigenes Datenbankkonto zu verwenden?

13

Die Anwendungen, die ich bisher verwendet habe, sind serverbasiert und verwenden ein Datenbankkonto für viele Benutzer. Der Anwendungscode steuert, was der Benutzer tun kann, oder Einzelbenutzer.

Gibt es erfolgreiche komplexe Geschäftsanwendungen, für die jede Person ihr eigenes Datenbankkonto benötigt und auf die der Datenbankserver angewiesen ist, um Richtlinienregeln zu erzwingen, die festlegen, was jeder Benutzer darf und was nicht?

Ich denke an Anwendungen, bei denen mehrere Personen zu Informationen in einer Datenbank beitragen und auf Informationen zugreifen können, die von anderen Personen gespeichert wurden - z. B. Kollegen in einer Organisation, die alle auf Kundendatensätze zugreifen müssen.

Gibt es auch einen Namen für diese Art der Einrichtung?

bdsl
quelle
1
Lassen Sie uns dies auf den Kopf stellen, würde es jemals eine gute Übung sein, es nicht zu tun?
Stevetech
In manchen Situationen ist es sicherlich Standard. Viele Anwendungen haben viele Endbenutzer, aber nur einen einzigen Datenbankbenutzer - zum Beispiel WordPress, Drupal, Roundcube, Redmine. Soweit ich weiß, hat die empfohlene Installation für jede dieser Anwendungen nur ein Benutzerkonto auf Datenbankebene, aber es können leicht Hunderte oder Tausende Benutzer vorhanden sein.
BDSL
@Stevetech es klingt wie Ihre Antwort auf meine Frage ist "Ja". Kannst du das zu einer vollständigen Antwort ausbauen?
BDSL

Antworten:

6

Wenn Sie eine wirklich strenge Kontrolle auf Datenebene benötigen. Zum Beispiel umfangreiche Audits. Die Überwachung ist nicht besonders gut, wenn mehrere Benutzer dasselbe Konto verwenden. Wenn Sie Benutzer haben, die direkt auf die Datendatenbank zugreifen müssen.

Wenn die Sicherheit so streng ist, wird die Datenbank in der Regel nicht einmal direkt verfügbar gemacht. Sie haben einen Dienst und der Client muss Daten vom Dienst erhalten.

In einer Webanwendung wird die Datenbank (z. B. Port 1433) normalerweise nicht direkt verfügbar gemacht, sodass Sie über eine bestimmte Sicherheitsstufe verfügen. Auch wenn die Webanwendung direkt auf die Datenbank zugreift, haben die Benutzer immer noch keinen direkten Zugriff Zugriff auf die Datenbank.

Wenn sich Login und Passwort in der Client-Anwendung befinden, kann es gehackt werden. Bei einer Domain können Sie integrierte Sicherheit verwenden.

In der Datenbank können Sie ziemlich feine Kontrollen haben. Aber die Kontrolle auf Zeilenebene ist ein bisschen Arbeit. Eine Datenbank ist kein gutes Werkzeug für Geschäftsregeln. Geschäftsregeln und detaillierte Sicherheit werden normalerweise auf Anwendungsebene durchgesetzt.

Sie können einen gemischten Modus verwenden, in dem einige gespeicherte Prozeduren von Administratoren verwendet werden und Sie nachverfolgen möchten, welcher Administrator angemeldet ist. Außerdem können Sie Benutzern, die einen Bericht direkt erstellen, Lesezugriff gewähren.

Paparazzo
quelle
5

Die Herausforderung hierbei ist, dass Ihr Datenbankzugriff von einer Abstraktion verwaltet wird. Anstatt sich als Benutzer zu verbinden, übernehmen sie im Wesentlichen die Identität einer allgemeinen Anwendungsrolle. Sie verlieren nicht nur die Sichtbarkeit der einzelnen Verbindungen, sondern auch die Genauigkeit der Definition verschiedener Zugriffsarten für alle Ihre einzelnen Benutzer.

Der Hauptgrund für die Verwendung dieses Ansatzes ist die Einfachheit. Viele Anwendungen sind so konzipiert, dass der Benutzer der Anwendung keine Kenntnisse über die Datenbank hat. Sie brauchen es wirklich nicht, besonders wenn die Anwendung ihre eigene interne Sicherheit verwaltet. Die meisten einzelnen Benutzer stellen niemals eine direkte Verbindung zur Datenbank her. Daher ist es nicht erforderlich, eine explizite Anmeldung für sie zu definieren.

Sie sollten nur in Betracht ziehen, die Datenbank Ihre Sicherheit verwalten zu lassen, wenn Benutzer eine direkte Verbindung zu Ihrer Datenbank herstellen. Dies bedeutet, dass sie Ihre Anwendung umgehen und die Sicherheit nicht mehr allein erzwingen können. Der Vorteil hierbei ist, dass Sie Ihre Sicherheit genauer definieren können. Der Nachteil ist der höhere Aufwand für die Verwaltung der Benutzer und ihrer Berechtigungen.

Bildbeschreibung hier eingeben

Wenn Sie diese Art von Zugriff benötigen, möchten Sie die rollenbasierte Zugriffssteuerung verwenden . Sie sollten Rollen basierend auf den Berechtigungen definieren, die in Ihrer Datenbank benötigt werden, und dann einzelne Benutzer unter diesen Rollen gruppieren. Dies gibt Ihnen eine bessere Überwachung und Kontrolle über Ihr Sicherheitsmodell, das bei der Verwaltung des direkten Zugriffs schnell außer Kontrolle geraten kann.

Hierfür gibt es einen hybriden Ansatz. Wenn Sie möchten, dass Ihre Sicherheit teilweise von der Datenbank geändert wird, können Sie mehrere Anwendungsbenutzer erstellen, die jeweils durch ihre Rolle definiert sind, und diesen Benutzern basierend auf der Rolle, die sie erfüllen, explizit Zugriff gewähren. Dies bedeutet, dass Sie die Datenbank-Engine für einige Ihrer Sicherheitsmodelle nutzen können, die Anwendung jedoch noch verwaltet werden muss. Dies erhöht die Komplexität des Anwendungsbenutzermodells, gibt Ihnen jedoch eine genauere Übersicht über die verschiedenen verwendeten Anmeldungen.

Mike Fal
quelle
4

Sie sollten so bald wie möglich mit der Durchsetzung der Sicherheit auf höchstem Niveau beginnen. Rollen helfen in dieser Hinsicht - es ist kein Albtraum, Menschen Zugang zu mehreren Tischen auf einmal zu verschaffen.

Der einzelne Account für alle ist eine gute Quelle für Fragen hier und anderswo - "Datensatz x wurde gelöscht, wie finde ich heraus, wer es getan hat?" - Die Antwort lautet, Sie können nicht - ohne individuelle Konten und Prüfung .

Mit "Auditing" meine ich, dass es zwar sehr gut ist, einen Account für alle zu haben, aber nicht bedeutet, dass Sie echte Sicherheit haben. Wenn beispielsweise ein Datensatz in der HR-Tabelle gelöscht wird, können Sie nur sagen, dass jemand mit Zugriff auf die HR-Tabelle dies getan hat - das sind x Personen.

Sie benötigen Trigger in Ihrem System, die Aktionen protokollieren, um auf die jeweilige Ebene zu gelangen, die die Aktion X ausgeführt hat (es sei denn, Sie verfügen über ein RDBMS wie Oracle, bei dem dies automatisch erfolgen kann).

In jedem Fall sollten Sie Ihre Sicherheit so schnell wie möglich so detailliert wie möglich gestalten. Geben Sie den Benutzern nur dann Zugriff auf Tabellen, wenn Sie dies wissen müssen. Fügen Sie außerdem immer Zeitstempel für Aktionen in Tabellen ein - die Leute geben ihre IDs häufig an andere weiter -, wenn Sie sagen können: "Jimmy, Sie waren um 17:49 Uhr der einzige im Büro ..." - auch hier ist es nicht schlampig Ein weiterer Pfeil in deinem Köcher.

Vielleicht könnten Sie, wenn Sie uns Ihr RDBMS geben, einen Rat einholen, der spezifischer / relevant für Ihre Situation ist?

Vérace
quelle
Ich glaube nicht, dass dies direkt mit meiner Situation zusammenhängt. Ich habe hauptsächlich aus Neugier gefragt. Ich arbeite mit Webanwendungen und MySQL.
BDSL
1
Sie scheinen zu sagen, dass für alle Datenbanken jeder menschliche Endbenutzer ein eindeutiges Login haben muss, aber ich kenne viele Serveranwendungen, die nur einen DBMS-Benutzer für die gesamte App verwenden, und ich habe nicht gesehen, dass dies als weniger als am besten verurteilt wird trainieren.
BDSL
1
An der intellektuellen Neugier ist nichts auszusetzen - Ihr Beitrag scheint gut aufgenommen worden zu sein. MySQL hat wahrscheinlich die schlechteste Sicherheitskapazität (wie so viele andere ...), aber MariaDB hat sie und ist auch Open Source. Als Antwort auf den Kommentar - was Sie sprechen, ist nicht die beste Praxis - es ist die schlechteste Praxis.
Vérace
1
@bdsl Sie mischen Server mit Geschäftsanwendung und das ist eine Quelle der Verwirrung. Geschäftsanwendungen umfassen Desktopanwendungen.
Paparazzo
1
@bdsl Verwenden Sie dann nicht mehr den Begriff Serveranwendungen, wenn Sie Desktopanwendungen nicht ausschließen möchten.
Paparazzo
3

Ja ist es. Das Herstellen einer Verbindung zu einer Datenbank von einer Anwendung aus als ein einziger leistungsfähiger Benutzer verstößt gegen das Prinzip der geringsten Berechtigungen . Dies ist die Hauptursache für die meisten SQL Injection-Angriffe.

Dies geschieht normalerweise aus Unwissenheit, der Einfachheit halber oder manchmal aus Gründen der Leistung.

Datenbanken sind oft langlebig und werden von mehreren Anwendungen gleichzeitig und im Laufe der Zeit verwendet. Sie können Ressourcen sparen, indem Sie die Zugriffssteuerung in der Datenbank zentralisieren und nicht über mehrere Anwendungen hinweg.

Sie möchten einen Datenbankserver auswählen, der Zeilensicherheit, Spaltensicherheit und Identitätswechsel / Proxy-Authentifizierung unterstützt (unterstützt echte Datenbankbenutzer + Verbindungspooling).

Es wäre auch sicherer für "Plugin" -basierte Anwendungen wie Wordpress, bei denen SQL-Injections aufgrund ungeübter Plugin-Autoren schwer zu vermeiden sind. Jedes Plugin erhält anstelle der gesamten Anwendung ein DB-Login.

Neil McGuigan
quelle
Ist es möglich, dass jeder Benutzer einer Wordpress-Site mit unterschiedlichen Anmeldeinformationen eine Verbindung zur Datenbank herstellt?
BDSL
@bdsl ja das ist es.
Neil McGuigan
1
Können Sie einen Link zu einer Anleitung dazu erstellen? Ich hatte eine schnelle Suche und habe sie nicht gefunden. Bedeutet dies, dass die WordPress-Anmeldeseite nach den Anmeldeinformationen fragt, die für die Anmeldung bei der Datenbank erforderlich sind?
BDSL
@ BDSL Mein PHP ist ziemlich rostig. So würden Sie es mit Spring (Java) und PostgreSQL machen. blog.databasepatterns.com/2015/03/… . stackoverflow.com/questions/2998597/…
Neil McGuigan
1
Wordpress war nur ein Beispiel für ein Plugin-basiertes System. Es ist vom Standpunkt der Sicherheit aus schlecht gemacht.
Neil McGuigan