Jak utworzyć rolę serwera tylko do odczytu w SQL Server 2012?

15

Przy tworzeniu nowej roli serwera udzielam uprawnienia „Wyświetl dowolną bazę danych”, ale zdałem sobie sprawę, że to uprawnienie pozwala tylko użytkownikowi przeglądać systemowe bazy danych.

Próbuję utworzyć rolę serwera, która jest tylko do odczytu i może odczytać dowolną bazę danych.

Czy istnieje sposób utworzenia roli serwera zdefiniowanej przez użytkownika do odczytu baz danych użytkowników? Czy też muszę to zrobić poprzez mapowanie użytkowników na użytkownika?

joha
źródło

Odpowiedzi:

16

Opublikowanie tego jako odpowiedzi tylko dlatego, że jest on zbyt długi na komentarz i dlatego, że wkrótce będzie odpowiedni dla innych użytkowników.

SQL Server 2014 dodaje kilka nowych uprawnień na poziomie serwera, które pomogą dokładnie w tego rodzaju scenariuszu - zostały one zaprojektowane z myślą o inspekcji, ale ten typ wymagań wydaje się również pasować do tego rachunku. Możesz po prostu dodać następujące dwa uprawnienia do logowania na poziomie serwera:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

To pierwsze, jak się wydaje, pozwala logować się do połączenia z dowolną bazą danych. Zaletą tego jest to, że pozwoli na to nawet w bazach danych, które zostaną utworzone w przyszłości (pod warunkiem, że nie ustawisz jawnego odmowy, w ten sposób możesz chronić niektóre bazy danych użytkowników przed logowaniami, które mają to uprawnienie). Ten ostatni umożliwia logowanie do wykonywania operacji odczytu w dowolnej bazie danych, do której mają dostęp - więc mogą to robić SELECTz tabel, widoków, UDF itp., Ale nie będą w stanie wykonywać żadnych UPDATEoperacji (nie testowałem, czy to uprawnienie rozumie, kiedy procedura składowana wykonuje DML). Działają one świetnie w połączeniu, jeśli chcesz zapewnić dostęp do odczytu dla całego serwera z otwartym dostępem do odczytu lub, aby być bardziej szczegółowym, możesz przyznać tradycyjne CONNECTuprawnienia do niektórych baz danych, a SELECT ALL USER SECURABLESprawo to zapewnidziała tylko w tych bazach danych, do których login ma jawny dostęp.

W 2014 zmiany zabezpieczeń są udokumentowane tutaj - dobrze, częściowo; zapomnieli o pozwoleniu na poziomie bazy danych ALTER ANY DATABASE EVENT SESSION- choć tutaj nie ma to znaczenia.

Aaron Bertrand
źródło
Dzięki za tę rozszerzoną odpowiedź na nadchodzące serwery. Ponieważ ta operacja / kontrola odbywa się na poziomie serwera. Czy są jakieś uwagi na temat poziomu zgodności DB. Więc jeśli DB CL to 2012, czy funkcja 2014 nadal będzie działać?
SnapJag,
Poziom zgodności @SnapJag nie ma żadnego wpływu na funkcje bezpieczeństwa, chodzi głównie o to, jak T-SQL jest analizowany i jak optymalizator generuje plany zapytań.
Aaron Bertrand
@AaronBertrand Czy wiesz, czy istnieje uprawnienie, które możemy ustawić dla ról na poziomie serwera, aby umożliwić aktualizacje również w dowolnej bazie danych? (na pewno sysadmin może ustalić stałą rolę, ale czy możemy to zrobić dla roli serwera zdefiniowanej przez użytkownika?)
MaxiWheat 14.04.2016
@MaxiWheat Nie, nie mogę wymyślić żadnego trywialnego sposobu na zrobienie tego, przepraszam.
Aaron Bertrand
FWIW to nie zadziała dla bazy danych SQL Azure. GRANT PODŁĄCZ DOWOLNĄ BAZA DANYCH DO [NameOfUserOrGroup] Zabezpieczany „serwer” klasy nieobsługiwany w tej wersji programu SQL Server.
Dzejms
8

Nie ma uprawnień do odczytu bazy danych na poziomie serwera, a rolom na poziomie serwera nie można przyznać uprawnień na poziomie bazy danych

Tak, będziesz musiał mapować użytkowników do baz danych indywidualnie. Jeśli korzystasz z usługi Active Directory, możesz utworzyć grupę okien, a następnie dać tej grupie login do SQL Server, a następnie zastosować db_datareader we wszystkich bazach danych dla tej grupy (musisz jednak utworzyć użytkowników w każdej bazie danych).

Simon Righarts
źródło