Seguridad en SQL Server

Seguridad en SQL Server

Hola gente ! hoy inauguramos un nueva tema en el foro el cual es la seguridad en sql server, espero les sea de utilidad !.

JuanPLG



Comentarios

Hola, justo en esta parte del foro encontre unos triggers de DDL y de logon, lo que necesito es implementar un trigger a nivel de tabla y que me tome los datos de EVENTDATA, hice las pruebas en SQL 2005 y me devuelve NULL nomas, yo quiero para cada operacion que hago en una tabla X guarde en la tabla bitacora entre otros campos le IP desde donde se ejecuto el camio, para ello uso algo como esto
DECLARE @IP Varchar(500)
SET @IP = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(500)')

dentro del trigger pero solo me devuelve NULL, esto del EVENTDATA por ahi lei que solo funciona en triggers de logon y server, es esto cierto??, en todo caso que funcion me sugieren usar pues en mi tabla bitacora quiero guardar el comando ejecutado,l a IP de donde se ejecuto, entre otros datos, pero estos dos son los mas trascendentes,. Agradecere me puedan dar luz en este asunto que me estoy complicando en demasia :-)

Saludos

Solo se que nada se

Hola como estas !, el tema de la función EVENTDATA es utilizado para todo lo que sea DDL y logon al servidor SQL 2005. En el caso que quieras implementarlo cada vez que ejecuten un ALTER TABLE - CREATE TABLE, tenes que tener en cuenta que podrás contar con los siguientes atributos:

EVENT_INSTANCE

EventType
PostTime
SPID
ServerName
LoginName
UserName
DatabaseName
SchemaName
ObjectName
ObjectType
TSQLCommand

EVENT_INSTANCE

Otra opción es que implementes trazas para capturar la información que necesitas, para ello te sugiero que comiences con los stores procedures y función que te detallo a continuación:

Stores Procedures para generación y captura de datos:

sp_trace_create
sp_trace_setevent
sp_trace_setstatus
sp_trace_generateevent

Función para transformar y leer los datos capturados:

fn_trace_getinfo

Saludos. :-)






Prodriguez

Quiero aprender SQL y obtener ayuda a problemas que me han estado sucecediendo.

Hola que tal,tengo un problemilla,tengo un stored en sql 05 encriptadoque funciona bien,pero en otra base se desencripto el mismo stored por medio del sql decryptor y ya no funciona bien. Lo que necesito es poder copiar el stored encriptado a otra base.(no necesito des encriptarlo solo ponerlo en la otra base). Me podran a yudar a saber como paso el stored encriptado a otra base.??

Gracias

Hola bammbataa !, mira simplemente tenes que posicionarte en la base de origen y stored procedure encriptado, luego realizas un "generate script" del objeto y el resultado (que lo vas a ver encriptado) lo ejecutas en la base de destino. Así te tendría que funcionar bien.

Espero tus comentarios.

Saludos virtuales.

JuanPLG


Hola a todos ! necesito que me ayuden:

Existe algún perfil que se le pueda dar a alguien para leer TODO y SOLO crear, pero NO quiero que puedan modificar nada.

¿Es esto posible?

Gracias de antemano.

Marqui.

 marquiken

Hola como estas ! bueno te comento, según la version del dbms que estes usando es la solución, fijate y comentame.

PARA SQL2000

USE [BaseXQUERY]
GO
CREATE TABLE [dbo].[t1](
[c1] [varchar](255) NULL,
[c2] [int] NULL
) ON [PRIMARY]
GO
EXEC sp_grantdbaccess pepe,pepe
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT CREATE TABLE TO pepe;
GO

PRUEBA A REALIZAR

Te logueas como pepe.

create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null

SALIDA:

ab 1
cd 2
ef 3

(3 row(s) affected)

(3 row(s) affected)

Server: Msg 229, Level 14, State 5, Line 1
DELETE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.
Server: Msg 229, Level 14, State 5, Line 1
UPDATE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.

PARA SQL2005

USE [BaseXQUERY]
GO
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT ALTER ON SCHEMA::[dbo] TO [pepe];
GO
GRANT CREATE TABLE TO Pepe;
GO

PRUEBA

Te logueas como pepe.

create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null

SALIDA:

(3 row(s) affected)
c1t c2t
---------- ----------
AB 1
AC 2
ZZ 3

(3 row(s) affected)

Msg 229, Level 14, State 5, Line 5
The DELETE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.
Msg 229, Level 14, State 5, Line 6
The UPDATE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.

Exitos totales !!!!!!.






Prodriguez

Buenas noches a todos.

Quisiera saber como se puede restringir el acceso al motor de base de datos a los usuarios de la red, ni instalando el sql server en la terminal de trabajo ni ninguna otra aplicacion de acceso a bases de datos. Esto para evitar manipulacion indebida de la informacion almacenada.

Muchisimas gracias por su colaboracion...

Hola !, con respecto a la seguridad tenes tres niveles a tener en cuenta:

Nivel 1: Cerrar seguridad en la red
Nivel 2: Cerrar seguridad en el dbms, en este caso SQL Server
Nivel 3: Cerrar la seguridad en la aplicaciones.

Te detallo en rasgos generales cada nivel:

Nivel 1) Se refiere a la seguridad física (Sala de servidores) y seguridad lógica entre ellos configuración de firewall, encriptación de datos a través de los routers, no asignar privilegios adm a los usuarios finales en sus wks, etc.

Nivel 2) Se refiere a la configuración interna del SQL Server:
Solo autenticación trusted (AD de Windows).
Eliminar el grupo Builtin Administrators.
Generar un grupo global para asignación de usuarios como sysadmin del SQL.
Usuarios como dbowner de las bases, solo para las aplicaciones que explícitamente los necesiten.
Relacionado al punto anterior generar una cuenta aplicación en AD para que solo ella pueda acceder con esos privilegios a través de la APP.

Nivel 3) Se refiere al diseño de las aplicaciones.
Definir un usuario aplicación del tipo trusted (usuario windows) para acceso a la base. (Hereda todos las políticas aplicadas, por ej: política de complejidad de contraseña)
Acceder a los datos a través del usuario aplicación, mediante stored procedures y vistas.
Trabajar con roles de base de datos si es necesario.
Dbowner de las bases restringir lo máximo posible. (granularidad de permisos).
Tratar de revocar permisos sobre los stored procedures extendidos (xp_...).

Para todos los niveles, es recomendable guardar auditoria y realizar monitoreos mediante alertas (Por ej: SCOM o en su vieja version MOM).

Tenes un articulo muy bueno en ntro sitio al cual podes echar un vistazo.

http://www.todosql.com/hackers-pueden-atacar-sql-server

Un abrazo virtual !

JuanPLG


Muchas gracias por la respuesta.. Tocara empezar a hacer las respectivas pruebas.

En el log de sql2005, me deja el siguiente texto si se borra una base de datos:

2009-10-07 11:25:13.06 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.

Como puedo saber el nombre de la base de datos borrada???.
Muchas gracias, Paco

Hola Paco como estas !, bueno, seguramente utilizaste el wizard o ayudante de SQL Server para generar un plan de mantenimiento de base de datos, es por ello que cada vez que se elimina una base de datos, te queden jobs apuntando a la base borrada. Lo primero que haría es chequear la salida de todos los jobs agendados en el sql server, para ver errores y warning.

Con respecto a como saber cual es la base de datos borrada es muy sencillo:

1) Query para listar base de datos:

select dbid,dbname from sysdatabases;

2) Buscar por el errorlog de SQL server los siguientes string:

deleted database
drop database
removed database

3) Para determinar en tiempo de ejecución que aplicacion o usuario puede estar borrando una base de datos, levanta un Profiler de SQL Server y graba en una tabla o archivo para almacenar y luego realizar la búsqueda.

Abrazo virtual.

nalonso

Muchas gracias JLopez por tu ayuda. Voy a poner en marcha lo que me propones.

como puedo saber que usario elimino un registro de la DB

como puedo visualizar el log de esta

saludos

Victor C

Hola Victor como estas !, te comento, en versiones 2005 y superior lo podes encarar a través de DML TRIGGERS, para las operaciones de DELETE sobre la tabla afectada.
Para poder registrar y leer la actividad deberías crear una tabla en la misma base de datos o bien en otra tipo de auditoria, donde el trigger realice un insert a la misma, con los datos de usuario y registro.
Puedes utilizar las funciones SESSION_USER (Transact-SQL), USER_NAME,SUSER_SNAME para determinar el usuario y GETDATE() fecha y hora entre otras funciones.
Resumiendo:
TRIGGERS DML, FUNCIONES y TABLAS de auditoria.

Espero te sirva.

Abrazo Virtual.

nalonso