SQL Server: cómo crear usuarios con acceso solo desde HOSTNAME específicos o direcciones IP


8

Tengo una aplicación estúpida en la que confío, que tiene una cadena de conexión codificada en su interior.

Para aumentar la seguridad de mi SQL Server, me encantaría hacer que los usuarios de SQL sean lo mismo que una aplicación interna codificada, pero quiero permitir que ese usuario pueda usar SQL Server solo desde cierto host (dirección IP).

Respuestas:


6

Puede usar un Logon Trigger para eso.

CREATE TRIGGER TR_check_ip_address
ON ALL SERVER
FOR LOGON
AS 
BEGIN

    DECLARE @ip_addr varchar(48)

    SELECT @ip_addr = client_net_address
    FROM sys.dm_exec_connections
    WHERE session_id = @@SPID

    IF ORIGINAL_LOGIN() = 'bob' AND @ip_addr <> '127.0.0.1'
        ROLLBACK;

END

Si intenta conectarse desde una IP no autorizada, recibirá un error:

Logon failed for login 'bob' due to trigger execution.

Recuerde que los disparadores de inicio de sesión son potencialmente malvados y también pueden terminar bloqueando a todos fuera de la instancia. ¡Ten cuidado!

Sin embargo, creo que realmente no necesitas hacer eso. Si desea habilitar conexiones desde una lista de direcciones conocidas, un firewall es la herramienta más adecuada para el trabajo . Lo peor que podría suceder es que el usuario incorrecto se conecte desde una dirección IP conocida, lo cual es bastante improbable si los usuarios mantienen sus credenciales con cuidado.

Además, tenga en cuenta que las direcciones IP pueden ser falsificadas, por lo que no estoy seguro de qué grado de seguridad adicional proporcionaría.


2
Como dijo @spaghettidba, los disparadores de inicio de sesión son potencialmente malas noticias. Si tiene problemas, lea este sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . Revisé los métodos para evitar el gatillo, encontrarlo y deshabilitarlo.
Kenneth Fisher

1
Es posible que desee permitir que cualquier persona que no sea el usuario de la aplicación inicie sesión desde cualquier dirección, pero la aplicación solo puede ejecutarse desde un servidor, por lo que el usuario de la aplicación solo puede iniciar sesión desde esa dirección. Pocos firewalls pueden manejar eso.
Ross Presser

4

Puede lograr esto usando el inicio de sesión de la siguiente manera

USE master
GO
-- Create table to hold valid IP values
CREATE TABLE ValidIPAddress (IP NVARCHAR(15)
CONSTRAINT PK_ValidAddress PRIMARY KEY)

-- Declare local machine as valid one
INSERT INTO ValidIPAddress
SELECT '<local machine>'
-- Create Logon Trigger to stop logins from invalid IPs
CREATE TRIGGER tr_LogOn_CheckIP ON ALL SERVER
    FOR LOGON
AS
    BEGIN
        DECLARE @IPAddress NVARCHAR(50) ;
        SET @IPAddress = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]',
                                           'NVARCHAR(50)') ;
        IF NOT EXISTS ( SELECT  IP
                        FROM    master..ValidIPAddress
                        WHERE   IP = @IPAddress )
            BEGIN
            -- If login is not a valid one, then undo login process
                SELECT  @IPAddress
                ROLLBACK --Undo login process
            END

    END

Una vez creado el disparador, puede encontrarlo en Objetos del servidor -> pestaña Disparadores

Desde mi blog conectaql.com

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.