Compartir a través de


Firmar procedimientos almacenados en SQL Server (ADO.NET)

Actualización: November 2007

A partir de SQL Server 2005, se puede firmar un procedimiento almacenado con un certificado o una clave asimétrica. Esto está diseñado para los casos en los que no se pueden heredar permisos mediante encadenamiento de propiedad o cuando la cadena de propiedad está rota, como en SQL dinámico. Entonces, se crea un usuario asignado al certificado, el cual concede permisos de usuario en los objetos a los que el procedimiento almacenado necesita tener acceso.

Cuando se ejecuta el procedimiento almacenado, SQL Server combina los permisos del usuario del certificado con los del llamador. A diferencia de la cláusula EXECUTE AS, aquí no cambia el contexto de ejecución del procedimiento. La funciones integradas que devuelven nombres de usuario e inicio de sesión devuelven el nombre del llamador, no el nombre de usuario del certificado.

Una firma digital es un resumen de datos cifrados con una clave privada del firmante. La clave privada garantiza que la firma digital sea única para su portador o propietario. Se pueden firmar procedimientos almacenados, funciones o desencadenadores.

Nota:

Se puede crear un certificado en la base de datos maestra para conceder permisos a nivel de servidor.

Crear certificados

Al firmar un procedimiento almacenado con un certificado, se crea mediante la clave privada un resumen de datos que consta de hash cifrado de código del procedimiento almacenado. En tiempo de ejecución, el resumen de datos se descifra con la clave pública y se compara con el valor hash del procedimiento almacenado. La modificación del procedimiento almacenado invalida el valor hash, de manera que la firma digital ya no coincide. Con ello, se evita que alguien que no tenga acceso a la clave privada pueda cambiar el código del procedimiento almacenado. Por lo tanto, deberá volver a firmar el procedimiento almacenado cada vez que lo modifique.

Son cuatro los pasos que implica la firma de un módulo:

  1. Crear un certificado mediante la instrucción Transact-SQL CREATE CERTIFICATE [certificateName]. Esta instrucción tiene varias opciones para establecer una fecha de inicio y finalización, así como una contraseña. La fecha de expiración predeterminada es un año

  2. Crear una base de datos asociada a un certificado utilizando la instrucción Transact-SQL CREATE USER [userName] FROM CERTIFICATE [certificateName]. Este usuario existe únicamente en la base de datos y no está asociado a un inicio de sesión.

  3. Conceder al usuario del certificado los permisos necesarios en los objetos de la base de datos.

Nota:

Un certificado no puede conceder permisos a un usuario que tiene permisos revocados con la instrucción DENY. DENY siempre tiene prioridad sobre GRANT, lo que evita que el llamador herede permisos concedidos al usuario del certificado.

  1. Firmar el procedimiento con el certificado utilizando la instrucción Transact-SQL ADD SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName].

Recursos externos

Para obtener más información, vea los siguientes recursos.

Recurso

Descripción

Module Signing en los Libros en pantalla de SQL Server 2008

Describe la firma de módulos, con un caso de ejemplo, y proporciona vínculos a los temas importantes de Transact-SQL.

Module Signing, en los Libros en pantalla de SQL Server 2005

Describe la firma de módulos, con un caso de ejemplo, y proporciona vínculos a los temas importantes de Transact-SQL.

Signing Stored Procedures with a Certificate, en los Libros en pantalla de SQL Server 2005

Proporciona un tutorial sobre la firma de procedimientos almacenados con un certificado.

Vea también

Conceptos

Escenarios de seguridad de aplicaciones en SQL Server (ADO.NET)

Administrar permisos con procedimientos almacenados en SQL Server (ADO.NET)

Escribir SQL dinámico seguro en SQL Server (ADO.NET)

Personalizar permisos con suplantación en SQL Server (ADO.NET)

Modificar datos con procedimientos almacenados (ADO.NET)

Otros recursos

Proteger aplicaciones de ADO.NET

Información general sobre seguridad de SQL Server (ADO.NET)