SQL Server: como criar usuário com acesso apenas a endereços HOSTNAME ou IP específicos


8

Eu tenho um aplicativo idiota no qual confio, que possui uma cadeia de conexão codificada no interior.

Para aumentar a segurança do meu SQL Server, eu adoraria tornar os usuários do SQL iguais a um aplicativo interno codificado permanentemente, mas quero permitir que esse usuário possa usar o SQL Server apenas de determinado host (endereço IP).

Respostas:


6

Você pode usar um gatilho de logon para isso.

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

Se você tentar se conectar a partir de um IP não autorizado, receberá um erro:

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

Lembre-se de que os gatilhos de logon são potencialmente maus e também podem acabar bloqueando todos os usuários da instância. Seja cuidadoso!

No entanto, acho que você realmente não precisa fazer isso. Se você deseja habilitar conexões a partir de uma lista de endereços conhecidos, um firewall é a ferramenta mais adequada para o trabalho . A pior coisa que pode acontecer é o usuário errado se conectar a partir de um endereço IP conhecido, o que é bastante improvável se os usuários mantiverem suas credenciais com cuidado.

Além disso, leve em consideração que os endereços IP podem ser falsificados, por isso não tenho certeza de qual grau de segurança adicional você estaria fornecendo.


2
Como disse @spaghettidba, os gatilhos de logon são potencialmente más notícias. Se você tiver problemas, leia este sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . Examinei os métodos de ignorar o gatilho, localizá-lo e desativá-lo.
Kenneth Fisher

11
Ele pode permitir que qualquer pessoa que não seja o usuário do aplicativo efetue login a partir de qualquer endereço, mas o aplicativo pode ser executado apenas em um servidor, para que o usuário do aplicativo possa efetuar logon somente nesse endereço. Poucos firewalls podem lidar com isso.
Ross Presser

4

Você pode conseguir isso usando o gatilho de logon da seguinte maneira

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

Depois que o gatilho é criado, você pode encontrá-lo em Objetos do servidor -> guia Triggers

No meu blog connectsql.com

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.