SQL Server:如何创建仅具有特定HOSTNAME或IP地址访问权限的用户


8

我有一个愚蠢的应用程序,我依赖它,其中包含硬编码的连接字符串。

为了提高我的SQL Server的安全性,我希望使SQL用户与应用程序中的一个硬编码用户相同,但是我希望允许该用户只能从某些主机(IP地址)使用SQL Server。

Answers:


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地址可能被欺骗,因此我不确定您将提供哪种程度的附加安全性。


2
正如@spaghettidba所说,登录触发器可能确实是个坏消息。如果您遇到麻烦,请阅读此sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger。我讨论了绕过触发器,找到它并禁用它的方法。
肯尼斯·费舍尔

1
他可能希望允许除应用程序用户以外的任何人从任何地址登录,但是该应用程序只能从一台服务器运行,因此该应用程序用户只能从该地址登录。很少有防火墙可以解决这个问题。
Ross Presser 2014年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.