Sicherheit auf Spaltenebene von SQL Server

7

Ich glaube, ich brauche einige Hinweise zur Sicherheit in SQL Server. Ich versuche, einige unserer Endbenutzer daran zu hindern, auf bestimmte Spalten (z. B. SSN) in einer Tabelle zuzugreifen.

Ich dachte, ich könnte nur die Sicherheit auf Spaltenebene verwenden, um den Zugriff auf die Spalten einzuschränken. Dies verhinderte erfolgreich, dass Benutzer direkt auf die Tabelle zugreifen konnten, aber ich war überrascht, dass sie über eine Ansicht, die auf diese Tabelle zugegriffen hat, immer noch zu diesen Spalten gelangen konnten.

Ich habe die Tipps hier befolgt: http://www.mssqltips.com/sqlservertip/2124/filtering-sql-server-columns-using-column-level-permissions/ Diese waren sehr hilfreich, aber als ich am Ende eine Ansicht erstellte Der Praktikant konnte standardmäßig auf diese Spalte zugreifen

Ich habe gelesen, dass Ansichten der beste Weg sind, um dies zu erreichen, aber ich möchte wirklich nicht alle Ansichten und die ältere Front-End-Anwendung ändern. Ich würde es lieber nur einmal auf die Tabelle beschränken und wenn eine Ansicht versucht, auf diese Spalte zuzugreifen, würde es einfach fehlschlagen.

Ist das möglich oder verstehe ich falsch, wie Sicherheit in SQL Server funktioniert?

user46372
quelle
1
Typischer Anwendungsfall für eine Ansicht - Definieren Sie eine Ansicht über Ihrer Tabelle, die nur die Spalten enthält, die Ihre Benutzer sehen sollen, und erteilen Sie diesen Benutzern dann die SELECTBerechtigung für die Ansicht, verweigern Sie ihnen jedoch die Berechtigung für die zugrunde liegende Tabelle
marc_s
Ich biete eine alternative Ansicht an: Es kann möglich sein, einen DDL-Trigger für die Tabelle zu entwerfen, der eine Gewährung / einen Widerruf an die darauf basierenden Ansichten weitergibt. Diese Ansichten würden durch Überprüfen der Metadaten der Objekte gefunden. Ich werde eine vollständige Lösung ausarbeiten und hoffentlich schreiben.
Marcus Vinicius Pompeu

Antworten:

4

Die Sicherheit auf Spaltenebene funktioniert nicht so. Mir ist kein Mechanismus bekannt, mit dem einem bestimmten Benutzer der Zugriff auf eine bestimmte Spalte global verweigert werden kann. GRANT / DENY funktioniert nur mit bestimmten Anweisungen wie SELECT, UPDATE usw. in Kombination mit einem bestimmten Objekt.

Wenn Sie in Ihrem Fall den Zugriff auf SELECT für Spalte X in Tabelle Y entfernt haben, kann der Benutzer weiterhin problemlos "select *" - Ansichten für diese Tabelle ausführen, da die Ansicht ein anderes Objekt ist und von dieser Sicherheitseinstellung nicht betroffen ist!

Die gute Nachricht ist, dass Sie Spaltenberechtigungen auch für Ansichten verwenden können. Es funktioniert genauso wie bei Tabellen, aber Sie müssen die Berechtigung für jede Ansicht festlegen, die die SSN-Spalte enthält.

TToni
quelle
Das ist bedauerlich. Gilt das auch auf Tabellenebene? Wenn ich also den Zugriff auf die gesamte Tabelle einschränke, kann eine Ansicht trotzdem darauf zugreifen? Wenn ja, ist es fast besser, diese Tabellen einfach in eine andere Datenbank zu stellen, wo ich sie auf bestimmte Benutzer beschränken kann
@ user46372 Nein, das musst du nicht tun. Lesen Sie dies in den Besitzerketten, um zu verstehen, was passiert.
Martin Smith
Martin, danke für den Link. Wenn also die Tabellen, die ich sperren wollte, einem anderen Benutzer gehören würden als alle anderen Objekte / Ansichten, würde dies SQL Server zwingen, die Berechtigungen erneut zu überprüfen und den Zugriff zu verhindern?
3
@ user46372 - Ja. Das sollte richtig sein. Aber FWIW Ich stimme dem Kommentar von marc_s in der Frage zu, dass es am einfachsten ist, den Zugriff auf die Tabelle zu verweigern und dies zu verwalten, indem eine Ansicht mit der gewünschten Teilmenge von Spalten erstellt wird.
Martin Smith
Ja, ich habe gehört, dass die Ansichtsoption die beste ist, aber leider ist unser älteres Front-End-Programm ein Access Data-Projekt, das alle Ansichten und Tabellen (ick) verfügbar macht. Da wir bereits eine Reihe von Ansichten erstellt haben, müssten wir wahrscheinlich jede einzelne durchgehen und den Zugriff verweigern? Und wir müssten uns nur daran erinnern, den Zugriff auf jede neue Ansicht zu verweigern, die wir ebenfalls erstellen, oder? Das wäre fehleranfällig.
0

Beachten Sie, dass es in SQL 2016+ eine Datenmaskierungsfunktion gibt, mit der die vollständigen Details bestimmter Spalten ausgeblendet werden können. Dies kann verhindern, dass Benutzer die tatsächlichen Werte bestimmter Spalten sehen, es sei denn, sie verfügen über bestimmte "Demaskierungs" -Berechtigungen.

Beachten Sie, dass Benutzer möglicherweise weiterhin indirekt Daten über WHERE-Klauseln finden. Selbst wenn beispielsweise "Gehalt" maskiert wäre, könnten Sie Benutzer mit einem Gehalt zwischen X und Y abfragen.

Zum Beispiel:

ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')

Dokumentation: https://docs.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking?view=sql-server-2016

Mark Sowul
quelle