Estoy buscando la mejor manera de deshabilitar el acceso al sys.tables
/ Information Schema
para un usuario / grupo en SQL Server.
Encontré este hilo de 2008
Muestra una forma de denegar el acceso de esta [sys].[something]
manera:
DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
GO
Pero no hay forma de cómo deshabilitar el acceso en Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Esto parece no funcionar.
¿Cómo puedo deshabilitar el acceso a información_esquema?
¿Y hay una manera más fácil de deshabilitar el acceso a todos sys
/ information_schema
?
Actualización: en realidad no puedo ejecutar las dos siguientes afirmaciones:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
Traté de ejecutarlos en la base de datos específica donde existe el usuario, y también probé en el "maestro".
Todavía puedo correr:
SELECT * from
INFORMATION_SCHEMA.TABLES
-> todavía devuelve resultados
SELECT * from
sys.TABLES
-> ya no hay resultados
La inclusión SCHEMA::
en la consulta hizo posible crear los asegurables
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
Pero ahora todavía puedo seleccionar toda la información de la base de datos.
Eché un vistazo a la pestaña "Securables" en la ventana de propiedades de los usuarios en Management Studio 2008, se ve así:
Entrada que bloquea la selección de sys.tables
Esquema: sys, Nombre: tablas, Tipo: Vista
Permisos para sys.tables: Permiso: Seleccionar, Concedente: dbo, Denegar está marcado
Entrada que no bloquea ninguna selección
Esquema :, Nombre: INFORMATION_SCHEMA, Tipo: Esquema
Permisos para INFORMATION_SCHEMA: Permiso: Seleccionar, Concedente: dbo, Denegar NO está marcado (Traté de verificarlo, pero no hay posibilidad ...)
Permiso: Seleccionar, Concedente: INFORMATION_SCHEMA, Denegar está marcado
Intenté establecer los permisos a través de la GUI, pero luego recibí el mismo error de que establecer permisos solo sería posible en la base de datos maestra. Pero no tengo el usuario / inicio de sesión agregado a la seguridad de las bases de datos maestras.
Solución:
La única forma en que podía hacer el deny
trabajo para el information_schema
era agregar el usuario al master-db y ejecutar el deny select
en el maestro:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
Y como en este código, solo se puede ejecutar para tablas individuales.
Respuestas:
Debería poder denegar los permisos en todo el esquema
sys
yinformation_schema
en su conjunto:Básicamente, eso debería evitar que ese usuario realice selecciones en esos dos esquemas.
fuente
En primer lugar, tiene razón en que la forma (ligeramente contraintuitiva) de evitar el acceso a los esquemas [sys] y [INFORMATION_SCHEMA] es primero asegurarse de que el inicio de sesión (bueno, principal a nivel de servidor) exista como usuario (erm, principal de nivel de base de datos) en la base de datos maestra.
Suponga que tiene un inicio de sesión SQL para simplificar:
Ahora cree un usuario correspondiente en la base de datos maestra:
Ahora desea evitar que este inicio de sesión acceda a cualquiera de las tablas en los esquemas proporcionados por el sistema: [sys] y [INFORMATION_SCHEMA].
Parece que hubo un cambio de comportamiento entre SQL Server 2008 R2 y SQL Server 2012:
En SQL Server 2012 (y presumiblemente versiones posteriores), ejecutar lo siguiente en la base de datos [maestra] hace lo que cabría esperar:
Sin embargo, en SQL Server 2008 R2 (y presumiblemente versiones anteriores), las declaraciones de concesión de acciones que dan acceso a los objetos en estos esquemas a miembros de [public] parecen anular las declaraciones DENY anteriores, lo que me parece un gran montón de fallas. Por lo tanto, en 2008 R2 necesita NEGAR explícitamente para cada CONCESIÓN a [público]. Aquí hay un script para hacer eso:
Ejecute lo anterior en la base de datos maestra y habrá eliminado el acceso al contenido de esos esquemas.
Notas:
Si comenta las siguientes dos líneas en el script anterior:
Tendrá el efecto de deshacer TODAS las CONCESIONES predeterminadas para público. Esto impedirá el acceso a, por ejemplo, sys.sp_tables y, por lo tanto, interrumpirá, por ejemplo, la capacidad de Microsoft Access de enumerar las tablas, pero es útil en escenarios de alta seguridad para hacer esto, de modo que los usuarios obtengan acceso solo donde se haya otorgado explícitamente eso.
fuente
No estoy seguro de cuándo estuvo disponible este truco, ya que nadie lo ha mencionado, pero parece que funciona al menos desde SQL Server 2008.
Lo anterior funciona sin tener que agregar al usuario a la
master
base de datos como se menciona en algunas de las otras respuestas.fuente