SEGURIDAD Y PROTECCION DE UN MOTOR DE BASE DE DATOS Motor de base de datos de SQL Server SQL Server 2008 El siguiente aporte se construyó con la finalidad de ayudar a todas las personas que deseen aprender SEGURIDAD Y PROTECCION DE UN MOTOR DE BASE DE DATOS en SQL ya que no encontré navegando algo que me convenciera espero que les ayude si hay sugerencias escribirme que no tengo duda de poder resolverlo. Se tratara los siguientes puntos: Seguridad Amenazas Vulnerabilidad Identidad y control de acceso Implementación segura El Motor de base de datos es el servicio principal para almacenar, procesar y proteger datos. El Motor de base de datos proporciona acceso controlado y procesamiento de transacciones rápido para cumplir con los requisitos de las aplicaciones consumidoras de datos más exigentes de su empresa. Use Motor de base de datos para crear bases de datos relacionales para el procesamiento de transacciones en línea o datos de procesamiento analítico en línea. Esto incluye la creación de tablas para almacenar datos y objetos de base de datos (p.ej., índices, vistas y procedimientos almacenados) para ver, administrar y proteger datos. Puede usar SQL Server Management Studio para administrar los objetos de bases de datos y SQL Server Profiler para capturar eventos de servidor. Información general sobre seguridad 3.- Mitigación de amenazas y vulnerabilidades (motor de base de datos) Aunque SQL Server incluye varios mecanismos de seguridad, todo sistema tiene características que se podrían aprovechar con fines malintencionados. Esta página contiene vínculos que le ayudarán a encontrar la información que necesita en relación con las amenazas y vulnerabilidades en SQL Server Database Engine (Motor de base de datos de SQL Server) y cómo puede eliminarlas. Matriz de amenazas y vulnerabilidad (motor de base de datos) Aunque SQL Server incluye varios mecanismos de seguridad, todo sistema tiene características que se podrían aprovechar con fines malintencionados. Cualquier característica que exponga datos u otra información puede constituir un riesgo si se implementa incorrectamente. Aunque cualquier característica podría representar un riesgo, no todos los riesgos son iguales. Algunos requieren un cambio de procedimiento, otros de configuración y algunos de código. En las tablas siguientes se explican los riesgos y los pasos proactivos que se pueden dar para disminuirlos. Amenazas y vulnerabilidades de los procesos Amenaza o Definición vulnerabilidad Una directiva de seguridad es un registro de los procesos y Directivas de procedimientos que debe seguir una seguridad organización para evitar, realizar un seguimiento y responder a las Mitigación Cree, revise, distribuya y mantenga una directiva de seguridad efectiva. Para obtener más información acerca de cómo crear una directiva de seguridad, vea Proteger SQL Principio de "privilegios mínimos" Boletines de seguridad amenazas de seguridad. Contiene directivas relacionadas con el acceso adecuado a los sistemas, la aplicación de revisiones y los firewalls, así como mecanismos de prevención antivirus. Según el principio de "privilegios mínimos", un sistema sólo debería permitir el nivel de acceso necesario a un objeto protegible. Además, el acceso sólo debería estar habilitado para quienes tienen una necesidad directa y sólo durante un tiempo especificado. Las aplicaciones pueden estar codificadas para proporcionar más acceso del necesario y las cuentas podrían tener demasiado acceso. Microsoft publica información de seguridad tan pronto como se comprueba y se prueba en distintas plataformas. Las organizaciones que no están al corriente de estos boletines ponen en peligro sus sistemas al no implementar las instrucciones de seguridad adecuadas. Server. Revise e implemente la seguridad de acuerdo con el principio de privilegios mínimos. Para obtener más información sobre cómo desarrollar aplicaciones que utilizan los conceptos de privilegios mínimos, vea el tema relativo a procedimientos recomendados en un entorno con privilegios mínimos en MSDN. Revise y haga un seguimiento de los boletines de seguridad de SQL Server. Para obtener más información, vea la búsqueda de boletines de seguridad de Microsoft en TechNet. Amenazas y vulnerabilidades de la plataforma Amenaza o vulnerabilidad El sistema no está actualizado (no se han aplicado las actualizaciones de software) Vulnerabilidades de seguridad de los puertos de red Definición Microsoft publica actualizaciones de software para mejorar la seguridad de SQL Server. Si no se siguen o se aplican estas actualizaciones de software, el sistema será más vulnerable a los ataques. La red es la principal vía de acceso para los ataques contra SQL Server. Si los Mitigación Revise y aplique todos los Service Packs y todas las revisiones en cuanto estén disponibles. Para obtener más información, consulte la página de descargas en SQL Server TechCenter. Utilice un firewall en el servidor si está expuesto a Internet y utilice la herramienta Administrador de puertos estándar están abiertos a Internet, se favorecerán los ataques. Configuración incorrecta de las cuentas de servicio Área expuesta demasiado grande Procedimientos almacenados innecesarios habilitados configuración de SQL Server para establecer la configuración de la red. Considere también la posibilidad de utilizar SSL (Capa de sockets seguros) para aumentar aún más la seguridad. Para obtener más información acerca de los firewalls y SQL Server, vea Cómo configurar Firewall de Windows para el acceso al motor de base de datos. Para obtener más información acerca de cómo cambiar la configuración de la red, vea Administrador de configuración de SQL Server. Para obtener más información acerca de cómo utilizar SSL en SQL Server, vea Cifrar conexiones a SQL Server. Las cuentas de servicio de SQL Server deberían funcionar bajo el principio de privilegios mínimos y deberían tener Las cuentas de servicio de contraseñas seguras. Para obtener más SQL Server suelen tener más información acerca de las cuentas de acceso a la plataforma o a la servicio, vea Configurar cuentas de red del que necesitan. servicio de Windows. Para obtener más información acerca de las contraseñas, vea Contraseñas seguras. Use el Administrador de configuración de SQL Server y la Administración Las características y basada en directiva para controlar las capacidades de SQL Server características y los demás pueden estar expuestas componentes. Para obtener más cuando no es necesario. información, vea Descripción de la configuración del área expuesta. No habilite los procedimientos Algunos procedimientos almacenados que permiten el acceso al almacenados extendidos sistema operativo o al registro si no es permiten el acceso al sistema completamente necesario. Para obtener operativo o al registro. más información, vea Descripción de la configuración del área expuesta. Amenazas y vulnerabilidades de autenticación Amenaza o Definición Mitigación vulnerabilidad Utilice siempre contraseñas seguras y complejas. Para obtener más información, Las contraseñas sencillas vea Contraseñas seguras. También vea las Contraseñas no están expuestas a los ataques opciones CHECK_POLICY y seguras por fuerza bruta o de CHECK_EXPIRATION en las diccionario. instrucciones CREATE LOGIN (TransactSQL) y ALTER LOGIN (Transact-SQL). Los usuarios (entidades de seguridad) a menudo Las cuentas de usuario se deberían auditar cambian de puesto o dejan la con frecuencia para asegurarse de que se Cuentas de organización. Si no se tiene habilitado el acceso adecuado a los usuario sin cambia el acceso a una servidores y los objetos de las bases de auditar cuenta de usuario, se puede datos. Para obtener más información acerca seguir teniendo acceso al de cómo auditar el acceso a SQL Server, vea sistema con el nivel de Supervisar los registros de errores. permisos anterior. Amenazas y vulnerabilidades de programación Amenaza o vulnerabilidad Inyección de código SQL Contraseñas incrustadas Definición Mitigación Para obtener más información acerca de Consiste en incrustar una cómo actuar ante los ataques por inyección consulta malintencionada en de código SQL, vea Inyección de código una legítima. SQL. No guarde las contraseñas ni la Algunas aplicaciones guardan información confidencial de conexión en las cadenas de conexión en el un programa, en el registro ni en un programa o en archivos de archivo de configuración. Para obtener configuración. más información, vea Directiva de contraseñas. Amenazas y vulnerabilidades de acceso a los datos Amenaza o vulnerabilidad Definición Mitigación El cifrado ofusca los datos o la Conozca e implemente correctamente Cifrado aplicado información de conexión en SQL el cifrado en SQL Server. Para incorrectamente Server. No cifrar los datos cuando obtener más información, vea Cifrado Certificados aplicados incorrectamente es necesario o hacerlo cuando no lo es, supone un riesgo y una complejidad innecesarios. Los certificados son un mecanismo para comprobar la autenticación. SQL Server puede utilizar los certificados para diversos propósitos, desde las conexiones a los datos. El uso inadecuado de los certificados autofirmados y los períodos de validación extendidos reducen la eficacia de la seguridad global. de SQL Server. Conozca e implemente correctamente los certificados de SQL Server. Para obtener más información, vea Certificados y claves asimétricas de SQL Server. Se deberían hacer copias de seguridad de las claves del servidor (también Una instancia de SQL Server y las conocidas como claves maestras de bases de datos que contiene servicio) y de las claves de las bases Claves de SQL pueden tener claves que se de datos, y guardarlas en lugar Server sin copias utilizan para distintos propósitos seguro. También se deberían cambiar de seguridad de seguridad. Esto incluye el periódicamente. Para obtener más cifrado. información, vea SQL Server y claves de cifrado de base de datos (motor de base de datos). Inyección de código SQL La inyección de código SQL es un ataque en el cual se inserta código malicioso en las cadenas que posteriormente se pasan a una instancia de SQL Server para su análisis y ejecución. Todos los procedimientos que generan instrucciones SQL deben revisarse en busca de vulnerabilidades de inyección de código, ya que SQL Server ejecutará todas las consultas recibidas que sean válidas desde el punto de vista sintáctico. Un atacante cualificado y con determinación puede manipular incluso os datos con parámetros. La forma principal de inyección de código SQL consiste en la inserción directa de código en variables especificadas por el usuario que se concatenan con comandos SQL y se ejecutan. Existe un ataque menos directo que inyecta código dañino en cadenas que están destinadas a almacenarse en una tabla o como metadatos. Cuando las cadenas almacenadas se concatenan posteriormente en un comando SQL dinámico, se ejecuta el código dañino. El proceso de inyección consiste en finalizar prematuramente una cadena de texto y anexar un nuevo comando. Como el comando insertado puede contener cadenas adicionales que se hayan anexado al mismo antes de su ejecución, el atacante pone fin a la cadena inyectada con una marca de comentario "--". El texto situado a continuación se omite en tiempo de ejecución. En el siguiente script se muestra una sencilla inyección de código SQL. El script crea una consulta SQL concatenando cadenas no modificables con una cadena especificada por el usuario: var Shipcity; ShipCity = Request.form ("ShipCity"); var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'"; Se le pide al usuario que escriba el nombre de una ciudad. Si el usuario especifica Redmond, la consulta ensamblada por el script presenta un aspecto similar al siguiente: SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond' Sin embargo, suponga que el usuario especificase lo siguiente: Redmond'; drop table OrdersTable-En este caso, la siguiente consulta la ensambla el script: SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond';drop table OrdersTable--' El punto y coma (;) denota el final de una consulta y el principio de otra. El guión doble (--) indica que el resto de la línea actual es un comentario y debe omitirse. Si el código modificado es sintácticamente correcto, el servidor lo ejecutará. Cuando SQL Server procese esta instrucción, SQL Server seleccionará en primer lugar todos los registros de OrdersTable donde ShipCity sea Redmond. A continuación, SQL Server quitará OrdersTable. Siempre y cuando el código SQL inyectado sea sintácticamente correcto, no será posible detectar alteraciones mediante programación. Por ello, debe validar todos los datos especificados por el usuario y revisar cuidadosamente el código que ejecute comandos SQL construidos en el servidor que utilice. Las prácticas recomendadas de codificación se describen en las siguientes secciones de este tema. 4.- Identidad y control de acceso (motor de base de datos) SQL Server incluye varios métodos y herramientas que permiten configurar la seguridad para que los usuarios, los servicios y las otras cuentas puedan tener acceso al sistema. Esta página contiene vínculos que le ayudarán a encontrar la información que necesita para trabajar con entidades de seguridad (usuarios y cuentas de inicio de sesión), funciones (grupos de entidades de seguridad), objetos que pueden protegerse (protegibles) y permisos. Entidades de seguridad (motor de base de datos) Las entidades de seguridad son entidades que pueden solicitar recursos de SQL Server. Igual que otros componentes del modelo de autorización de SQL Server, las entidades de seguridad se pueden organizar en jerarquías. El ámbito de influencia de una entidad de seguridad depende del ámbito de su definición: Windows, servidor o base de datos; y de si la entidad de seguridad es indivisible o es una colección. Un Inicio de sesión de Windows es un ejemplo de entidad de seguridad indivisible y un Grupo de Windows es un ejemplo de una del tipo colección. Toda entidad de seguridad tiene un identificador de seguridad (SID). Entidades de seguridad a nivel de Windows Inicio de sesión del dominio de Windows Inicio de sesión local de Windows Entidad de seguridad deSQL Server Inicio de sesión de SQL Server Entidades de seguridad a nivel de bases de datos Usuario de base de datos Función de base de datos Función de aplicación Inicio de sesión sa de SQL Server El inicio de sesión sa de SQL Server es una entidad de seguridad del servidor. Se crea de forma predeterminada cuando se instala una instancia. En SQL Server 2005 y SQL Server 2008, la base de datos predeterminada de sa es master. Es un cambio de comportamiento con respecto a versiones anteriores de SQL Server. Función public de base de datos Todos los usuarios de una base de datos pertenecen a la función public de la base de datos. Cuando a un usuario no se le han concedido ni denegado permisos de un elemento que puede protegerse, el usuario hereda los permisos de ese elemento concedidos a public. INFORMATION_SCHEMA y sys Todas las bases de datos incluyen dos entidades que aparecen como usuarios en las vistas de catálogo: INFORMATION_SCHEMA y sys. SQL Server necesita estas dos entidades. No son entidades de seguridad y no se pueden modificar ni quitar. Inicios de sesión de SQL Server basados en certificados Las entidades de seguridad de servidor con nombres incluidos entre signos de número dobles (##) son exclusivamente para uso interno del sistema. Las siguientes entidades de seguridad se crean a partir de certificados cuando se instala SQL Server y no deben eliminarse. • • • • • • • ##MS_SQLResourceSigningCertificate## ##MS_SQLReplicationSigningCertificate## ##MS_SQLAuthenticatorCertificate## ##MS_AgentSigningCertificate## ##MS_PolicyEventProcessingLogin## ##MS_PolicySigningCertificate## ##MS_PolicyTsqlExecutionLogin## Cliente y servidor de base de datos Por definición, un cliente y un servidor de base de datos son entidades de seguridad y se pueden proteger. Estas entidades se pueden autenticar mutuamente antes de establecer una conexión de red segura. SQL Server admite el protocolo de autenticación Kerberos, que define cómo interactúan los clientes con un servicio de autenticación de red. Para obtener más información acerca de la implementación en SQL Server de la compatibilidad con Kerberos, vea Autenticación Kerberos y SQL Server. Funciones de nivel de servidor Para administrar con facilidad los permisos en el servidor, SQL Server proporciona varias funciones, que son entidades de seguridad que agrupan a otras entidades de seguridad. Las funciones son como los grupos del sistema operativo Microsoft Windows. Las funciones fijas de servidor se proporcionan por comodidad y por motivos de compatibilidad con versiones anteriores. Se recomienda asignar permisos más concretos siempre que sea posible. Las funciones de nivel de servidor también se denominan funciones fijas de servidor porque no se pueden crear nuevas funciones de nivel de servidor. Las funciones de nivel de servidor se aplican a todo el servidor en lo que respecta a su ámbito de permisos. Puede agregar inicios de sesión de SQL Server, cuentas de Windows y grupos de Windows a las funciones de nivel de servidor. Cada miembro de una función fija de servidor puede agregar otros inicios de sesión a esa misma función. En la tabla siguiente se muestran las funciones de nivel de servidor y sus capacidades. Nombre de la función de nivel de servidor Descripción sysadmin Los miembros de la función fija de servidor sysadmin pueden realizar cualquier actividad en el servidor. serveradmin Los miembros de la función fija de servidor serveradmin pueden cambiar las opciones de configuración en el servidor y cerrar el servidor. securityadmin Los miembros de la función fija de servidor securityadmin administran los inicios de sesión y sus propiedades. Administran los permisos de servidor GRANT, DENY y REVOKE. También administran los permisos de base de datos GRANT, DENY y REVOKE. Asimismo, pueden restablecer contraseñas para inicios de sesión de SQL Server. Nota de seguridad La capacidad de conceder acceso al Database Engine (Motor de base de datos) y configurar permisos de usuario permite a la administración de seguridad asignar la mayoría de los permisos de servidor. La función securityadmin se debe tratar como equivalente a la función sysadmin. processadmin Los miembros de la función fija de servidor processadmin pueden finalizar los procesos que se ejecutan en una instancia de SQL Server. Setupadmin Los miembros de la función fija de servidor setupadmin pueden agregar y quitar los servidores vinculados. Bulkadmin Los miembros de la función fija de servidor bulkadmin pueden ejecutar la instrucción BULK INSERT. Diskadmin La función fija de servidor diskadmin se utiliza para administrar archivos de disco. Dbcreator Los miembros de la función fija de servidor dbcreator pueden crear, modificar, quitar y restaurar cualquier base de datos. public Cada inicio de sesión de SQL Server pertenece a la función de servidor public. Cuando a una entidad de seguridad de servidor no se le han concedido ni denegado permisos específicos en un objeto que puede protegerse, el usuario hereda los permisos concedidos a la función public en ese objeto. Asigne solamente permisos públicos en cualquier objeto cuando desee que el objeto esté disponible para todos los usuarios. Para obtener información específica sobre los permisos de las funciones de nivel de servidor, vea Permisos de las funciones fijas de servidor (motor de base de datos). Trabajar con funciones de nivel de servidor En la tabla siguiente se explican los comandos, las vistas y las funciones que se utilizan para trabajar con funciones de nivel de servidor. Característica Tipo sp_helpsrvrole (Transact-SQL) Metadatos Descripción Devuelve una lista de funciones de nivel de sp_helpsrvrolemember (Transact-SQL) Metadatos sp_srvrolepermission (Transact-SQL) Metadatos IS_SRVROLEMEMBER (Transact-SQL) Metadatos sys.server_role_members (Transact-SQL) sp_addsrvrolemember (Transact-SQL) sp_dropsrvrolemember (Transact-SQL) Metadatos Comando Comando servidor. Devuelve información acerca de los miembros de una función de nivel de servidor. Muestra los permisos de una función de nivel de servidor. Indica si un inicio de sesión de SQL Server es miembro de la función de nivel de servidor especificada. Devuelve una fila por cada miembro de cada función de nivel de servidor. Agrega un inicio de sesión como miembro de una función de nivel de servidor. Quita un inicio de sesión de SQL Server o un usuario o grupo de Windows de una función de nivel de servidor. Funciones en el nivel de base de datos Para administrar con facilidad los permisos en las bases de datos, SQL Server proporciona varias funciones, que son las entidades de seguridad que agrupan a otras entidades de seguridad. Son como los grupos del sistema operativo Microsoft Windows. Las funciones del nivel de base de datos se aplican a toda la base de datos en lo que respecta a su ámbito de permisos. Existen dos tipos de funciones de nivel de base de datos en SQL Server: las funciones fijas de base de datos, que están predefinidas en la base de datos, y las funciones flexibles de base de datos, que pueden crearse. Las funciones de base de datos fijas se definen en el nivel de base de datos y existen en cada una de ellas. Los miembros de las funciones de base de datos db_owner y db_securityadmin pueden administrar los miembros de las funciones de base de datos fijas. Sin embargo, sólo los miembros de la función de base de datos db_owner pueden agregar miembros a la función de base de datos fija db_owner. Hay también algunas funciones fijas de base de datos con fines especiales en la base de datos msdb. Puede agregar cualquier cuenta de la base de datos y otras funciones de SQL Server a las funciones del nivel de base de datos. Cada miembro de una función de base de datos fija puede agregar otros inicios de sesión a esa misma función. Importante No agregue funciones flexibles de la base de datos como miembros de funciones fijas. Esto podría habilitar un aumento de privilegios no deseado. En la tabla siguiente se muestran las funciones fijas del nivel de base de datos y sus capacidades. Estas funciones existen en todas las bases de datos. Nombre de función de nivel de base de datos Descripción db_owner Los miembros de la función de base de datos fija db_owner pueden realizar todas las actividades de configuración y mantenimiento en la base de datos y también pueden quitar la base de datos. db_securityadmin Los miembros de la función de base de datos fija db_securityadmin pueden modificar la pertenencia a funciones y administrar permisos. Si se agregan entidades de seguridad a esta función, podría habilitarse un aumento de privilegios no deseado. db_accessadmin Los miembros de la función de base de datos fija db_accessadmin pueden agregar o quitar el acceso a la base de datos para inicios de sesión de Windows, grupos de Windows e inicios de sesión de SQL Server. db_backupoperator Los miembros de la función de base de datos fija db_backupoperator pueden crear copias de seguridad de la base de datos. db_ddladmin Los miembros de la función de base de datos fija db_ddladmin pueden ejecutar cualquier comando del lenguaje de definición de datos (DDL) en una base de datos. db_datawriter Los miembros de la función de base de datos fija db_datawriter pueden agregar, eliminar o cambiar datos en todas las tablas de usuario. db_datareader Los miembros de la función de base de datos fija db_datareader pueden leer todos los datos de todas las tablas de usuario. db_denydatawriter Los miembros de la función de base de datos fija db_denydatawriter no pueden agregar, modificar ni eliminar datos de tablas de usuario de una base de datos. db_denydatareader Los miembros de la función de base de datos fija db_denydatareader no pueden leer datos de las tablas de usuario dentro de una base de Funciones de msdb La base de datos msdb contiene las funciones con fines especiales que se muestran en la tabla siguiente. Nombre de función de msdb Descripción db_ssisadmin Los miembros de estas funciones de base de datos pueden administrar y utilizar SSIS. Las instancias de SQL Server que se actualizan desde una versión anterior podrían contener una versión anterior de la función cuya denominación se realizaba utilizando Servicios de transformación de datos (DTS) en lugar de SSIS. Para obtener más información, vea Usar funciones de db_ssisoperator db_ssisltduser Integration Services. dc_admin dc_operator Los miembros de estas funciones de base de datos pueden administrar y utilizar el recopilador de datos. Para obtener más información, vea Seguridad del recolección de datos. dc_proxy PolicyAdministratorRole Los miembros de la función de base de datos db_PolicyAdministratorRole pueden realizar todas las actividades de mantenimiento y configuración en las condiciones y directivas de Administración basada en directiva. Para obtener más información, vea Administrar servidores mediante administración basada en directivas. ServerGroupAdministratorRole Los miembros de estas funciones de la base de datos pueden administrar y utilizar grupos de servidores registrados. Para ServerGroupReaderRole obtener más información, vea Crear grupos de servidores. Trabajar con funciones del nivel de base de datos En la tabla siguiente se explican los comandos, las vistas y las funciones que se utilizan para trabajar con funciones del nivel de base de datos. Característica Tipo Descripción sp_helpdbfixedrole (TransactSQL) Metadatos Devuelve la lista de las funciones de base de datos fijas. sp_dbfixedrolepermission (Transact-SQL) Metadatos Muestra los permisos de una función de base de datos fija. sp_helprole (Transact-SQL) Metadatos Devuelve información acerca de las funciones de la base de datos actual. sp_helprolemember (TransactDevuelve información acerca de los miembros de una Metadatos SQL) función de base de datos actual. sys.database_role_members (Transact-SQL) Metadatos Devuelve una fila por cada miembro de cada función de base de datos. IS_MEMBER (Transact-SQL) Indica si el usuario actual es miembro del grupo de Metadatos Microsoft Windows o de la función de base de datos de SQL Server especificados. CREATE ROLE (Transact-SQL) Comando ALTER ROLE (Transact-SQL) Comando Cambia el nombre de una función de base de datos. DROP ROLE (Transact-SQL) Comando Quita una función de base de datos. sp_addrole (Transact-SQL) Comando Crea una nueva función de base de datos en la base de datos actual. sp_droprole (Transact-SQL) Comando Quita una función de base de datos de la base de datos actual. sp_addrolemember (TransactSQL) Agrega un usuario de base de datos, una función de base de datos, un inicio de sesión de Windows o un Comando grupo de Windows a una función de base de datos en la base de datos actual. Crea una nueva función de base de datos en la base de datos actual. sp_droprolemember (TransactQuita una cuenta de seguridad de una función de SQL Comando SQL) Server de la base de datos actual. Función pública de la base de datos Todos los usuarios de una base de datos pertenecen a la función pública de la base de datos. Cuando a un usuario no se le han concedido ni denegado permisos específicos para un objeto que puede protegerse, el usuario hereda los permisos concedidos a la función pública para ese objeto. Credenciales (motor de base de datos) Una credencial es un registro que contiene la información de autenticación (credenciales) necesaria para conectarse a un recurso situado fuera de SQL Server. Esta información la utiliza SQL Server internamente. La mayoría de las credenciales incluyen un nombre de usuario y una contraseña de Windows. La información almacenada en una credencial permite al usuario que se ha conectado a SQL Server mediante la autenticación de SQL Server obtener acceso a recursos situados fuera de la instancia del servidor. Cuando el recurso externo es Windows, el usuario se autentica como el usuario de Windows especificado en la credencial. Se puede asignar una única credencial a varios inicios de sesión de SQL Server. Sin embargo, un inicio de sesión de SQL Server sólo se puede asignar a una credencial. Las credenciales del sistema se crean de forma automática y se asocian a extremos específicos. Los nombres de las credenciales del sistema comienzan por dos signos de número (##). Sintaxis CREATE CREDENTIAL credential_name WITH IDENTITY = 'identity_name' [ , SECRET = 'secret' ] [ FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name ] /*credential_name Especifica el nombre de la credencial que se va a crear. credential_name no puede comenzar por el signo de número (#). Las credenciales del sistema comienzan por ##. IDENTITY ='identity_name' Especifica el nombre de la cuenta que se utilizará para conectarse fuera del servidor. SECRET ='secret' Especifica el secreto necesario para la autenticación de salida. Esta cláusula es opcional. FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name*/ Ejemplos --En el ejemplo siguiente se crea la credencial denominada AlterEgo. -- La credencial contiene el usuario de Windows JoelPC y una contraseña. CREATE CREDENTIAL AlterEgo WITH IDENTITY = 'Mary5', SECRET = '<EnterStrongPasswordHere>'; GO --En el ejemplo siguiente se utiliza una cuenta creada previamente denominada --User1OnEKM en un módulo EKM a través de las herramientas de administración --de EKM, con un tipo de cuenta y una contraseña básicos. La cuenta sysadmin --del servidor crea una credencial que se utiliza para conectar a la cuenta --de EKM y la asigna a la cuenta User1 de SQL Server: CREATE CREDENTIAL CredentialForEKM WITH IDENTITY='User1OnEKM' , SECRET='<EnterStrongPasswordHere>' FOR CRYPTOGRAPHIC PROVIDER MyEKMProvider; GO /* Modify the login to assign the cryptographic provider credential */ ALTER LOGIN User1 ADD CREDENTIAL CredentialForEKM; /* Modify the login to assign a non cryptographic provider credential */ ALTER LOGIN User1 WITH CREDENTIAL = AlterEgo; GO ALTER CREDENTIAL (Transact-SQL) Sintaxis ALTER CREDENTIAL credential_name WITH IDENTITY = 'identity_name' [ , SECRET = 'secret' ] /*Argumentos credential_name Especifica el nombre de la credencial que se va a modificar.*/ IDENTITY ='identity_name' -- Especifica el nombre de la cuenta que se va a usar al conectarse fuera del servidor. SECRET ='secret' -- Especifica el secreto requerido para la autenticación de salida. secret es opcional. Ejemplos /*A. Cambiar la contraseña de una credencial En el siguiente ejemplo se cambia el secreto almacenado en una credencial denominada Saddles. La credencial contiene el inicio de sesión de Windows RettigB y su contraseña. La nueva contraseña se agrega a la credencial mediante la cláusula SECRET.*/ ALTER CREDENTIAL Saddles WITH IDENTITY = 'RettigB', SECRET = 'sdrlk8$40-dksli87nNN8'; GO /*B. Quitar la contraseña de una credencial En el ejemplo siguiente se quita la contraseña de una credencial denominada Frames. La credencial contiene el inicio de sesión de Windows Aboulrus8 y una contraseña. Después de ejecutar la instrucción, la credencial tendrá una contraseña NULL porque no se especifica la opción SECRET.*/ ALTER CREDENTIAL Frames WITH IDENTITY = 'Aboulrus8'; GO DROP CREDENTIAL (Transact-SQL) Sintaxis DROP CREDENTIAL credential_name /*Argumentos credential_name Se trata del nombre de la credencial que se va a quitar del servidor.*/ Ejemplos --En el ejemplo siguiente se quita la credencial denominada Saddles. DROP CREDENTIAL Saddles; GO Asegurables Los asegurables son los recursos cuyo acceso es regulado por el sistema de autorización del SQL Server Database Engine (Motor de base de datos de SQL Server). Algunos asegurables pueden estar incluidos en otros, con lo que se crean jerarquías anidadas denominadas "ámbitos" que a su vez se pueden asegurar. Los ámbitos asegurables son servidor, base de datos y esquema. Servidor Incluye los asegurables siguientes: Extremo Inicio de sesión Base de datos Ámbito de Securable: Base de datos Incluye los asegurables siguientes: Usuario Función Función de aplicación Ensamblado Tipo del mensaje Ruta Servicio Enlace de servicio remoto Catálogo de texto Certificado Clave asimétrica Clave simétrica Contrato Esquema Ámbito de Securable: Esquema Incluye los asegurables siguientes: Tipo Colección de esquemas XML Objeto Objetos Los elementos siguientes son miembros de la clase de objeto: Agregado Restricción Función Procedimiento Cola Estadística Sinónimo Tabla Vista Esquemas (motor de base de datos) Un esquema es un contenedor que contiene tablas, vistas, procedimientos, etc. Se encuentra dentro de una base de datos, que a su vez está dentro de un servidor. Estas entidades se acomodan como cajas anidadas. El servidor es la caja más externa y el esquema la más interna. Contiene todos los asegurables que se mencionan a continuación. Pero no puede contener otra caja. Asegurable que debe estar dentro de un esquema Tipo Colección de esquemas XML Tabla Vista Procedimiento Función Clase TYPE XML SCHEMA COLLECTION OBJECT OBJECT OBJECT OBJECT Agregado Restricción Sinónimo Cola Estadística OBJECT OBJECT OBJECT OBJECT OBJECT Todos los asegurables de un esquema específico deben tener un nombre exclusivo. El nombre completo de un asegurable contenido por un esquema incluye el nombre del esquema que lo contiene. Por lo tanto, un esquema es también un espacio de nombres. Proteger archivos de datos y de registro El SQL Server establece los permisos de acceso a archivos en los archivos de datos físicos y de registro de cada base de datos en cuentas específicas. Estos permisos impiden que se alteren los archivos si se encuentran en un directorio con permisos abiertos. Por ejemplo, si no se han establecido los permisos y para los permisos del sistema operativo en el directorio de la base de datos se ha seleccionado Control total para todos, cualquier cuenta que tenga acceso a ese directorio podrá eliminar o modificar los archivos de la base de datos aunque no tenga permisos de SQL Server para modificar la base de datos. Los permisos de acceso a archivos se establecen durante cualquiera de las siguientes operaciones de base de datos: crear, adjuntar, separar, modificar para agregar un nuevo archivo, realizar copias de seguridad o restaurar. Cadenas de propiedad Cuando varios objetos de base de datos obtienen acceso unos a otros de forma secuencial, la secuencia se denomina cadena. Aunque estas cadenas no existen de manera independiente, cuando SQL Server recorre los eslabones de una cadena, SQL Server evalúa los permisos de los objetos que la componen de manera distinta a si se estuviese obteniendo acceso a los objetos por separado. Estas diferencias tienen implicaciones importantes en lo que se refiere a administrar la seguridad. Las cadenas de propiedad permiten administrar el acceso a varios objetos, por ejemplo, a varias tablas, estableciendo permisos en un objeto, como una vista. El encadenamiento de propiedad también ofrece una pequeña mejora en el rendimiento en los escenarios que permiten la omisión de comprobaciones de permisos. Cómo se comprueban los permisos en una cadena Cuando se obtiene acceso a un objeto mediante una cadena, SQL Server primero compara al propietario del objeto con el propietario del objeto de llamada. Este es el eslabón anterior de la cadena. Si ambos objetos tienen el mismo propietario, los permisos del objeto de referencia no se evalúan. Ejemplo de encadenamiento de propiedad En la siguiente ilustración, la vista July2003 es propiedad de Mary. Ella le ha concedido a Alex permisos en la vista. Él no tiene ningún otro permiso en los objetos de base de datos de esta instancia. ¿Qué ocurre cuando Alex selecciona la vista? Fojura 11111111111111111 1. Alex ejecuta SELECT * en la vista July2003. SQL Server comprueba los permisos de la vista y confirma que Alex tiene permiso para seleccionarla. 2. La vista July2003 requiere información de la vista SalesXZ. SQL Server comprueba la propiedad de la vista SalesXZ. Debido a que esta vista tiene el mismo propietario (Mary) que la vista que la llama, los permisos de la vista SalesXZ no se comprueban. Se devuelve la información requerida. 3. La vista SalesXZ requiere información de la vista InvoicesXZ. SQL Server comprueba la propiedad de la vista InvoicesXZ. Debido a que esta vista tiene el mismo propietario que el objeto anterior, los permisos de la vista InvoicesXZ no se comprueban. Se devuelve la información requerida. Hasta este momento, todos los elementos de la secuencia tienen un único propietario (Mary). Esto se denomina cadena de propiedad continua. 4. La vista InvoicesXZ requiere información de la vista AcctAgeXZ. SQL Server comprueba la propiedad de la vista AcctAgeXZ. Como el propietario de esta vista es diferente del propietario del objeto anterior (Sam, y no Mary), se recupera toda la información sobre permisos de esta vista. Si la vista AcctAgeXZ tiene permisos que permiten que Alex tenga acceso, se devolverá información. 5. La vista AcctAgeXZ requiere información de la tabla ExpenseXZ. SQL Server comprueba la propiedad de la tabla ExpenseXZ. Como el propietario de esta tabla es diferente del propietario del objeto anterior (Joe, y no Sam), se recupera toda la información sobre permisos de esta tabla. Si la tabla ExpenseXZ tiene permisos que permiten que Alex tenga acceso, se devuelve información. 6. Cuando la vista July2003 intenta recuperar información de la tabla ProjectionsXZ, el servidor primero hace comprobaciones para ver si está habilitado el encadenamiento entre las bases de datos Database 1 y Database 2. Si el encadenamiento entre bases de datos está habilitado, el servidor comprobará la propiedad de la tabla ProjectionsXZ. Debido a que esta vista tiene el mismo propietario que la vista de llamada (Mary), los permisos de esta tabla no se comprueban. Se devuelve la información solicitada Encadenamiento de propiedad entre bases de datos SQL Server se puede configurar para permitir el encadenamiento de propiedad entre bases de datos específicas o entre todas las bases de datos de una única instancia de SQL Server. De manera predeterminada, el encadenamiento de propiedad entre bases de datos está deshabilitado y no se debe habilitar a menos que sea específicamente necesario. Posibles amenazas Las cadenas de propiedad resultan muy útiles a la hora de administrar los permisos de una base de datos, pero asumen que los propietarios de objetos preverán todas las consecuencias de las decisiones que tomen para conceder permisos de un elemento protegible. En la ilustración anterior, Mary es la propietaria de la mayoría de los objetos subyacentes de la vista July 2003. Debido a que Mary tiene el derecho de hacer que los objetos de los que es propietaria se encuentren accesibles para otros usuarios, SQL Server asume que, si Mary concede el acceso a la primera vista de una cadena, ha tomado la decisión consciente de compartir las vistas y las tablas a las que hace referencia. En la vida real, es posible que esto no sea una suposición válida. Las bases de datos de producción son mucho más complejas que la de la ilustración, y los permisos que regulan el acceso a las mismas en muy pocas ocasiones se asignan correctamente a las estructuras administrativas de las organizaciones que las utilizan. Es importante comprender que los miembros de funciones de la base de datos con amplios privilegios pueden utilizar el encadenamiento de propiedad entre bases de datos para obtener acceso a objetos de bases de datos externas a las suyas. Por ejemplo, si el encadenamiento de propiedad entre bases de datos se habilita entre la base de datos A y la B, un miembro de la función fija de base de datos db_owner de cualquiera de las dos bases de datos puede suplantar su identidad y entrar en la otra. El proceso es simple: Diane (un miembro de db_owner en la base de datos A) crea un usuario Stuart en la base de datos A. Stuart ya existe como usuario en la base de datos B. A continuación, Diane crea un objeto (propiedad de Stuart) en la base de datos A que llama a cualquier objeto propiedad de Stuart de la base de datos B. Como ambos objetos (el que llama y al que llama) pertenecen al mismo usuario, los permisos del objeto de la base de datos B no se comprobarán cuando Diane obtenga acceso a la misma mediante el objeto que ella ha creado. Permisos (motor de base de datos) Todos los protegibles de SQL Server tienen permisos asociados que se pueden conceder a una entidad de seguridad. Este tema proporciona la siguiente información: Convenciones de nomenclatura de permisos Permisos relacionados con elementos protegibles específicos Permisos de SQL Server Algoritmo de comprobación de permiso Resumen del algoritmo de comprobación de permiso Comprobar los permisos puede ser complejo. El algoritmo de comprobación de permiso incluye la superposición de la pertenencia a grupos y el encadenamiento de propiedad, tanto el permiso explícito como el implícito, y puede ser afectado por los permisos en las clases protegibles y que contienen la entidad que se puede proteger. El proceso general del algoritmo es reunir todos los permisos pertinentes. Si no se encuentra ningún bloqueo DENY, el algoritmo busca un permiso GRANT que proporcione el acceso suficiente. El algoritmo contiene tres elementos esenciales, el contexto de seguridad, el espacio del permiso y el permiso requerido. Contexto de seguridad Es el grupo de entidades de seguridad al que contribuyen los permisos para la comprobación de acceso. Son los permisos que están relacionados con el inicio de sesión actual o el usuario, a menos que el contexto de seguridad se cambiara a otro inicio de sesión o usuario utilizando la instrucción EXECUTE AS. El contexto de seguridad incluye las entidades de seguridad siguientes: o o o o o El inicio de sesión El usuario Pertenecientes a la función Pertenecientes al grupo Windows Si se utiliza la firma de módulo, cualquier cuenta de inicio de sesión o de usuario da cuenta del certificado utilizado para firmar el módulo que el usuario está ejecutando actualmente, así como de los pertenecientes a la función asociados de ese entidad de seguridad. Espacio del permiso Es la entidad que hay que proteger y todas las clases a proteger que contiene la entidad a proteger. Por ejemplo, una tabla (una entidad a proteger) está contenida en la clase de esquema a proteger y en la clase de base de datos a proteger. El acceso puede verse afectado por permisos de nivel de tabla, esquema, base de datos y servidor. Para obtener más información, vea Jerarquía de permisos (motor de base de datos). Permiso necesario El tipo de permiso que se necesita. Por ejemplo, INSERT, UPDATE, DELETE, SELECT, EXECUTE, ALTER, CONTROL, etc. El acceso puede requerir varios permisos, como en los ejemplos siguientes: o o Un procedimiento almacenado puede requerir el permiso EXECUTE sobre el procedimiento almacenado y el permiso INSERT sobre varias tablas a las que hace referencia el procedimiento almacenado. Una vista de administración dinámica puede requerir los permisos VIEW SERVER STATE y SELECT sobre la vista. Ejemplos /*Los siguientes ejemplos muestran cómo recuperar la información sobre permisos. A. Devolviendo la lista completa de los permisos que pueden concederse. La instrucción siguiente devuelve todo los permisos de Database Engine (Motor de base de datos) utilizando la función fn_builtin_permissions. Para obtener más información, vea sys.fn_builtin_permissions (TransactSQL). */ SELECT * FROM fn_builtin_permissions(default); GO /*B. Devolviendo los permisos de una clase de objetos concreta También puede utilizar la función fn_builtin_permissions para ver todos los permisos que están disponibles para una categoría protegible. El ejemplo siguiente devuelve permisos de ensamblados. */ SELECT * FROM fn_builtin_permissions('assembly'); GO /*C. Devolviendo los permisos de un objeto concedidos a la entidad de seguridad que se ejecuta Puede utilizar fn_my_permissions para devolver una lista de los permisos efectivos que son retenidos por el entidad de seguridad de la llamada sobre un elemento específico que se puede proteger. Para obtener más información, vea fn_my_permissions (Transact-SQL). El ejemplo siguiente devuelve los permisos de un objeto denominado Orders55. */ SELECT * FROM fn_my_permissions('Orders55', 'object'); GO /*D. Devolviendo los permisos aplicables a un objeto especificado El ejemplo siguiente devuelve los permisos aplicables a un objeto denominado Yttrium. Observe que la función integrada OBJECT_ID se utiliza para recuperar el identificador del objeto Yttrium. */ SELECT * FROM sys.database_permissions WHERE major_id = OBJECT_ID('Yttrium'); GO 5.- Desarrollo seguro (motor de base de datos) SQL Server tiene varios mecanismos para mejorar la seguridad del código. Estos mecanismos ayudan a los administradores y los programadores a implementar un entorno seguro para el código. Firma de módulos (Motor de base de datos) SQL Server 2008 introdujo la capacidad de firmar módulos en la base de datos como, por ejemplo, procedimientos almacenados, funciones, desencadenadores o ensamblados. Tenga en cuenta que no se pueden firmar los desencadenadores del lenguaje de definición de datos (DDL). 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. Para firmar datos, el firmante resume los datos, los cifra con una clave privada y adjunta el valor resumido y cifrado a los datos. Para verificar la firma, el comprobador utiliza la clave pública del firmante para descifrar el valor resumido y cifrado que se adjunta a los datos. A continuación, el comprobador compara el valor resumido y descifrado con el valor resumido que se ha calculado en los datos complementarios. Es importante que tanto el firmante como el comprobador usen la misma función hash para resumir los datos. Advertencia La firma de módulos sólo se debe utilizar para conceder permisos, nunca para denegarlos o revocarlos. Escenario Suponga que el acceso a la vista sys.sysprocesses debe controlarse a través del procedimiento almacenado usp_sysprocesses. Los usuarios sólo pueden tener acceso a la información de sys.sysprocesses cuando pasan por el procedimiento usp_sysprocesses. Dado que los objetos de usp_sysprocesses y sys.sysprocesses tienen diferentes propietarios, no se aplica el encadenamiento de propiedad. Ejemplo La siguiente script se crea un certificado a partir de un par de claves y se asigna a un nuevo inicio de sesión. Primero se debe crear un par de claves de prueba mediante la herramienta MakeCert que se incluye con el SDK de .NET Framework. A continuación, se conceden los permisos de selección para la vista sys.sysproceses al inicio de sesión asociado al certificado. Se crea el procedimiento almacenado administrado usp_sysprocesses en la nueva base de datos y se firma con el certificado. Se crea la función SysProcRole y se le concede permisos de ejecución en el procedimiento almacenado usp_sysprocesses. Se crea un usuario de prueba y se agrega a la función SysProcRole. El usuario de prueba realiza una instrucción SELECT en sys.sysprocess y, a continuación, ejecuta el procedimiento almacenado usp_sysprocesses para comparación. Después, la script limpia el entorno de prueba. use master go -- Create a test database. CREATE DATABASE db_Demo go -- Create a certificate on the server. A test key pair can be created -- using the MakeCert tool that ships with the .NET Framework SDK. CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer' go -- Create a login and map it to the certificate. CREATE LOGIN login_SysProcCert FROM CERTIFICATE SysProcCert Go -- Revoke the connect permission. REVOKE CONNECT SQL FROM login_SysProcCert ; go -- Grant the certificate, through the login, permission to select from sys.sysprocesses view. GRANT VIEW SERVER STATE TO login_SysProcCert go -- Create a test login. CREATE LOGIN bob WITH PASSWORD = '<enterStrongPasswordHere>' go -- Connect to the test database. use db_Demo go -- Create the master key for the test database (used to protect -- private keys and certificates in the database). CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<enterStrongPasswordHere>' -- Create a certificate from a private key. CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer' WITH PRIVATE KEY (FILE = 'e:\programming\testCert.pvk', DECRYPTION BY PASSWORD= '<enterStrongPasswordHere>', ENCRYPTION BY PASSWORD='<enterStrongPasswordHere>') go -- Create the assembly on the server. The assembly DLL must be signed. CREATE ASSEMBLY SysStoredProcedures FROM 'E:\programming\SysStoredProcs.dll' WITH PERMISSION_SET = SAFE go -- Create the managed stored procedure on the server. CREATE PROCEDURE usp_sysprocesses AS EXTERNAL NAME SysStoredProcedures.StoredProcedures.usp_sysprocesses go -- Add the signature to the stored procedure. ADD SIGNATURE TO [dbo].[usp_sysprocesses] BY CERTIFICATE SysProcCert WITH PASSWORD = '<enterStrongPasswordHere>' go -- Create a role. CREATE ROLE SysProcRole go -- Create a test user CREATE USER bob go -- Add the test user to the role. EXEC sp_addrolemember 'SysProcRole', 'bob' go -- Grant execute permissions on the stored procedure to the new role. GRANT EXECUTE ON [dbo].[usp_sysprocesses] TO SysProcRole go -- Connect as the test user. EXECUTE AS LOGIN = 'bob' use db_Demo go -- User only has permission to see their own processes. SELECT * FROM sys.sysprocesses go -- Execute the stored procedure, which has been signed. exec usp_sysprocesses go -- REVERT REVERT ----------------------------------------------------------------------- Cleanup use db_Demo go use master go DROP DATABASE db_Demo go DROP login login_SysProcCert DROP login bob go DROP CERTIFICATE SysProcCert go A continuación se muestra el código fuente para el procedimiento almacenado usp_sysprocesses, que realiza una instrucción SELECT en la vista sys.sysprocesses. El ensamblado debe firmarse cuando se genera. Imports System Imports System.Data.SqlClient Imports Microsoft.SqlServer.Server Partial Public Class StoredProcedures<Microsoft.SqlServer.Server.SqlProcedure()>_ Public Shared Sub usp_sysprocesses() Using connection As New SqlConnection("context connection=true") connection.Open() Dim command As New SqlCommand("SELECT * FROM sys.sysprocesses", connection) SqlContext.Pipe.ExecuteAndSend(command) End Using End Sub End Class Descripción del cambio de contexto El contexto de ejecución está determinado por el usuario o el inicio de sesión conectado a la sesión o que ejecuta (llama) un módulo. Este contexto establece la identidad con la que se comprueban los permisos para ejecutar instrucciones o realizar acciones. En SQL Server, el contexto de ejecución se puede cambiar a otro usuario o inicio de sesión si se ejecuta la instrucción EXECUTE AS, o bien si se especifica la cláusula EXECUTE AS en un módulo. Después del cambio de contexto, SQL Server comprueba los permisos con el inicio de sesión y el usuario de dicha cuenta, en lugar de hacerlo con la persona que llama al módulo o a la instrucción EXECUTE AS. El inicio de sesión de SQL Server o del usuario de la base de datos se suplanta durante el resto de la sesión o de la ejecución del módulo, o bien hasta que el cambio de contexto se revierta de forma explícita. Cambio explícito de contexto en el servidor Para cambiar el contexto de ejecución en el servidor, utilice la instrucción EXECUTE AS LOGIN = 'login_name'. El nombre de inicio de sesión debe ser visible como entidad de seguridad principal en sys.server_principals y el usuario que llama a la instrucción debe contar con el permiso IMPERSONATE en el nombre de inicio de sesión especificado. El ámbito de la suplantación, cuando el contexto de ejecución se establece en el servidor, es el siguiente: El token de inicio de sesión de login_name se autentica en la instancia de SQL Server y es válido en dicha instancia. Se aplican los permisos de servidor y la pertenencia a funciones de login_name. Utilice la instrucción REVERT para volver al contexto anterior. El usuario que llama a la instrucción REVERT debe estar incluido en la misma base de datos donde se ha producido la suplantación. Ejemplo En el ejemplo siguiente, Peter Connelly, un administrador de red de AdventureWorks , desea crear una cuenta de inicio de sesión de SQL Server para un nuevo empleado, Jinghao Liuhas. El inicio de sesión de SQL Server de Peter no necesita el mismo permiso en el servidor necesario para crear inicios de sesión de SQL Server, pero tiene el permiso IMPERSONATE para adventure-works\dan1, un inicio de sesión de SQL Server que dispone del permiso de servidor requerido. Cuando Peter se conecta a SQL Server, el contexto de ejecución de la sesión se deriva de su inicio de sesión de SQL Server. Para crear un inicio de sesión de SQL Server, Peter asume temporalmente el contexto de ejecución de adventure-works\dan1. Después crea el inicio de sesión. Finalmente, renuncia a los permisos que ha asumido. -- Switch execution context to the adventure-works\dan1 login account. EXECUTE AS LOGIN = 'adventure-works\dan1'; -- Create the new login account. CREATE LOGIN Jinghao1 WITH PASSWORD = '3KHJ6dhx(0xVYsdf'; -- Revert to the previous execution context. REVERT; Cambio explícito de contexto en la base de datos Para cambiar el contexto en la base de datos, utilice la instrucción EXECUTE AS USER = 'user_name'. El nombre del usuario debe existir como entidad de seguridad en sys.database_principals y el usuario que llama a la instrucción debe contar con permisos IMPERSONATE en el nombre de usuario especificado. El ámbito de la suplantación, cuando el contexto de ejecución se establece en las bases de datos, es el siguiente: El token de usuario de user_name se autentica en la instancia de SQL Server y es válido en la base de datos actual. Para obtener información sobre la ampliación de la suplantación de usuarios más allá del ámbito de la base de datos actual, vea Extender la suplantación de la base de datos mediante EXECUTE AS. Se aplican los permisos de base de datos y la pertenencia a funciones de user_name de la base de datos actual. No se aplican los permisos de servidor concedidos de forma explícita a identidades del token de usuario ni mediante pertenencia a funciones. Utilice la instrucción REVERT para volver al contexto anterior. El usuario que llama a la instrucción REVERT debe estar incluido en la misma base de datos donde se ha producido la suplantación. Ejemplo En el siguiente ejemplo, François Ajenstat, administrador de bases de datos de Adventure Works Cycles, desea ejecutar la instrucción DBCC CHECKDB en la base de datos AdventureWorksDW, pero no dispone de permisos en el nivel de base de datos para realizar la operación. Sin embargo, sí dispone de permisos IMPERSONATE en el usuario dan1, una cuenta que incluye el permiso necesario. Cuando François se conecta a la base de datos AdventureWorksDW, el contexto de ejecución se asigna a su token de seguridad de usuario. Los permisos para ejecutar instrucciones se comprueban en las entidades de seguridad principales y secundarias del token del usuario. Puesto que no dispone de los permisos necesarios para ejecutar la instrucción DBCC CHECKDB, ejecuta las instrucciones siguientes. -- EXECUTE AS USER = 'dan1'; -- Create a table in dan1's default schema CREATE TABLE t_NewTable( data nvarchar(100) ); go -- Revert to the previous execution context. REVERT go; Cambio implícito de contexto El contexto de ejecución de un módulo, como un procedimiento almacenado, un desencadenador, un cola o un función definida por el usuario, se puede cambiar de forma implícita mediante la especificación de un nombre de usuario o de inicio de sesión en una cláusula EXECUTE AS de la definición del módulo. Si se especifica el contexto en que se ejecuta el módulo, se puede controlar la cuenta de usuario que utiliza SQL Server para validar permisos en los objetos a los que hace referencia el módulo. Así se consigue una flexibilidad y un control adicionales en la administración de permisos de la cadena de objetos que existe entre los módulos definidos por el usuario y los objetos a los que hacen referencia estos módulos. Los permisos pueden concederse a usuarios únicamente para el propio módulo, sin tener que concederles permisos explícitos para los objetos a los que se hace referencia. Sólo el usuario al que suplanta el módulo necesita disponer de permisos para los objetos a los que dicho módulo tiene acceso. El nivel de suplantación se determina según el tipo de módulo en que se define la suplantación. La suplantación en el servidor se puede definir en el siguiente elemento: Desencadenadores DDL El ámbito de suplantación en el servidor es el mismo que el definido anteriormente en "Cambio explícito de contexto en el servidor". La suplantación en la base de datos se puede definir en los siguiente elementos: Desencadenadores DML Colas Procedimientos almacenados Funciones definidas por el usuario El ámbito de suplantación en la base de datos es el mismo que el definido anteriormente en "Cambio explícito de contexto en la base de datos". Para obtener más información sobre el cambio implícito de contexto, vea Usar EXECUTE AS en módulos. Ejemplo En el siguiente ejemplo, Mary es la propietaria de la tabla MyTable. Desea que el usuario Scott pueda truncar la tabla, pero Scott no dispone de permisos directos para ella. Por tanto, Mary crea el procedimiento almacenado dbo.usp_TruncateMyTable y concede a Scott permisos EXECUTE para el procedimiento. Cuando Scott ejecuta el procedimiento almacenado, Database Engine (Motor de base de datos) comprueba los permisos para truncar la tabla como si fuera la propia Mary la que estuviera ejecutando el procedimiento almacenado. Puesto que ella es la propietaria de la tabla, la instrucción se realiza correctamente a pesar de que Scott no dispone de permisos directos en la propia tabla. CREATE PROCEDURE dbo.usp_TruncateMyTable WITH EXECUTE AS SELF AS TRUNCATE TABLE MyDB..MyTable; Ejemplo de Cadenas de propiedad y cambio de contexto Para ejecutar el código que se deja mas abajo, la seguridad de modo mixto debe estar configurada y la base de datos AdventureWorks debe estar instalada. Escenario En este escenario, dos usuarios necesitan cuentas para obtener acceso a los datos de los pedidos de compra almacenados en la base de datos AdventureWorks. Los requisitos son los siguientes: La primera cuenta (TestManagerUser) debe poder ver todos los detalles de cada pedido de compra. La segunda cuenta (TestEmployeeUser) debe poder ver el número de los pedidos de compra, la fecha de los pedidos, la fecha de envío, los números de identificación de los productos y los elementos pedidos y recibidos en cada pedido de compra, ordenados por número de pedido de compra, correspondientes a los elementos para los que se han recibido envíos parciales. El resto de cuentas deben conservar sus permisos. Para cumplir los requisitos de este escenario, el ejemplo se ha dividido en cuatro partes que describen los conceptos de cadenas de propiedad y cambio de contexto: 1. Configuración del entorno. 2. Creación de un procedimiento almacenado para obtener acceso a datos por pedido de compra. 3. Acceso a los datos mediante un procedimiento almacenado. 4. Restablecimiento del entorno. 1. Configurar el entorno Use SQL Server Management Studio y el código siguiente para abrir la base de datos AdventureWorks y use la instrucción CURRENT_USER de Transact-SQL para comprobar que el usuario dbo se muestra como contexto. USE AdventureWorks; GO SELECT CURRENT_USER AS 'Current User Name'; GO 2222222222222222 Use este código como usuario dbo para crear dos usuarios en el servidor y en la base de datos AdventureWorks. CREATE LOGIN TestManagerUser WITH PASSWORD = '340$Uuxwp7Mcxo7Khx'; GO CREATE USER TestManagerUser FOR LOGIN TestManagerUser WITH DEFAULT_SCHEMA = Purchasing; GO CREATE LOGIN TestEmployeeUser WITH PASSWORD = '340$Uuxwp7Mcxo7Khy'; GO CREATE USER TestEmployeeUser FOR LOGIN TestEmployeeUser; GO 333333333333333333333333333 Use el código siguiente para cambiar la propiedad del esquema Purchasing a la cuenta TestManagerUser. Esto permite que dicha cuenta use todo el acceso a las instrucciones del lenguaje de manipulación de datos (DML) (por ejemplo, los permisos SELECT y INSERT) en los objetos que contiene. Puesto que no se incluyen los permisos de lenguaje de definición de datos (DDL), a TestManagerUser se le conceden explícitamente derechos en las tablas PurchaseOrderHeader y PurchaseOrderDetail además de la capacidad de crear procedimientos almacenados. /* Change owner of the Purchasing Schema to TestManagerUser */ ALTER AUTHORIZATION ON SCHEMA::Purchasing TO TestManagerUser; GO /* Grant permissions to TestManagerUser on these objects with GRANT option */ GRANT ALL ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderHeader TO TestManagerUser WITH GRANT OPTION; GO GRANT ALL ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderDetail TO TestManagerUser WITH GRANT OPTION; GO /* Note: DML works fine with Schema owner, but not DDL. */ GRANT CREATE PROCEDURE TO TestManagerUser WITH GRANT OPTION; GO 2. Crear un procedimiento almacenado para obtener acceso a los datos Existen dos modos de permitir a un usuario que cambie los contextos en una base de datos: mediante SETUSER o EXECUTE AS. Para usar la instrucción SETUSER, el autor de la llamada debe ser miembro de la función fija de servidor sysadmin o ser la cuenta dbo. EXECUTE AS requiere permisos IMPERSONATE. Use la instrucción EXECUTE AS en el código siguiente para cambiar el contexto a TestManagerUser y crear un procedimiento almacenado que muestre únicamente los datos exigidos por TestEmployeeUser. Para cumplir los requisitos, el procedimiento almacenado acepta una variable para el número del pedido de compra y no muestra la información financiera, y la cláusula WHERE limita los resultados a los envíos parciales. EXECUTE AS LOGIN = 'TestManagerUser' GO SELECT CURRENT_USER AS 'Current User Name'; GO 444444444444444444444444444444444444444 /* Note: The user that calls the EXECUTE AS statement must have IMPERSONATE permissions on the target principal */ CREATE PROCEDURE usp_ShowWaitingItems @ProductID int AS BEGIN SELECT a.PurchaseOrderID, a.OrderDate, a.ShipDate , b.ProductID, b.OrderQty, b.ReceivedQty FROM Purchasing.PurchaseOrderHeader a INNER JOIN Purchasing.PurchaseOrderDetail b ON a.PurchaseOrderID = b.PurchaseOrderID WHERE b.OrderQty > b.ReceivedQty AND @ProductID = b.ProductID ORDER BY b.ProductID ASC END GO 5555555555555555555555555555555555555555555555555555 En estos momentos, TestEmployeeUser no tiene acceso a ningún objeto de la base de datos. El código siguiente (todavía en el contexto de TestManagerUser) permite que la cuenta de usuario consulte la información de tabla base mediante el procedimiento almacenado. GRANT EXECUTE ON OBJECT::Purchasing.usp_ShowWaitingItems TO TestEmployeeUser; GO El procedimiento almacenado forma parte del esquema de Purchasing, aunque no se especifica explícitamente ningún esquema, porque TestManagerUser se asigna de forma predeterminada al esquema Purchasing. La información del catálogo del sistema se puede utilizar para buscar objetos, tal y como se muestra en el código siguiente. SELECT a.name AS 'Schema' , b.name AS 'Object Name' , b.type AS 'Object Type' FROM sys.schemas a INNER JOIN sys.objects b ON a.schema_id = b.schema_id WHERE b.name = 'usp_ShowWaitingItems'; GO 77777777 Una vez finalizada esta sección del ejemplo, el código vuelve a cambiar el contexto a dbo mediante la instrucción REVERT. REVERT; GO 88888888 3. Obtener acceso a los datos mediante el procedimiento almacenado TestEmployeeUser no tiene ningún permiso en los objetos de la base de datos AdventureWorks aparte del inicio de sesión y los derechos asignados a la función de base de datos public. El código siguiente devuelve un error cuando TestEmployeeUser intenta obtener acceso a las tablas base. EXECUTE AS LOGIN = 'TestEmployeeUser' GO SELECT CURRENT_USER AS 'Current User Name'; GO 99999 /* This won't work */ SELECT * FROM Purchasing.PurchaseOrderHeader; GO SELECT * FROM Purchasing.PurchaseOrderDetail; GO Puesto que los objetos a los que hace referencia el procedimiento almacenado, creados en la última sección, pertenecen a TestManagerUser en virtud de la propiedad de esquema Purchasing, TestEmployeeUser puede tener acceso a las tablas base mediante el procedimiento almacenado. El código siguiente, que todavía usa el contexto TestEmployeeUser, pasa el pedido de compra 952 como un parámetro. EXEC Purchasing.usp_ShowWaitingItems 952 GO 1010101010101010101 4. Restablecer el entorno El código siguiente usa el comando REVERT para devolver el contexto de la cuenta actual a dbo y, a continuación, restablece el entorno. REVERT; GO ALTER AUTHORIZATION ON SCHEMA::Purchasing TO dbo; GO DROP PROCEDURE Purchasing.usp_ShowWaitingItems GO DROP USER TestEmployeeUser; GO DROP USER TestManagerUser; GO DROP LOGIN TestEmployeeUser; GO DROP LOGIN TestManagerUser; GO 1111111111