Datenbank-IDs offenlegen - Sicherheitsrisiko?

133

Ich habe gehört, dass das Offenlegen von Datenbank-IDs (z. B. in URLs) ein Sicherheitsrisiko darstellt, aber ich habe Probleme zu verstehen, warum.

Irgendwelche Meinungen oder Links darüber, warum es ein Risiko ist oder warum es nicht ist?

BEARBEITEN: Natürlich ist der Zugriff begrenzt. Wenn Sie beispielsweise keine Ressource sehen können foo?id=123, wird eine Fehlerseite angezeigt . Andernfalls sollte die URL selbst geheim sein.

BEARBEITEN: Wenn die URL geheim ist, enthält sie wahrscheinlich ein generiertes Token mit einer begrenzten Lebensdauer, z. B. 1 Stunde gültig und kann nur einmal verwendet werden.

BEARBEITEN (Monate später): Meine derzeit bevorzugte Vorgehensweise besteht darin, UUIDS für IDs zu verwenden und diese verfügbar zu machen. Wenn ich fortlaufende Nummern (normalerweise für die Leistung einiger DBs) als IDs verwende, möchte ich für jeden Eintrag ein UUID-Token als alternativen Schlüssel generieren und diesen verfügbar machen.

orip
quelle

Antworten:

108

Unter den richtigen Bedingungen ist die Offenlegung von Kennungen kein Sicherheitsrisiko. In der Praxis wäre es äußerst aufwändig, eine Webanwendung zu entwerfen, ohne Kennungen preiszugeben.

Hier sind einige gute Regeln zu befolgen:

  1. Verwenden Sie rollenbasierte Sicherheit, um den Zugriff auf einen Vorgang zu steuern. Wie dies geschieht, hängt von der Plattform und dem Framework ab, die Sie ausgewählt haben. Viele unterstützen jedoch ein deklaratives Sicherheitsmodell, das Browser automatisch zu einem Authentifizierungsschritt umleitet, wenn für eine Aktion eine bestimmte Berechtigung erforderlich ist.
  2. Verwenden Sie die programmatische Sicherheit, um den Zugriff auf ein Objekt zu steuern. Dies ist auf Framework-Ebene schwieriger. In den meisten Fällen müssen Sie dies in Ihren Code schreiben und sind daher fehleranfälliger. Diese Prüfung geht über die rollenbasierte Prüfung hinaus, indem sichergestellt wird, dass der Benutzer nicht nur über die Berechtigung für den Vorgang verfügt, sondern auch über die erforderlichen Rechte für das zu ändernde Objekt verfügt. In einem rollenbasierten System ist es einfach zu überprüfen, ob nur Manager Erhöhungen geben können. Darüber hinaus müssen Sie sicherstellen, dass der Mitarbeiter zur Abteilung des jeweiligen Managers gehört.
  3. Für die meisten Datenbankeinträge sind die Bedingungen 1 und 2 ausreichend. Das Hinzufügen unvorhersehbarer Ausweise kann jedoch als kleine zusätzliche Versicherung oder "Sicherheit in der Tiefe" angesehen werden, wenn Sie sich für diesen Begriff entscheiden. Ein Ort, an dem unvorhersehbare Kennungen erforderlich sind, sind Sitzungs-IDs oder andere Authentifizierungstoken, an denen die ID selbst eine Anforderung authentifiziert. Diese sollten von einem kryptografischen RNG generiert werden.
erickson
quelle
27
IMO, das Hinzufügen unvorhersehbarer IDs ist ein "Sicherheit durch Dunkelheit" -Ansatz und kann zu einem falschen Sicherheitsgefühl führen. Es ist besser, sich auf (1) und (2) zu konzentrieren und sicherzustellen, dass Ihre Zugangskontrolle solide ist.
Stucampbell
4
Die Verwendung eines kryptografischen RNG ist definitiv keine "Sicherheit durch Dunkelheit". Der Angreifer ist nicht näher dran, Objektkennungen zu erraten, selbst wenn er weiß, wie Sie sie generieren. Sicherheit durch Dunkelheit bedeutet, dass der von Ihnen verwendete Algorithmus ausgenutzt werden kann, wenn er entdeckt wird. Es bezieht sich nicht darauf, Geheimnisse wie Schlüssel oder den internen Status eines RNG zu bewahren.
Erickson
1
@stucampbell Vielleicht, aber das bedeutet nicht, dass Sie überhaupt keine unvorhersehbaren IDs verwenden sollten. Da Fehler auftreten, sind unvorhersehbare IDs ein zusätzlicher Sicherheitsmechanismus. Außerdem ist die Zugriffskontrolle nicht der einzige Grund, sie zu verwenden: Vorhersehbare IDs können vertrauliche Informationen wie die Anzahl neuer Kunden innerhalb eines bestimmten Zeitraums anzeigen. Sie möchten solche Informationen wirklich nicht preisgeben.
user247702
1
@Stijn Sie können nicht wirklich sagen, dass ich "wirklich nicht will", wie viele Kunden ich habe. Ich meine, McDonald's hat ein riesiges Schild, das besagt, dass sie 10 Milliarden Hamburger serviert haben. Es ist überhaupt kein Sicherheitsrisiko, es ist eine Präferenz. Darüber hinaus müssen Sie sich anmelden, bevor Sie in den meisten Anwendungen URLs sehen, über die wir uns sowieso Sorgen machen würden. Daher würden wir wissen, wer Daten kratzt.
Wayne Bloss
1
Eine Sache, die ich in dieser Konversation nicht erwähnt habe, ist, dass es unter dem Gesichtspunkt der Fehlerbehebung und Benutzerfreundlichkeit sehr praktisch sein kann, IDs in einer URL offenzulegen, um Benutzer auf eine bestimmte Ressource zu verweisen oder sie in die Lage zu versetzen um Ihnen genau zu sagen, welche Ressource sie anzeigen. Sie können Business-Intelligence-Bedenken meistens vermeiden, indem Sie das automatische Inkrementieren mit einem höheren Wert starten, um nur eine Idee anzubieten.
Chockomonkey
47

Dies ist zwar kein Datensicherheitsrisiko , aber absolut ein Business-Intelligence-Sicherheitsrisiko , da sowohl die Datengröße als auch die Datengeschwindigkeit offengelegt werden. Ich habe gesehen, wie Unternehmen dadurch geschädigt wurden, und habe ausführlich über dieses Anti-Muster geschrieben. Sofern Sie nicht nur ein Experiment und kein Unternehmen aufbauen, würde ich dringend empfehlen, Ihre privaten Ausweise nicht in die Öffentlichkeit zu bringen. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

Peter
quelle
4
Schließlich eine vernünftige Antwort, die andere Aspekte als das Sicherheitsrisiko mit sich bringt.
Peceps
2
Dies sollte die akzeptierte Antwort sein. Wenn Sie davon ausgehen, dass der Angreifer Ihre Sicherheit umgehen kann (was Sie immer tun sollten), möchten Sie diese Art von Informationen nicht einfach weitergeben.
Kriil
@Kriil Sie müssen nicht einmal Ihre Sicherheit umgehen. Sie müssen nur ein Konto erstellen!
Peter
32

Es hängt davon ab, wofür die IDs stehen.

Stellen Sie sich eine Website vor, die aus Wettbewerbsgründen nicht veröffentlichen möchte, wie viele Mitglieder sie haben, aber durch die Verwendung sequentieller IDs wird dies trotzdem in der URL angezeigt : http://some.domain.name/user?id=3933

Wenn sie stattdessen den Anmeldenamen des Benutzers verwenden: http://some.domain.name/user?id=some , haben sie nichts preisgegeben, was der Benutzer noch nicht wusste.

etwas
quelle
2
Wenn Sie sequentielle IDs verwenden, haben Sie Recht, aber wenn nicht, macht das nichts
sichtbar
@orip: Wie gesagt, es hängt davon ab, was jemand durch Untersuchen mehrerer IDs entdecken kann. Gibt es ein Muster? Können sie diese Informationen verwenden, um Informationen zu erhalten, die sie nicht haben sollen?
einige
@ John: Danke für die Bearbeitung. Englisch ist nicht meine Muttersprache :)
einige
6
Ich habe genau das getan: Ich habe fortlaufende ID-Nummern verwendet, um die Größe der Nutzerbasis eines Konkurrenten zu bestimmen.
Micah
3
Sie sind überall. Viele Einkaufsseiten verwenden eine fortlaufende Nummer für die Bestellnummer. Wenn Sie eine Bestellung zu einem Datum und eine zu einem anderen Datum aufgeben, wissen Sie, wie viele Bestellungen sie in diesem Zeitraum erhalten haben. Auch wenn Sie nicht wissen, wie viel Geld die Bestellungen wert sind, erhalten Sie dennoch einen Hinweis darauf, wie gut das Geschäft läuft.
einige
25

Der allgemeine Gedanke lautet wie folgt: "Geben Sie so wenig Informationen über das Innenleben Ihrer App an Dritte weiter."

Das Offenlegen der Datenbank-ID gilt als Offenlegung einiger Informationen.

Gründe dafür sind, dass Hacker Informationen über das Innenleben Ihrer Apps verwenden können, um Sie anzugreifen, oder dass ein Benutzer die URL ändern kann, um in eine Datenbank zu gelangen, die er / sie nicht sehen soll.

Arjan Einbu
quelle
1
Zugriff auf Ressourcen, die sie nicht sehen sollen - nur wenn ich die Berechtigungen nicht überprüfe (was ich auch tue, sonst habe ich ein anderes Sicherheitsproblem). Informationen über das "Innenleben" preisgeben - das ist genau meine Frage. Warum ist das ein Problem?
Orip
8
@orip: Es geht darum, so sicher wie möglich zu sein. Wenn Sie ein Programmierer sind, der keine Fehler macht, ist dies kein Problem. Andernfalls wird es durch die Offenlegung weniger Details schwieriger, Ihren Code auszunutzen, wenn (wann) Sie Fehler machen. Sie haben Recht, es erhöht die Sicherheit nicht.
Adam Bellaire
@Adam: Oberflächliche Sicherheit kann schlechter sein als keine Sicherheit. Ohne Sicherheit sind Sie explizit, mit oberflächlicher Sicherheit könnte man denken, dass sie etwas Nicht-Vernachlässigbares hinzufügt.
Orip
16

Wir verwenden GUIDs für Datenbank-IDs. Sie zu lecken ist viel weniger gefährlich.

Joshua
quelle
Das würde ich vorschlagen. Es ist viel weniger wahrscheinlich, dass die GUIDs in Ihrer Datenbank erraten werden.
Jon Erickson
6
Dies führt zu einer Leistungsminderung. Siehe hier
Jeshurun
2
Das Interessante an der Verwendung von Guids ist, dass Sie Clients Datenbank-IDs generieren lassen können. Interessant ist, dass sie kein Problem mit Sharded-Datenbanken haben, wie dies bei automatisch inkrementierenden IDs der Fall ist.
Brian White
Verwenden Sie diese GUIDs auch im HTML-Code als ID-Attribute, um Benutzer, Kommentare und Beiträge zu identifizieren? Um anzugeben, auf welchen Link ein Benutzer geklickt hat oder welchen Beitrag er kommentieren möchte?
Trzczy
7

Wenn Sie in Ihrer Datenbank ganzzahlige IDs verwenden, können Sie Benutzern das Anzeigen von Daten erleichtern, die sie nicht sehen sollten, indem Sie die qs-Variablen ändern.

Zum Beispiel könnte ein Benutzer den id-Parameter in diesem qs leicht ändern und Daten sehen / ändern, die er nicht http: // someurl? Id = 1 sollte

Jason
quelle
7
Wenn ich die Berechtigungen nicht überprüfe, liegt ein anderes Sicherheitsproblem vor.
Orip
aber die Antwort ist richtig: "Mai"
Seun Osewa
1
Die Frage ist nicht, ob Sie die Berechtigungen überprüfen werden. Wenn der neue Mitarbeiter, den Sie nicht kennen, die Berechtigungen überprüft.
Brian White
@BrianWhite - Aus diesem Grund möchten Sie einen Codeüberprüfungsprozess einrichten, damit Sie sie schulen können, bevor sie in die Produktion gelangen.
Candu
2
Wir verschlüsseln die Ganzzahl-IDs, wenn sie in der URL oder in Formularvariablen verwendet werden.
Brian White
6

Wenn Sie Datenbank - IDs an Ihren Kunden senden , werden Sie gezwungen , die Sicherheit in beiden Fällen zu überprüfen. Wenn Sie die IDs in Ihrer Websitzung behalten, können Sie auswählen, ob Sie dies tun möchten / müssen, was möglicherweise weniger Verarbeitung bedeutet.

Sie versuchen ständig, Dinge an Ihre Zugriffskontrolle zu delegieren;) Dies mag in Ihrer Anwendung der Fall sein, aber ich habe in meiner gesamten Karriere noch nie ein so konsistentes Back-End-System gesehen. Die meisten von ihnen verfügen über Sicherheitsmodelle, die für die Verwendung außerhalb des Webs konzipiert wurden, und einige haben posthum zusätzliche Rollen hinzugefügt, und einige davon wurden außerhalb des zentralen Sicherheitsmodells angeschraubt (weil die Rolle beispielsweise in einem anderen betrieblichen Kontext hinzugefügt wurde vor dem Web).

Wir verwenden also lokale IDs für synthetische Sitzungen, da diese so viel verbergen, wie wir können.

Es gibt auch das Problem von nicht ganzzahligen Schlüsselfeldern, was bei Aufzählungswerten und Ähnlichem der Fall sein kann. Sie können versuchen, diese Daten zu bereinigen, aber es besteht die Möglichkeit, dass Sie wie kleine Bobby-Drop-Tische enden .

Krosenvold
quelle
4
Interessant, obwohl ich denke, dass das Überprüfen aller Eingaben (einschließlich URL-Parameter) für jede Anfrage für das Web sehr geeignet ist.
Orip