lunes, 29 de junio de 2009

Seguridad SQL Server

Como administradores de Base de datos sufrimos muchos con la seguridad, ya que, los programadores quieren mayores privilegios, los analistas por igual, en fín, siempre debemos estar en la lucha de que permisos debo dejar, que usuarios debo usar, entre otras. En esta publicación vamos a mostrarle algunos tips para mejorar la seguridad de su motor de base de datos SQL Server.

Primero: usar lo menos posible el usuario SA, muchas veces los desarrolladores usan este usuario para realizar sus pruebas sin entorpecer su trabajo, pero lo mejor es que no lo usen, cada uno debe tener su propio usuario y tener un usuario general de testing.

Segundo: Deshabilitar el usuario Builtin\Administrator, es un peligro dejar este usuario, ya que cualquiera en el dominio con acceso al mismo puede acceder a los motores de base de datos.

Tercero: que el servicio que sube motor de sql server, así como agent, se inicien mediante la cuenta local system y no con el administrador del equipo.

Autenticación Windows: es el tipo de autenticación más segura que existe.

Cuarto: verificar el log de errores para ver los intentos fallidos de login, si es posible habilitar el error #229, para verifcarlo.

sp_configure 'allow updates',1
go
reconfigure WITH OVERRIDE
go
UPDATE sysmessages SET dlevel = (dlevel 0x80) WHERE error = 229
Go
sp_configure 'allow updates',0
go
reconfigure WITH OVERRIDE
go

Quinto: utilizar procedimientos almacenados para que nadie acceda a las tablas directamente. y evitar dar acceso de db_datareader o db_datawriter a los usuarios de la base de datos. Además, esto permite tener el código centralizado en un solo lugar.

viernes, 26 de junio de 2009

XML en SQL Server 2005

Desde la versión 2000 SQL Server permite generar XML a partir de consultas a la base de datos, pero para que esos XML fueran legibles, era necesario hacer trucos de magia, como dirían en mi país, "enviar un cohete para la luna". Eso ha mejorado en SQL Server 2005 donde se pueden declarar variables tipo xml, entre otras mejoras. Ahora un ejemplo del XML resultante:

select top 3 name
from sysobjects where xtype = 'p'
order by crdate desc
for xml path('objects'), type, root('Root')

Resultado:

<Root>
<objects>
<name>Master</name>
</objects>
<objects>
<name>
Peoples</name>
</objects>
<objects>
<name>
Companies</name>
</objects>
</Root>

También, si deseamos insertar un registros o un grupo de registros lo podemos realizar por medio de un variable XML, a continuación les voy a mostrar un ejemplo que viene en la ayuda de Microsoft:

-- Se crean tabla para ser pobladas usando la función OPENXML.

CREATE TABLE Customers (CustomerID varchar(20) primary key,
ContactName varchar(20),
CompanyName varchar(20))
go
CREATE TABLE Orders( CustomerID varchar(20), OrderDate datetime)
go

--Variable que permite obtener el documento del XML.

DECLARE @docHandle int
declare @xmlDocument nvarchar(max) -- or xml type

set @xmlDocument = N'<ROOT>
<Customers CustomerID="XYZAA" ContactName="Joe" CompanyName="Company1">
<Orders CustomerID="XYZAA" OrderDate="2000-08-25T00:00:00"/>
<Orders CustomerID="XYZAA" OrderDate="2000-10-03T00:00:00"/>
<Customers>
<Customers CustomerID="XYZBB" ContactName="Steve" CompanyName="Company2">No Orders yet! </Customers>
</ROOT>'

EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument

-- La función OPENXML provee un rowset consistente con el orden de los datos.
INSERT Customers
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Customers')
WITH Customers

-- La función OPENXML provee un rowset consistente con el orden de los datos.
INSERT Orders
SELECT *
FROM OPENXML(@docHandle, N'//Orders')
WITH Orders

/* La función OPENXML se utiliza como si fuera una tabla temporal que almacena la inofrmación del XML.*/

SELECT * FROM OPENXML(@docHandle, N'/ROOT/Customers/Orders') WITH (CustomerID nchar(5) '../@CustomerID', OrderDate datetime)

-- Elimina la representación interna del XML.
EXEC sp_xml_removedocument @docHandle

jueves, 11 de junio de 2009

Schemas SQL 2005 y 2008

Para los que siempre hemos confiado en la maquinaria que es el motor de base de datos SQL Server 2000 para manejar grandes bases de datos solamente de almacenamiento de datos (no incluye generación de Cubos, Análisis de datos, Reportes) nos encontrabamos muchas veces con un pequeño inconveniente de seguridad con los usuarios.

Muchas veces, teniamos algún usuario del que teníamos procedimientos, tablas, vistas y funciones atada al usuario y cuando deseabamos eliminar el usuario, simplemente no podiamos porque estaba atada al usuario.

Para evitar esos inconvenientes en el Motor SQL Server 2005, Microsoft ha presentado los "schemes" que te permiten crear una especie de plantilla a la que se le asigna un /unos usuarios y que tienen sus propios permisos para tablas, procedimientos y vistas.

Para crear un Schema lo primero que debemos hacer es seleccionar una base de datos: Baseball en nuestro caso. Luego de seleccionar la base de datos donde queremos crear nuestros schemas, hacemos clic en Security --> Schema y hacemos clic derecho y seleccionamos New Schema.

Luego de seleccionar New Schema, colocamos el nombre del Schema y el (los) usuario(s) que tienen acceso al mismo. Después de seleccionar los usuarios, se le deben asignar los distintos permisos que debe tener, execute, select, insert, alter, update, entre otros.

Ahora solo se debe asignar el schema propietario de las tablas o procedimientos que van a ejecutar alguna tarea en nuestra base de dato que por defecto siempre será [dbo].

En las pantallas de ejemplo pueden ver algunos schemas que vienen por defecto y otros creados por quien le escribe, como son security y system que son personalizados.

Espero que esto les sirva para análisis futuro de base de datos.