Ich habe eine Ansicht in Datenbank1 basierend auf Tabellen in Datenbank2 erstellt. Ich habe SELECT
einem Benutzer die Erlaubnis gegeben, der nur Zugriff auf database1 hat. Der Benutzer kann diese Ansicht nicht zum Laufen bringen, da er kein Konto in Datenbank2 hat. Wie kann ich dieses Problem lösen? Ich möchte kein Konto in database2 erstellen.
10
TRUSTWORTHY ON
, die Anwendung als festzulegen oder anzumeldensa
. DB Ownership Chaining undTRUSTWORTHY
existieren hauptsächlich, weil sie zu diesem Zeitpunkt die einzige Lösung sind. Aber jetzt, auch wenn es kein großes Risiko ist, ist DB Chaining sicherlich ein unnötiges Risiko, da das Signieren von Modulen nicht so schwierig ist. Und wenn man sich auf die DB-Verkettung verlässt und dann Dynamic SQL verwendet, ist es wahrscheinlicherTRUSTWORTHY ON
, dass das Problem behoben wird, während es mit der Modulsignierung nicht kaputt gegangen wäre.DB_CHAINING
ist dies nicht riskanter als die Verkettung von Besitzverhältnissen innerhalb der Datenbank, wenn sich die Objekte ohnehin in derselben Datenbank befinden sollten.DB_CHAINING
ist dies ziemlich riskant.Antworten:
Dies ist mit Module Signing auf sehr sichere Weise einfach zu bewerkstelligen. Dies ähnelt den folgenden zwei Antworten von mir, auch hier auf DBA.StackExchange, die Beispiele dafür geben:
Sicherheit gespeicherter Prozeduren mit Ausführung als, datenbankübergreifenden Abfragen und Modulsignatur
Berechtigungen in Triggern bei Verwendung datenbankübergreifender Zertifikate
Der Unterschied für diese spezielle Frage besteht darin, dass es sich um eine Ansicht handelt und Ansichten nicht signiert werden können. Daher müssen Sie die Ansicht in eine TVF-Funktion (Table-Valued Function) mit mehreren Anweisungen ändern, da diese signiert werden können und wie eine Ansicht aufgerufen werden können (also für den
SELECT
Zugriff).Der folgende Beispielcode zeigt genau das, was in der Frage angefordert wird, da der Login / Benutzer "RestrictedUser" nur Zugriff auf "DatabaseA" hat und dennoch Daten aus "DatabaseB" abrufen kann. Dies funktioniert nur durch Auswahl aus diesem einen TVF und nur aufgrund dessen, dass es signiert ist.
Durchführen diese Art von Cross-Datenbank - Zugriff , während immer noch eine Ansicht verwenden, und nicht dem Benutzer zusätzliche Berechtigungen zu geben, würde ermöglichen Cross-Database Ownership Chaining erfordern. Dies ist weitaus weniger sicher, da es für alle Objekte zwischen beiden Datenbanken vollständig offen ist (es kann nicht auf bestimmte Objekte und / oder Benutzer beschränkt werden). Durch die Modulsignierung kann nur diese eine TVF auf die
SELECT
Datenbank zugreifen (der Benutzer hat keine Berechtigung, die TVF hat dies), und Benutzer, die nicht über die TVF verfügen können, haben überhaupt keinen Zugriff auf "DatabaseB".Alle oben genannten Schritte stellen die aktuelle Situation wieder her: Der Benutzer hat Zugriff auf DatabaseA, hat die Berechtigung, mit einem Objekt in DatabaseA zu interagieren, erhält jedoch einen Fehler, weil dieses Objekt in DatabaseA auf etwas in DatabaseB zugreift, auf das der Benutzer keinen Zugriff hat.
Mit den folgenden Schritten wird das Modul-Singen eingerichtet. Es macht folgendes:
SELECT
dem zertifikatbasierten Benutzer die Berechtigung für die Tabelle in DatenbankBModul-Signatur-Setup:
Wenn der Zugriff aus irgendeinem Grund über eine Ansicht erfolgen muss, können Sie einfach eine Ansicht erstellen, die aus der oben gezeigten TVF ausgewählt wird. In dieser Situation
SELECT
muss der TVF kein Zugriff gewährt werden, sondern nur der Ansicht, wie unten gezeigt:Und jetzt zum Testen:
Weitere Informationen zum Modul-Signieren finden Sie unter: https://ModuleSigning.Info/
quelle
ALTER CERTIFICATE ... DROP PRIVATE KEY
ist der private Schlüssel nicht mehr vorhanden, wenn Sie ihn nicht zuerst mit BACKUP CERTIFICATE in einer Datei gesichert haben . Der öffentliche Schlüssel ist jedoch noch vorhandensys.certificates
. Und der öffentliche Schlüssel benötigt kein Passwort. Nur die Verwendung des privaten Schlüssels zum Signieren eines Moduls erfordert das Kennwort (das auf allen Servern gleich ist, anders als beim Schutz über den Hauptschlüssel).