Creé la vista en la base de datos1 basada en tablas en la base de datos2. Le di SELECT
permiso a un usuario que solo tiene acceso a la base de datos1. El usuario no puede hacer que esta vista funcione porque no tiene una cuenta en la base de datos2. ¿Cómo puedo resolver este problema? No quiero crear una cuenta en la base de datos2.
10
TRUSTWORTHY ON
o hacer que la aplicación inicie sesión comosa
. DB Ownership Chaining yTRUSTWORTHY
existen principalmente debido a que son la única solución en ese momento. Pero ahora, incluso si no es un gran riesgo, DB Chaining es ciertamente un riesgo innecesario ya que la firma de módulos no es tan difícil. Y si uno se basa en el encadenamiento de la base de datos y luego usa SQL dinámico, es más probable que lo configurenTRUSTWORTHY ON
para solucionarlo, mientras que con la firma del módulo no se hubiera roto.DB_CHAINING
no es más arriesgado que el encadenamiento de propiedad dentro de la base de datos cuando los objetos deberían haber estado en la misma base de datos de todos modos.DB_CHAINING
es bastante arriesgado.Respuestas:
Esto es fácil de lograr de una manera muy segura usando la firma de módulos. Esto será similar a las siguientes dos respuestas mías, también aquí en DBA.StackExchange, que dan ejemplos de hacer exactamente esto:
Seguridad de procedimientos almacenados con ejecución como, consultas cruzadas de bases de datos y firma de módulos
Permisos en disparadores cuando se usan certificados de bases de datos cruzadas
La diferencia para esta pregunta en particular es que trata con una Vista, y las Vistas no se pueden firmar. Por lo tanto, deberá cambiar la Vista a una Función de valor de tabla de varias instrucciones (TVF), ya que se puede firmar y acceder a ellos como una Vista (bueno, para
SELECT
acceder).El siguiente código de ejemplo muestra cómo hacer exactamente lo que se solicita en la pregunta, ya que el "Usuario restringido" de inicio de sesión / Usuario solo tiene acceso a "Base de datos A" y aún puede obtener datos de "Base de datos B". Esto funciona solo seleccionando de este TVF , y solo debido a que está firmado.
Lograr este tipo de acceso a la base de datos cruzada mientras se sigue utilizando una Vista, y sin otorgarle al Usuario ningún permiso adicional, requeriría habilitar el Encadenamiento de propiedad de la base de datos cruzada. Eso es mucho menos seguro porque es completamente abierto para todos los objetos entre ambas bases de datos (no se puede restringir a ciertos objetos y / o usuarios). La firma de módulos permite que solo este TVF tenga acceso cruzado a la base de datos (el usuario no tiene el permiso, el TVF sí), y los usuarios que no pueden
SELECT
desde el TVF no tienen acceso a la "Base de datos B".Todos los pasos anteriores recrean la situación actual: el usuario tiene acceso a la base de datos A, tiene permiso para interactuar con un objeto en la base de datos A, pero obtiene un error debido a que ese objeto en la base de datos A accede a algo en la base de datos B donde el usuario no tiene ningún acceso.
Los siguientes pasos configuran el canto del módulo. Hace lo siguiente:
SELECT
permiso a la tabla en la base de datos B al usuario basado en certificadoConfiguración de firma del módulo:
SI EL ACCESO DEBE SER A TRAVÉS DE UNA VISTA, por cualquier razón, simplemente puede crear una Vista que seleccione desde el TVF que se muestra arriba. Y, en esa situación,
SELECT
no es necesario otorgar acceso al TVF, solo a la Vista, como se demuestra a continuación:Y ahora para probarlo:
Para obtener más información sobre la firma de módulos, visite: https://ModuleSigning.Info/
fuente
ALTER CERTIFICATE ... DROP PRIVATE KEY
, la clave privada desaparecería si no la respaldara primero en un archivo usando BACKUP CERTIFICATE . Pero, la clave pública todavía está ensys.certificates
. Y la clave pública no necesita la contraseña. Solo el uso de la clave privada para firmar un módulo requiere la contraseña (que es la misma en todos los servidores, a diferencia de cuando se protege mediante una clave maestra).