sábado, 4 de febrero de 2017

Bases de datos parcialmente contenidas II


Administración de una base de datos parcialmente contenida

Mantener la configuración de la base de datos en la propia base de datos en lugar de en la master, permite que cada propietario tenga más control sobre su base de datos, sin necesidad de conceder permisos al administrador de la base de datos sysadmin.

Limitaciones

Las bases de datos parcialmente contenidas no permiten las siguientes características:
Utilizar la replicación, cambiar la captura de datos ni cambiar el seguimiento.
Procedimientos numerados.
Objetos vinculados al esquema que dependen de funciones integradas con cambios de intercalación
Cambio de enlace resultante de cambios de intercalación, incluidas referencias a objetos, columnas, símbolos o tipos.
Replicación, cambio de captura de datos y seguimiento de cambios.

Advertencia. Los procedimientos almacenados temporales están permitidos. Pero dado que los procedimientos almacenados temporales infringen el confinamiento, no se espera que sean compatibles con versiones futuras de la base de datos contenida.

Bases de datos parcialmente contenidas II


Identificación de contención de la base de datos

Hay dos formas de identificar el estado de contención de la base de datos. Sys.dm_db_uncontained_entities  es una vista que muestra todas las entidades potencialmente no contenidas en la base de datos. El evento database_uncontained_usage se produce cuando se identifica cualquier entidad no contenida real en tiempo de ejecución.

sys.dm_db_uncontained_entities  

Esta vista muestra todas las entidades de la base de datos que tienen el potencial de no estar contenidas, como las que cruzan el límite de la base de datos. Esto incluye aquellas entidades de usuario que pueden utilizar objetos fuera del modelo de base de datos. Sin embargo, debido a que la contención de algunas entidades (por ejemplo, aquellas que utilizan SQL dinámico) no se puede determinar hasta el tiempo de ejecución, la vista puede mostrar algunas entidades que estén contenidas. 

El evento XEvent de database_uncontained_usage 

Este evento (XEvent) se dispara siempre que se identifica en tiempo de ejecución una entidad no contenida. Esto incluye entidades originadas en código de cliente. Este evento ocurrirá sólo para las entidades no contenidas reales. Sin embargo, el evento sólo se producirá en tiempo de ejecución. Por tanto, cualquier entidad de usuario no contenida que no se haya ejecutado no será identificada por este evento.


Buenas prácticas de seguridad con Bases de Datos contenidas

Las bases de datos contenidas están expuestas a algunas amenazas únicas que deben ser tenidas en cuenta  y mitigadas. La mayoría de las amenazas están relacionadas con el proceso de autenticación USER WITH PASSWORD, que mueve el límite de autenticación desde el nivel del motor de base de datos hasta el nivel de base de datos.


Amenazas relacionadas con los usuarios

Los usuarios de una base de datos contenida con permisos ALTER ANY USER, como miembros de las funciones de base de datos db_owner y db_securityadmin, pueden conceder acceso a la base de datos sin el conocimiento o el permiso o el administrador de SQL Server. Conceder a los usuarios acceso a una base de datos contenida incrementa riesgo de ataque potencial contra la instancia de SQL Server. Los administradores deben tener en cuenta esta delegación de control de acceso y tener mucho cuidado al conceder a los usuarios de la base de datos contenida el permiso ALTER ANY USER. Todos los propietarios de bases de datos tienen el permiso ALTER ANY USUARIO. Los administradores de SQL Server deben auditar periódicamente a los usuarios de una base de datos contenida.


Acceso a otras bases de datos con la cuenta de invitado

Los propietarios y usuarios de bases de datos con permiso ALTER ANY USER pueden crear usuarios de bases de datos contenidas. Una vez un usuario se conecta a una base de datos contenida, puede acceder a otras bases de datos en el motor de base de datos, si las otras bases de datos tienen habilitada una cuenta de invitado Guest.

Creación de un usuario duplicado en otra base de datos

Algunas aplicaciones pueden requerir que un usuario tenga acceso a más de una base de datos. Para ello se pueden crear usuarios de bases de datos idénticos en cada base de datos contenida. Se puede utilizar la opción SID para crear un segundo usuario con contraseña. El siguiente ejemplo crea dos usuarios idénticos en dos bases de datos.

USE DB1;  
GO  
CREATE USER Pepe WITH PASSWORD = '<strong password>';   
-- Return the SID of the user  
SELECT SID FROM sys.database_principals WHERE name = 'Pepe';  
  
-- Change to the second database  
USE DB2;  
GO  
CREATE USER Pepe WITH PASSWORD = '<same password>', SID = <SID from DB1>;  
GO  

Para ejecutar una consulta entre bases de datos, es necesario marcar la opción TRUSTWORTHY en la base de datos de llamadas. Por ejemplo si el usuario (Pepe) definido anteriormente está en DB1, para ejecutar SELECT * FROM db2.dbo.Table1; Entonces debe estar activada para la base de datos DB1 la configuración TRUSTWORTHY. Es necesario ejecutar el siguiente código para activar la configuración de confianza TRUSTWORTHY.
ALTER BASE DE DATOS DB1 SET TRUSTWORTHY ON;

Creación de un usuario que duplica un inicio de sesión

Si se crea un usuario de una base de datos contenida con contraseña con el mismo nombre que un inicio de sesión de SQL Server y si el inicio de sesión de SQL Server se conecta especificando la base de datos contenida como el catálogo inicial, el inicio de sesión de SQL Server no podrá conectarse. La conexión se evaluará como el usuario de base de datos contenida con la contraseña principal de la base de datos contenida en vez de como un usuario basado en el inicio de sesión de SQL Server. Esto podría causar una denegación de servicio intencional o accidental para el inicio de sesión de SQL Server.

Como práctica recomendada, los miembros de la función fija de servidor sysadmin deben considerar la posibilidad de conectarse siempre sin utilizar la opción de catálogo inicial. Esto conecta el inicio de sesión a la base de datos master y evita cualquier intento de inicio de sesión no autorizado de un propietario de la base de datos. A continuación, el administrador puede cambiar a la base de datos contenida mediante la instrucción USE <base de datos>. También se puede establecer un inicio de sesión predeterminado de la base de datos contenida, que complete el inicio de sesión de master y, a continuación, transferir el inicio de sesión a la base de datos contenida.
Como práctica sugerida, no se deben crear usuarios de base de datos contenidas con contraseñas que tengan el mismo nombre que los inicios de sesión de SQL Server. Si existe una conexión duplicada, es mejor conectarse a la base de datos master sin especificar un catálogo inicial y, a continuación, ejecutar el comando USE para cambiar a la base de datos contenida.
Cuando hay bases de datos contenidas, los usuarios de bases de datos no contenidas deben conectarse al motor de base de datos sin utilizar un catálogo inicial o especificando el nombre de base de datos de una base de datos no contenida como el catálogo inicial. Esto evita la conexión a la base de datos contenida que está bajo control menos directo por los administradores del motor de base de datos.

Aumentar el acceso cambiando el estado de contención de una base de datos

Los inicios de sesión que tienen el permiso ALTER ANY DATABASE, tal como los miembros de la función de servidor fijo de dbcreator y los usuarios de una base de datos no contenida que tienen el permiso CONTROL DATABASE, como miembros del rol de base de datos fijo db_owner, pueden cambiar la configuración de una base de datos contenida. En el caso de que se cambie de NONE a PARTIAL o FULL, se puede conceder acceso de usuario creando usuarios de base de datos con contraseña. Esto puede proporcionar acceso sin el conocimiento o  consentimiento del administrador. Para evitar que las bases de datos contengan las conexiones de los usuarios con contraseñas es necesario utilizar triggers de inicio de sesión para cancelar los intentos de inicio de sesión.

Adjuntar una base de datos contenida

Para adjuntar una base de datos contenida, un administrador debe dar a los usuarios no deseados acceso a la instancia del motor de base de datos. Un administrador preocupado por este riesgo puede poner la base de datos en modo RESTRICTED_USER, lo que impide la autenticación de usuarios con contraseña. Sólo los usuarios autorizados a través de  inicios de sesión podrán acceder al motor de base de datos.
Los usuarios se crean utilizando los requisitos de contraseña en vigor en el momento de su creación y las contraseñas no se vuelven a verificar cuando se adjuntan a una base de datos. Al adjuntar una base de datos contenida a un sistema con una directiva de contraseñas más estricta, si la base de datos adjuntada contiene contraseñas débiles, el administrador podría permitir contraseñas que no cumplan la directiva de contraseñas actual en el motor de base de datos adjunto. Los administradores pueden evitar las contraseñas débiles obligando a  que todas las contraseñas se restablezcan para la base de datos adjunta.

Políticas de password

Las contraseñas de una base de datos deben ser contraseñas seguras, pero no es posible protegerlas mediante políticas de contraseña sólidas. Es mejor utilizar la autenticación de Windows siempre que sea posible para aprovechar las políticas de contraseña más extensas disponibles desde Windows.

Autentificación Kerberos

Las contraseñas de usuario de las bases de datos no pueden utilizar la autenticación Kerberos. Por tanto siempre que sea posible hay que utilizar la autenticación de Windows para aprovechar las características de Windows como Kerberos.

Acceso al diccionario fuera de línea

Los hashes de contraseñas de los usuarios de base de datos con contraseñas se almacenan en la base de datos contenida. Cualquier persona con acceso a los archivos de base de datos podría realizar un ataque de diccionario contra los usuarios de base de datos con contraseñas en un sistema no auditado. Para mitigar esta amenaza, hay que restringir el acceso a los archivos de base de datos o solo permitir conexiones a bases de datos contenidas mediante la autenticación de Windows.

Migrar a una base de datos parcialmente contenida

Preparación para migrar una base de datos

Revisar los siguientes elementos para considerar la migración de una base de datos al modelo de base de datos parcialmente contenido.

Es necesario comprender el modelo de base de datos parcialmente contenido. 

Es necesario comprender los riesgos exclusivos de las bases de datos parcialmente contenidas

Las bases de datos contenidas no admiten replicación, cambio de captura de datos o seguimiento de cambios. Es necesario confirmar que la base de datos no utiliza estas funciones.

Hay que revisar la lista de características que se modifican en la base de datos para convertirla en parcialmente contenidas.

Consultar sys.dm_db_uncontained_entities  para encontrar objetos o características no contenidas en la base de datos.

Supervisar el objeto XEvent de database_uncontained_usage para ver cuándo se utilizan las entidades no contenidas.

Habilitar bases de datos contenidas

Antes de poder crear bases de datos contenidas estas, deben estar habilitadas en la instancia del motor de base de datos de SQL Server, Para habilitar las bases de datos contenidas. El siguiente ejemplo habilita bases de datos contenidas en la instancia del motor de base de datos de SQL Server.

sp_configure 'contained database authentication', 1;  
GO  
RECONFIGURE ;  
GO  

Habilitación de bases de datos contenidas utilizando Management Studio

Para habilitar bases de datos contenidas utilizando management studio es necesario:

Sobre el explorador de objetos, hacer clic con el botón secundario del ratón en el nombre del servidor y, a continuación, clic en Propiedades.

En la página Avanzado, en la sección Contención, establecer la opción Habilitar bases de datos contenidas en Verdadero.
Hacer clic en Aceptar.

Convertir una base de datos en una parcialmente contenida

Una base de datos se convierte en una base de datos contenida al cambiar la opción CONTAINMENT con management studio o bien a través de comandos de SQL. 

El ejemplo siguiente convierte una base de datos denominada Contabilidad a una base de datos parcialmente contenida.

USE [master]  
GO  
ALTER DATABASE [Accounting] SET CONTAINMENT = PARTIAL  
GO  

Conversión de una base de datos parcialmente contenida mediante Management Studio
El ejemplo siguiente convierte una base de datos en una base de datos parcialmente contenida.
1. En Explorador de objetos, expanda Bases de datos, haga clic con el botón secundario en la base de datos para convertir y, a continuación, haga clic en Propiedades.
2. En la página Opciones, cambie la opción Tipo de contención a Parcial.
3. Haga clic en Aceptar.
Migración de usuarios a usuarios de bases de datos contenidas
El ejemplo siguiente migra a todos los usuarios que se basan en inicios de sesión de SQL Server a usuarios de bases de datos con contraseñas. El ejemplo excluye los inicios de sesión que no están habilitados. Debe ejecutarse sobre la base de datos contenida.

DECLARE @username sysname ;  
DECLARE user_cursor CURSOR  
    FOR   
        SELECT dp.name   
        FROM sys.database_principals AS dp  
        JOIN sys.server_principals AS sp   
        ON dp.sid = sp.sid  
        WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;  
OPEN user_cursor  
FETCH NEXT FROM user_cursor INTO @username  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        EXECUTE sp_migrate_user_to_contained   
        @username = @username,  
        @rename = N'keep_name',  
        @disablelogin = N'disable_login';  
    FETCH NEXT FROM user_cursor INTO @username  
    END  
CLOSE user_cursor ;  
DEALLOCATE user_cursor ;  

sábado, 28 de enero de 2017

Bases de datos parcialmente contenidas

Bases de datos contenidas

Una base de datos contenida es una base de datos que está aislada de otras bases de datos y de la instancia de SQL Server que aloja la base de datos.  Existen varios tipos de datos aislados de la base de datos y de la instancia.

Los metadatos que describen una base de datos.
La autenticación del usuario.
El entorno de SQL Server.

Algunas características de bases de las bases de datos parcialmente contenidas, como el almacenamiento de metadatos en la base de datos, se aplican a todas las bases de datos de SQL Server. Algunos beneficios de las bases de datos parcialmente contenidas, como la autenticación de nivel de base de datos y la intercalación de catálogos, deben habilitarse antes para que estén disponibles. La contención parcial se habilita con  sentencias CREATE DATABASE y ALTER DATABASE o utilizando el SQL Server Management Studio. 

Bases de datos parcialmente contenidas

Concepto de base de datos parcialmente contenida


Una base de datos totalmente contenida incluye todas las configuraciones y metadatos necesarios para definir la base de datos. Las bases de datos parcialmente contenidas facilitan la separación de una base de datos de su instancia de SQL Server y otras bases de datos.
Cualquier entidad definida por el usuario que dependa únicamente de las funciones que residen en la base de datos se considera totalmente contenida. Cualquier entidad definida por el usuario que depende de funciones que residen fuera de la base de datos se considera no contenida.
Los siguientes términos se aplican al modelo de base de datos contenido.

Base de datos no contenida


Es una base de datos que tiene la contención establecida en NONE. Todas las bases de datos en versiones anteriores a SQL Server 2012 no están contenidas. De forma predeterminada, todas las bases de datos de SQL Server 2012 y posteriores tienen una contención establecida en NONE.

Base de datos parcialmente contenida


Una base de datos parcialmente contenida, es una base de datos contenida que puede permitir que algunas características crucen el límite de la base de datos. SQL Server incluye la capacidad de determinar cuándo se cruzan los límites de contención.


La función de base de datos contenida está actualmente disponible sólo en un estado parcialmente contenido. Una base de datos parcialmente contenida es una base de datos contenida que permite el uso de características no contenidas.
Se puede utilizar la vista sys.dm_db_uncontained_entities y sys.sql_modules  para devolver información sobre objetos o características no contenidas. Determinando el estado de contención de los elementos de su base de datos, se puede descubrir qué objetos o características deben ser reemplazados o alterados para promover la contención.


Importante. Dado que determinados objetos tienen un valor de contención predeterminado de NONE, esta vista puede devolver falsos positivos.

Usuario contenido

Hay dos tipos de usuarios para las bases de datos contenidas.

Usuario de base de datos contenida con contraseña

Los usuarios de la base de datos contenida con contraseñas son autenticados por la base de datos. 

Usuarios de Windows

Los usuarios autorizados de Windows y los miembros de grupos de Windows autorizados pueden conectarse directamente a la base de datos y no necesitan inicios de sesión en la base de datos master. La base de datos confía en la autenticación de Windows.
Los usuarios basados en inicios de sesión en la base de datos master pueden tener acceso a una base de datos contenida, pero eso crearía una dependencia en la instancia de SQL Server.

Importante. Habilitar bases de datos parcialmente contenidas controla el acceso a la instancia de SQL Server a los propietarios de la base de datos. Para obtener más información, Security Best Practices with Contained Databases. 

Límites de la base de datos

Debido a que las bases de datos parcialmente contenidas separan la funcionalidad de la base de datos de las de la instancia, existe una línea claramente definida entre estos dos elementos llamada límite de la base de datos.
Dentro del límite de la base de datos se encuentra el modelo de base de datos, donde se desarrollan y gestionan las bases de datos. Por ejemplo, las entidades ubicadas dentro de la base de datos incluyen las tablas de sistema como sys.tables, los usuarios de bases de datos con contraseñas y tablas de usuario de la base de datos referenciada con un nombre de dos partes.
Fuera del límite de la base de datos se encuentra el modelo de gestión, que se refiere a funciones y gestión a nivel de instancia. Ejemplos de entidades ubicadas fuera del límite de la base de datos incluyen tablas del sistema como sys.endpoints, usuarios asignados a los inicios de sesión y tablas de usuario en otra base de datos referenciada por un nombre de tres partes.

Contención

Las entidades de usuario que residen completamente dentro de la base de datos se consideran contenidas. Las entidades que residen fuera de la base de datos, o dependen de la interacción con funciones fuera de la base de datos, se consideran no contenidas.
En general, las entidades de usuario pertenecen a las siguientes categorías de contención:
Entidades de usuario completamente contenidas (son aquellas que nunca cruzan el límite de la base de datos), por ejemplo sys.indexes. Cualquier código que utilice estas características o cualquier objeto que sólo hace referencia a estas entidades también está totalmente contenido.
Las entidades de usuario no contenidas (aquellas que cruzan el límite de la base de datos), por ejemplo, sys.server_principals o un servidor principal (login). Cualquier código que utiliza estas entidades o cualquier función que hace referencia a estas entidades no contienen.

Beneficios del uso de bases de datos parcialmente contenidas

Hay problemas y complicaciones asociadas a las bases de datos no contenidas que se pueden resolver utilizando una base de datos parcialmente contenida.

Movimiento de una base de datos parcialmente contenida

Uno de los problemas que se produce al mover bases de datos es que alguna información importante puede no estar disponible cuando migra una base de datos de una instancia a otra. Por ejemplo, la información de inicio de sesión que se almacena dentro de la instancia en lugar de en la base de datos. Cuando se migra una base de datos no contenida de una instancia a otra instancia de SQL Server, se pierde esta información. Se debe identificar la información que falta y moverla con su base de datos a la nueva instancia de SQL Server. Este proceso puede ser difícil y requerir mucho tiempo.
Una base de datos parcialmente contenida puede almacenar información importante en la base de datos para que la base de datos conserve la información después migrarla.

Nota. Una base de datos parcialmente contenida puede proporcionar documentación que describa las características que son utilizadas por una base de datos que no se puede separar de la instancia. Esto incluye una lista de otras bases de datos interrelacionadas, configuraciones del sistema que la base de datos requiere pero no se puede contener, y así sucesivamente.

Beneficio de las bases de datos contenidas: los usuarios de siempre están activados

Al reducir los vínculos a la instancia de SQL Server, las bases de datos parcialmente contenidas pueden ser útiles durante la conmutación por error cuando se utiliza siempre en grupos de disponibilidad.
La creación de usuarios contenidos, permite al usuario conectarse directamente a la base de datos contenida. Esta es una característica muy significativa en los escenarios de alta disponibilidad y recuperación de desastres, como en una solución Siempre en Línea. Si los usuarios están contenidos, en caso de conmutación por error, la gente podría conectarse a la secundaria sin crear inicios de sesión en la instancia que aloja la secundaria. Esto proporciona un beneficio inmediato. 

Desarrollo inicial de bases de datos

Como un desarrollador no tiene por qué saber dónde se desplegará una nueva base de datos,  limitando los impactos ambientales desplegados en la base de datos disminuirá el trabajo y la preocupación del desarrollador. En el modelo no contenido, el desarrollador debe considerar posibles impactos ambientales en la nueva base de datos. Sin embargo, al usar bases de datos parcialmente contenidas, los desarrolladores pueden detectar impactos a nivel de instancia en la base de datos.


sábado, 21 de enero de 2017

Autorizaciones y permisos en servidores SQL Server

Autorización y permisos en SQL Server

Al crear los objetos de base de datos, se deben conceder permisos explícitamente para que estos objetos sean accesibles a los usuarios. Cada objeto tiene permisos que se pueden conceder utilizando las instrucciones específicas para definir los tipos de permiso que disfruta dicho objeto.

El principio de menor privilegio

El desarrollo de una aplicación utilizará un enfoque de cuenta de usuario con los mínimos privilegios necesarios (LUA). Se trata de una parte importante de una estrategia defensiva para contrarrestar amenazas de seguridad. El enfoque LUA garantiza que los usuarios siguen el principio de privilegios mínimos y siempre iniciarán la sesión con cuentas de usuario limitadas. Las tareas administrativas se dividen mediante funciones de servidor fijo y el uso del rol de servidor sysadmin está restringido.

Autorizaciones y permisos en  servidores SQL Server


En conveniente seguir siempre el principio de privilegios mínimos al conceder permisos a los usuarios de la base de datos. Por tanto se concederán los permisos mínimos necesarios a un usuario o función para realizar una tarea determinada.

Nodo de seguridad

Desarrollar y probar una aplicación utilizando el enfoque LUA añade un grado de dificultad al proceso de desarrollo. Es más fácil crear objetos y escribir código con permisos de administrador del sistema o propietario de la base de datos que hacerlo utilizando una cuenta LUA. Sin embargo, el desarrollo de aplicaciones con una cuenta altamente privilegiada puede ocultar el impacto de la reducción de la funcionalidad cuando los usuarios menos privilegiados intentan ejecutar una aplicación que requiere permisos elevados para funcionar correctamente. Conceder permisos excesivos a los usuarios para readquirir la funcionalidad perdida puede hacer una aplicación vulnerable al ataque. Diseñar, desarrollar y probar una aplicación con una cuenta LUA impone un enfoque de planificación de la seguridad que elimina sorpresas desagradables y la tentación de otorgar privilegios elevados como solución rápida. Se pueden utilizar inicios de sesión de SQL Server para realizar pruebas incluso si la aplicación está destinada a implementarse mediante la autenticación de Windows.

Permisos basados en roles

La concesión de permisos a roles en lugar de a usuarios simplifica la administración de seguridad. Los conjuntos de permisos asignados a roles son heredados por todos los miembros del rol. Es más fácil agregar o quitar usuarios de un rol que recrear conjuntos de permisos separados para usuarios individuales. Las funciones pueden anidarse; Sin embargo, demasiados niveles de anidación pueden perjudicar el rendimiento. También se pueden añadir usuarios a funciones fijas de base de datos para simplificar la asignación de permisos.
Es posible conceder permisos a nivel de esquema. Los usuarios heredarán automáticamente los permisos de todos los nuevos objetos creados en cada esquema; de este modo no será necesario conceder permisos al crear nuevos objetos.

Permisos mediante código de procedimiento

La encapsulación del acceso a  datos a través de módulos como procedimientos almacenados y funciones definidas por el usuario proporciona una capa adicional de protección alrededor de la aplicación. Esto evita que los usuarios interactúen directamente con objetos de base de datos al conceder permisos sólo a procedimientos almacenados o funciones y negar permisos a objetos subyacentes como tablas. SQL Server logra esto mediante el encadenamiento de propiedad.

Declaraciones de permiso

Las tres instrucciones de permisos de Transact-SQL se describen en la siguiente tabla.

Tabla de permisos (SQL Server)


La sentencia GRANT puede asignar permisos a un grupo o rol que los usuarios de la base de datos pueden heredar. Sin embargo, la instrucción DENY tiene prioridad sobre todas las demás instrucciones de permiso. Por lo tanto, un usuario al que se le ha denegado un permiso no puede heredarlo de otro rol.
Nota. No es posible denegar permisos DENY a los miembros de la función de servidor sysadmin y los propietarios de objetos.

Cadenas de propiedad

SQL Server garantiza que sólo los usuarios principales a los que se haya concedido permiso puedan acceder a los objetos. El acceso a través de varios objetos de base de datos, uno detrás de otro, se denomina como cadena. Cuando SQL Server va enlazando accesos a través de los diferentes objetos, evalúa los permisos de manera diferente que si accediera a cada elemento por separado. Cuando se accede a un objeto a través de una cadena, SQL Server compara primero el propietario del objeto con el propietario del objeto que llama (el enlace anterior de la cadena). Si ambos objetos tienen el mismo propietario, no se comprueban los permisos del objeto referenciado. Cada vez que un objeto accede a otro objeto que tiene un propietario diferente, la cadena de propiedad se rompe y SQL Server debe comprobar el contexto de seguridad del usuario que lo llama.

Código procedural y cadena de propiedad

Si se conceden a un usuario permisos de ejecución en un procedimiento almacenado determinado que selecciona datos de una tabla. Si el procedimiento almacenado y la tabla tienen el mismo propietario, no será necesario que el usuario reciba ningún permiso en la tabla e incluso se pueden denegar permisos. Sin embargo, si el procedimiento almacenado y la tabla tienen diferentes propietarios, SQL Server debe comprobar los permisos del usuario en la tabla antes de permitir el acceso a los datos.

Nota. La cadena de propiedad no se aplica en el caso de sentencias SQL dinámicas. Para llamar a un procedimiento que ejecuta una sentencia SQL, se deben conceder permisos al usuario que llama a las tablas subyacentes, dejando la aplicación vulnerable a un ataque. SQL Server proporciona nuevos mecanismos, como la suplantación y la firma de módulos con certificados, que no requieren la concesión de permisos en las tablas subyacentes. Esto también se puede utilizar con procedimientos almacenados CLR.

Roles de base de datos y servidor en SQL Server

Todas las versiones de SQL Server utilizan la seguridad basada en funciones, que permite asignar permisos a una función o grupo de usuarios, en lugar de a usuarios individuales. Los roles fijos de servidor y base de datos tienen un conjunto fijo de permisos asignados a ellos.

Roles fijos de servidor 

Permisos 


Roles fijos de servidor (SQL Server)


Como se acaba de indicar, tienen un conjunto fijo de permisos y su ámbito es todo el servidor. Están destinados para su uso en la administración de SQL Server y los permisos asignados a ellos no se pueden cambiar. Los inicios de sesión se pueden asignar a roles fijos de servidor sin necesidad de poseer una cuenta de usuario en una base de datos.

Nota de seguridad. El rol de servidor fijo sysadmin abarca todos los demás roles y tiene un alcance ilimitado. No agregue usuarios a esta función a menos que sean altamente confiables. Los miembros de la función sysadmin tienen privilegios administrativos irrevocables en todas las bases de datos y recursos del servidor.

Es necesario ser selectivo cuando se añaden usuarios a roles fijos de servidor. Por ejemplo, el rol bulkadmin permite a los usuarios insertar el contenido de cualquier archivo local en una tabla, lo que podría poner en peligro la integridad de los datos. 

Roles fijos de base de datos 


Roles fijos de base de datos (SQL Server)

Los roles fijos de base de datos tienen un conjunto predefinido de permisos que están diseñados para permitir administrar grupos de permisos. Los miembros de la función db_owner pueden realizar todas las actividades de configuración y mantenimiento en la base de datos.

Roles de base de datos y usuarios

Para poder trabajar con objetos de base de datos, los inicios de sesión deben estar asignados a las cuentas de usuario de la base de datos. Los usuarios de la base de datos se pueden agregar a las funciones de la base de datos, heredando todos los conjuntos de permisos asociados con esas funciones. Pueden ser concedidos todos los permisos.

Roles de usuario (SQL Server)


También se deben considerar los roles public, dbo y guest (invitado) a la hora de diseñar las directivas de seguridad para una aplicación.

El rol public

El rol público está contenido en cada base de datos, que incluya bases de datos del sistema. No se puede eliminar y no está permitido agregar o quitar usuarios de él. Los permisos concedidos a este rol son heredados por todos los demás usuarios y roles porque pertenecen al rol público de forma predeterminada. A este rol se concederán sólo los permisos que se desee que tengan todos los usuarios.

La cuenta de usuario dbo

El dbo, o propietario de la base de datos, es una cuenta de usuario que tiene permisos implícitos para realizar todas las actividades en la base de datos. Los miembros del rol fijo de servidor sysadmin se asignan automáticamente a dbo.

Nota.  Dbo es también el nombre de un esquema, tal y como se describe en Ownership and User-Schema Separation in SQL Server.

La cuenta de usuario dbo se confunde a menudo con el rol fijo de base de datos  db_owner. El ámbito de db_owner es una base de datos; El ámbito de sysadmin es el servidor completo. La pertenencia a la función db_owner no confiere privilegios de usuario dbo.

La cuenta de usuario invitado (guest)

Una vez que un usuario ha sido autenticado y se le permite iniciar sesión en una instancia de SQL Server, debe existir una cuenta de usuario independiente en cada base de datos a la que el usuario tenga acceso. Esto requiere tener una cuenta de usuario en cada base de datos para evitar que los usuarios se conecten a una instancia de SQL Server y accedan a todas las bases de datos del servidor. La existencia de una cuenta de usuario invitado evita este requisito permitiendo un inicio de sesión sin una cuenta de usuario de base de datos para acceder a una base de datos.
La cuenta de invitado es una cuenta incorporada en todas las versiones de SQL Server. De forma predeterminada, se deshabilita en las nuevas bases de datos. Si está habilitada, puede desactivarse revocando sus permisos de conexión ejecutando la sentencia REVOKE CONNECT FROM GUEST.

Nota de seguridad. Hay que tratar de evitar usar la cuenta de invitado (guest); Todos los inicios de sesión sin sus propios permisos de base de datos obtienen los permisos de base de datos concedidos a esta cuenta. Si debe usar la cuenta de invitado, es mejor concederle los permisos mínimos

Prácticas recomendadas: al planificar una solución de seguridad, considerar las siguientes prácticas recomendadas:

Proporcionar a cada usuario sólo los permisos que realmente necesite.

Utilizar la herencia de seguridad para minimizar el número de permisos implícitos que deben habilitarse.


Utilizar contenedores principales, como grupos o roles, para crear una capa de abstracción entre los principales permisos. Después se utilizará la pertenencia a estos grupos para controlar el acceso. Los cambios en el personal no deben requerir cambios en los permisos.

Más información en:




sábado, 14 de enero de 2017

Autorizar logins para acceder a bases de datos

Creación de un inicio de sesión (Login)

Para acceder al motor de base de datos, los usuarios necesitan un inicio de sesión (Login). El inicio de sesión puede representar la identidad del usuario como una cuenta de Windows o como miembro de un grupo de Windows o el inicio de sesión puede ser un inicio de sesión de SQL Server que sólo existe en SQL Server. Siempre que sea posible, se utilizará la autenticación de Windows.

De forma predeterminada, los administradores del equipo tienen acceso completo a SQL Server. Para este ejemplo, queremos tener un usuario con menos privilegios; Por lo tanto, se creará una nueva cuenta local de autenticación de Windows en el equipo. Para ello, es necesario administrador del equipo. A continuación, concede a ese nuevo usuario el acceso a SQL Server.

Para crear una nueva cuenta de Windows:
Hacer click en Inicio, hacer click en Ejecutar, en el cuadro Abrir, escribir
% SystemRoot% \ system32 \ compmgmt.msc / s

Autorizar logins para acceder a bases de datos

sábado, 7 de enero de 2017

Autenticación y autorización de usuarios en SQL Server

Autenticar conexiones con SQL Server

Existen dos modos posibles: modo de autenticación de Windows y modo mixto. El modo de autenticación de Windows habilita la autenticación de Windows y deshabilita la autenticación de SQL Server. El modo mixto permite la autenticación de Windows y la autenticación de SQL Server. La autenticación de Windows siempre está disponible y no se puede deshabilitar.


Autenticación y autorización de usuarios en SQL Server

sábado, 31 de diciembre de 2016

Conceptos básicos de bases de datos relacionales

Una base de datos, contiene una o más tablas de información. Las filas de una tabla son llamadas registros, y las columnas de una tabla se denominan campos o atributos. Una base de datos que sólo contiene una tabla se llama una base de datos plana. Una base de datos que contiene dos o más tablas relacionadas entre sí, constituye una base de datos relacional. 
Imagina que eres el responsable de un hospital. Podrías utilizar una sola tabla (una base de datos plana) para realizar su seguimiento tal y como se muestra en la siguiente tabla.

Conceptos básicos de bases de datos relacionales