SQL Server: как создать пользователя с доступом только с определенных адресов HOSTNAME или IP

8

У меня есть одно глупое приложение, на которое я полагаюсь, которое имеет жестко закодированную строку подключения внутри.

Чтобы повысить безопасность моего SQL Server, я бы хотел сделать пользователей SQL такими же, как одно жестко закодированное внутри приложения, но я хочу, чтобы этот пользователь мог использовать SQL Server только с определенного хоста (IP-адрес).

adopilot
источник

Ответы:

6

Вы можете использовать триггер входа в систему для этого.

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

Если вы попытаетесь подключиться с неавторизованного IP, вы получите сообщение об ошибке:

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

Помните, что триггеры входа в систему являются потенциально злыми и могут также в конечном итоге заблокировать всех из экземпляра. Быть осторожен!

Тем не менее, я думаю, вам не нужно этого делать. Если вы хотите разрешить подключения из списка известных адресов, брандмауэр является наиболее подходящим инструментом для работы . Худшее, что может случиться, - это неправильный пользователь, подключающийся с известного IP-адреса, что маловероятно, если пользователи будут тщательно хранить свои учетные данные.

Кроме того, примите во внимание, что IP-адреса могут быть подделаны, поэтому я не уверен, какую степень дополнительной безопасности вы бы обеспечили.

spaghettidba
источник
2
Как сказал @spaghettidba, триггеры входа в систему - потенциально плохие новости. Если у вас возникли проблемы, прочтите этот sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . Я рассмотрел способы обхода триггера, его нахождения и отключения.
Кеннет Фишер
1
Он может захотеть разрешить любому, кроме пользователя приложения, вход в систему с любого адреса, но приложение может запускаться только с одного сервера, поэтому пользователь приложения может входить только с этого адреса. Немногие брандмауэры могут справиться с этим.
Росс Прессер
4

Вы можете добиться этого, используя триггер входа в систему, как показано ниже

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

После создания триггера его можно найти в разделе «Объекты сервера» -> вкладка «Триггеры».

Из моего блога connectsql.com

aasim.abdullah
источник