Wie erstelle ich eine schreibgeschützte Serverrolle in SQL Server 2012?

15

Ich erteile die Berechtigung "Alle Datenbanken anzeigen" beim Erstellen einer neuen Serverrolle, habe jedoch festgestellt, dass diese Berechtigung nur dem Benutzer das Anzeigen der Systemdatenbanken ermöglicht.

Ich versuche, eine Serverrolle zu erstellen, die schreibgeschützt ist und jede Datenbank lesen kann.

Gibt es eine Möglichkeit, eine benutzerdefinierte Serverrolle zum Lesen von Benutzerdatenbanken zu erstellen? Oder muss ich dies durch Benutzerzuordnung pro Benutzer tun?

joha
quelle

Antworten:

16

Dies als Antwort zu posten, nur weil es zu lang für einen Kommentar ist und weil es bald für andere Benutzer relevant sein wird.

SQL Server 2014 fügt einige neue Berechtigungen auf Serverebene hinzu, die genau diese Art von Szenario unterstützen. Sie wurden unter Berücksichtigung der Überwachung entwickelt, aber diese Art von Anforderung scheint auch für diese Rechnung geeignet zu sein. Sie können einem Login auf Serverebene einfach die folgenden zwei Berechtigungen hinzufügen:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Ersteres ermöglicht dem Login, wie es sich anhört, eine Verbindung zu einer beliebigen Datenbank herzustellen. Das Schöne daran ist, dass dies auch für Datenbanken möglich ist, die in Zukunft erstellt werden (vorausgesetzt, Sie legen keine explizite Ablehnung fest, wodurch Sie bestimmte Benutzerdatenbanken vor Anmeldungen mit dieser Berechtigung schützen können). Letzteres ermöglicht dem Login, Lesevorgänge für jede Datenbank auszuführen, auf die er Zugriff hat - also für SELECTTabellen, Ansichten, UDFs usw., aber sie können keine UPDATEVorgänge ausführen (ich habe nicht getestet, ob diese Berechtigung versteht, wann a gespeicherte Prozedur führt DML durch). Diese funktionieren in Kombination hervorragend, wenn Sie einem Login einen offenen Lesezugriff auf den gesamten Server gewähren möchten, oder wenn Sie differenzierter vorgehen möchten, können Sie CONNECTbestimmten Datenbanken herkömmliche Berechtigungen gewähren , und das SELECT ALL USER SECURABLESwird auch der Fall seinFunktioniert nur für Datenbanken, auf die der Login explizit Zugriff hat.

Die Sicherheitsänderungen von 2014 werden hier dokumentiert - nun, teilweise; Sie haben die Berechtigung auf Datenbankebene vergessen ALTER ANY DATABASE EVENT SESSION- obwohl dies hier nicht relevant ist.

Aaron Bertrand
quelle
Vielen Dank für diese erweiterte Antwort für die nächsten Server. Da diese Operation / Prüfung auf Serverebene stattfindet. Gibt es irgendwelche Kommentare zu der DB-Kompatibilitätsstufe. Wenn der DB CL also 2012 ist, funktioniert die 2014-Funktion dann noch?
SnapJag
Die Kompatibilitätsstufe von @SnapJag hat keinen Einfluss auf die Sicherheitsfunktionen. Hauptsächlich geht es darum, wie T-SQL analysiert wird und wie das Optimierungsprogramm Abfragepläne generiert.
Aaron Bertrand
@AaronBertrand Wissen Sie, ob es eine Berechtigung gibt, die wir für Rollen auf Serverebene festlegen können, um auch Aktualisierungen für jede Datenbank zuzulassen? (Sysadmin feste Rolle kann sicher, aber können wir es für eine benutzerdefinierte Serverrolle tun?)
MaxiWheat
@MaxiWheat Nein, ich kann mir keine triviale Möglichkeit vorstellen, das zu tun.
Aaron Bertrand
FWIW funktioniert dies nicht für Azure SQL-Datenbanken. GRANT CONNECT ANY DATABASE TO [NameOfUserOrGroup] Die sicherungsfähige Klasse 'Server' wird in dieser Version von SQL Server nicht unterstützt.
Dzejms
8

Es gibt keine Berechtigung zum Lesen einer Datenbank auf Serverebene, und Rollen auf Serverebene können keine Berechtigungen auf Datenbankebene erhalten

Ja, Sie müssen die Benutzer den Datenbanken einzeln zuordnen. Wenn Sie Active Directory verwenden, können Sie eine Windows-Gruppe erstellen, diese Gruppe bei SQL Server anmelden und dann db_datareader in allen Datenbanken für diese Gruppe anwenden (Sie müssen jedoch Benutzer in jeder Datenbank erstellen).

Simon Righarts
quelle