Inicio > Base de datos > Seguridad de los inicios de sesión en el Sql Server

Seguridad de los inicios de sesión en el Sql Server

Sábado, 17 de mayo de 2014 Dejar un comentario Ir a comentarios

En un anterior post hable acerca como bloquear el inicio de sesión desde IP especificos. En este post voy a detallar más lo que podemos hacer con esta poderosa tecnica. Resulta muy util pues aunque se sepan las credencias (usuario/password) el intento de inicio de sesión se rechazara de no cumplir la condición.

Bloquear un host mediante su nombre

En las redes windows se estila usar nombre de host, el cual es independiente de los números IPs. Para rechazar intentos de conexion desde nombres de hosts especificos podemos usar el siguientes script:

USE master;
GO
CREATE TRIGGER connection_lock_trigger
ON ALL SERVER
FOR LOGON AS
BEGIN
   DECLARE @HostName Varchar(MAX)
   SET @HostName = HOST_NAME()
   IF @HostName IN ('NombreDeHost1' , 'NombreDeHost2')
   BEGIN
       ROLLBACK TRANSACTION;
       PRINT 'Esta credencial no se puede usar desde el host ' + @HostName
   END
END;

Limitar la cantidad de veces que se puede iniciar sesión

Profundizamos un poco más en el nivel de seguridad, ahora vamos a realizar un conteo de cuantas sesiones abiertas existen para rechazar las conexiones entrantes. En este ejemplo el inicio de sesión es ‘login_text’ y solo permite 3 conexiones como máximo.

USE master;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER 
FOR LOGON
AS
BEGIN
    IF ORIGINAL_LOGIN()= 'login_test' AND
        (SELECT COUNT(*) FROM sys.dm_exec_sessions
         WHERE is_user_process = 1 AND
         original_login_name = 'login_test') > 3
    BEGIN
        ROLLBACK TRANSACTION;
        PRINT 'Lo siento solo se permiten 3 conexiones para ''login_text'''
    END
END;

Fijar el inicio de sesion desde un solo origen

Para lograr esto con toda la seguridad posible, tenemos que usar la combinación de 3 elementos: nombre de host, ip e inicio de sesión.
Esta técnica es útil por ejemplo cuando queremos que el inicio de sesión se use solamente para conexiones entre servidores. Y es util por que aun cuando se haya filtrado la credencial esta no podrá ser utilizada por nadie mas.

USE master;
GO
CREATE TRIGGER connection_server_trigger
ON ALL SERVER 
FOR LOGON
AS
BEGIN
    DECLARE @HostName Varchar(MAX)
    DECLARE @IP Varchar(500)
    
    SET @IP = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(500)')
    SET @HostName = HOST_NAME()

    IF ORIGINAL_LOGIN()= 'login_test' 
    BEGIN
        IF NOT (@HostName IN ('NombreDeHost1','NombreDeHost2') AND
                    @IP IN ('172.16.255.11', '172.20.254.1', '172.26.254.12')
                   )
        BEGIN
            ROLLBACK TRANSACTION;
            PRINT 'Lo siento pero ''login_text'' es de uso exclusivo para conexión entre servidores'
        END
    END
END;

Recomendaciones

  • Los scripts funcionan a partir de sql server 2005 con sp2.
  • Es necesario primero probarlos en ambientes de pruebas y no directamente en ambientes de producción, debido a que pueden rechazar conexiones de inicios de sesión que utiliza el mismo motor del sql server.
  • Asegurarse bien de que las condiciones no bloquearan otros inicios de sesión

Comparte y diviertete:
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • BarraPunto
  • Bitacoras.com
  • BlinkList
  • Blogosphere
  • Live
  • Meneame
  • MSN Reporter
  • MySpace
  • RSS
  • Suggest to Techmeme via Twitter
  • Technorati
  • LinkedIn
  • email
  • FriendFeed
  • PDF
  • Reddit
  • Wikio IT
  • Add to favorites
  • blogmarks
  • http://jmacoe.com/blog jmacoe

    Saludos,

    El problema es que el nombre de aplicación del excel no contiene “EXCEL”. Aquí te envió a solución:

    ALTER TRIGGER Acceso
    ON ALL SERVER
    FOR LOGON
    AS
    BEGIN
    IF APP_NAME() LIKE ‘%Microsoft Office 2010%’
    ROLLBACK;
    END;

  • vega

    hola quisiera saber como bloquear las conexiones a mi servidor sql server 2005, desde access, estoy utilizando un trigger logon como los que comentas aqui:

    CREATE TRIGGER acceso
    ON ALL SERVER WITH EXECUTE AS ‘sa’
    FOR LOGON
    AS
    BEGIN
    IF APP_NAME() LIKE ‘%EXCEL%’ ROLLBACK;
    END;

    Lo curioso es q siempre m permite el acceso, según lo q he leido el trigger logon se activa antes de establecer la sesion y la función app_name() devuelve la aplicación de la sesión actual, entonces cuando se ejecuta el trigger no hay sesion activa x lo tanto app_name() no tiene nada y por lo tanto permite la conexión… bueno eso es lo q yo entendi, pero bueno quisiera ver si m explicas si estoy en lo correcto o si me ayudas a detectar mi error… mil gracias

  • http://jmacoe.com/blog jmacoe

    Estimado Nicolas, para realizar un seguimiento de la creación y eliminación de conexiones es preferible usar la herramienta SQL Server Profiler, esta te brindara mucho mas información que puedes analizar en diferido. Los scripts que he publicado en este articulo sirven para darle un tratamiento en-linea que permiten o rechazan la conexión bajo ciertas circunstancias. No es recomendable escribir en tablas dentro de un disparador (trigger) pues el rendimiento del servicio sera drasticamente afectado.

  • Nicolas

    Hola no soy muy experto en Trigger y quiero saber como puedo crear uno que capture la información de inicio de sesión de usuarios a una instancia de SQL, igualmente de cuando se desconecta.

    La idea es saber cuando se conecta, a donde y desde donde, yo tengo idea de como generar esta información, pero no de como hacer que funcione dentro de un triger.

  • Pingback: Bitacoras.com

Top Footer