有没有办法将 Microsoft SQL Server 2005 标准版(sql 处于混合模式)上的特定 SQL 2005 登录限制为特定 IP 地址,而其他登录(Windows 身份验证的登录)不受影响?
6 回答
我使用以下触发器来限制对特定登录 - IP 组合的访问。
CREATE TRIGGER [LOGIN_IP_RESTRICTION]
ON ALL SERVER FOR LOGON
AS
BEGIN
DECLARE @host NVARCHAR(255);
SET @host = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(max)');
IF(EXISTS(SELECT * FROM master.dbo.IP_RESTRICTION
WHERE UserName = SYSTEM_USER))
BEGIN
IF(NOT EXISTS(SELECT * FROM master.dbo.IP_RESTRICTION
WHERE UserName = SYSTEM_USER AND ValidIP = @host))
BEGIN
ROLLBACK;
END
END
END;
表 IP_RESTRICTION 的 DDL:
CREATE TABLE [dbo].[IP_RESTRICTION](
[UserName] [varchar](255) NOT NULL,
[ValidIP] [varchar](15) NOT NULL,
[Comment] [nvarchar](255) NULL,
CONSTRAINT [PK_IP_RESTRICTION] PRIMARY KEY CLUSTERED
([UserName] ASC, [ValidIP] ASC) ON [PRIMARY]
) ON [PRIMARY]
是的,你可以这样做。您需要按照此处所述编写登录触发器:
http://technet.microsoft.com/en-us/library/bb326598.aspx
在过去的十五分钟里,我一直在玩弄它,但取得的成功有限,但也许这里还有其他人完成了按 IP 地址进行 DDL 登录触发器过滤,可以显示源代码。
几句警告!
如果您发现此脚本有任何问题,并在您意识到之前注销,您将自己锁定在 SQL Server 之外。
然后,您将需要以最小模式离线重新启动服务器 -f
然后在所有服务器上删除触发器 [LOGIN_IP_RESTRICTION]
那你就有机会回来了。我怎么知道?我刚刚犯了那个错误,在我弄清楚如何重新进入并取下扳机之前,我有一些肠子松动的时刻。
我已将系统上的登录限制为单个 IP 地址,只需使用防火墙即可。
SQL Server 可以通过服务器管理器映射到多个端口/IP 配置,但是 AFAIK 没有办法将登录方法绑定到端口/IP。
我唯一能想到的是创建一个触发器 FOR LOGON 并在该触发器内测试事件数据,例如:
SELECT EVENTDATA().value ('(/EVENT_INSTANCE/LoginType)','nvarchar(max)'), EVENTDATA().value ('(/EVENT_INSTANCE/ClientHost)','nvarchar(max)')
...如果您不喜欢您发现的内容,可能会调用 RAISEERROR 或 ROLLBACK 可能会终止连接?
希望这可以帮助
为什么需要通过 IP 地址进行限制?如果您的所有用户都通过了身份验证,只需在 SQL Server 上设置组权限,并允许或拒绝您想要的组。
如果问题是不同用户使用具有相同 SQL 登录名的应用程序(您提到您使用的是混合模式),那么问题是您为什么要允许使用这些应用程序的某些用户访问 SQL Server,而不允许其他用户?在应用程序中实现安全性,不要在数据库级别反弹它们。