¿Cómo crear una función de servidor de solo lectura en SQL Server 2012?

15

Estoy otorgando el permiso "Ver cualquier base de datos" al crear una nueva función de servidor, pero me di cuenta de que este permiso solo permite al usuario ver las bases de datos del sistema.

Estoy tratando de crear una función de servidor que sea de solo lectura y pueda leer cualquier base de datos.

¿Hay alguna manera de crear un rol de servidor definido por el usuario para leer las bases de datos de los usuarios? ¿O tengo que hacer esto a través de la asignación de usuarios por usuario?

joha
fuente

Respuestas:

16

Publicar esto como una respuesta solo porque es demasiado largo para un comentario, y porque será relevante para otros usuarios muy pronto.

SQL Server 2014 agrega algunos nuevos permisos a nivel de servidor que ayudarán con exactamente este tipo de escenario: se diseñaron teniendo en cuenta la auditoría, pero este tipo de requisito también parece ajustarse a esa factura. Simplemente puede agregar los siguientes dos permisos a un inicio de sesión a nivel de servidor:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

El primero, como parece, permite que el inicio de sesión se conecte a cualquier base de datos. Lo bueno de esto es que lo permitirá incluso para las bases de datos que se creen en el futuro (siempre que no configure la denegación explícita, que es cómo puede proteger ciertas bases de datos de usuarios de inicios de sesión que tienen este permiso). Este último permite que el inicio de sesión realice operaciones de lectura en cualquier base de datos a la que tengan acceso, por lo que pueden hacerlo SELECTdesde tablas, vistas, UDF, etc., pero no podrán realizar ninguna UPDATEoperación (no he probado si este permiso comprende cuándo un procedimiento almacenado realiza DML). Estos funcionan muy bien en combinación si desea otorgar un acceso de lectura abierto de inicio de sesión a todo el servidor o, para ser más específicos, puede otorgar CONNECTprivilegios tradicionales a ciertas bases de datos, y el SELECT ALL USER SECURABLESderechosolo funciona para aquellas bases de datos donde el inicio de sesión tiene acceso explícito.

Los cambios de seguridad de 2014 están documentados aquí , bueno, parcialmente; se olvidaron del permiso de nivel de base de datos ALTER ANY DATABASE EVENT SESSION, aunque eso no es relevante aquí.

Aaron Bertrand
fuente
Gracias por esta respuesta extendida para los próximos servidores. Siendo que esta operación / verificación está en el nivel del servidor. ¿Hay algún comentario sobre si el nivel de compatibilidad de la base de datos? Entonces, si el DB CL es 2012, ¿funcionará la función 2014?
SnapJag
El nivel de compatibilidad de @SnapJag no tiene ninguna relación con las características de seguridad, se trata principalmente de cómo se analiza T-SQL y cómo el optimizador genera planes de consulta.
Aaron Bertrand
@AaronBertrand ¿Sabe si hay un permiso que podamos establecer en roles a nivel de servidor para permitir actualizaciones en cualquier base de datos también? (El rol fijo de sysadmin puede ser seguro, pero ¿podemos hacerlo para un rol de servidor definido por el usuario?)
MaxiWheat
@MaxiWheat No, no se me ocurre ninguna forma trivial de hacerlo, lo siento.
Aaron Bertrand
FWIW esto no funcionará para Azure SQL Database. OTORGAR CONECTE CUALQUIER BASE DE DATOS A [NameOfUserOrGroup] La clase asegurable 'servidor' no es compatible con esta versión de SQL Server.
Dzejms
8

No existe un permiso de 'leer ninguna base de datos' a nivel de servidor y no se pueden otorgar permisos a nivel de base de datos a los roles de nivel de servidor

Entonces sí, tendrá que asignar usuarios a las bases de datos individualmente. Si está utilizando Active Directory, puede crear un grupo de Windows, luego iniciar sesión en ese servidor en SQL Server, luego aplicar db_datareader en todas las bases de datos para ese grupo (sin embargo, deberá crear usuarios en cada base de datos).

Simon Righarts
fuente