0

在我们的环境中,任何使用 sa 登录的用户都可以更改任何表数据。

所以我编写触发器来捕获更改的数据,例如谁更改,来自哪个 IP 等

CREATE TRIGGER [TRG_Users]
ON [dbo].[UserRights] AFTER INSERT, UPDATE, DELETE
AS

DECLARE @strIP VARCHAR(MAX)

SET @strIP=(SELECT dbo.GetCurrentIP())

IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
    --PRINT 'Update happened';
    INSERT INTO Logger(IPAddress,Status)
    VALUES (@strIP,'UPDATE')
ELSE
IF EXISTS (SELECT * FROM INSERTED)
    --PRINT 'Insert happened';
    INSERT INTO Logger(IPAddress,Status)
    VALUES (@strIP,'INSERT')
ELSE
    --PRINT 'Delete happened';
    INSERT INTO Logger(IPAddress,Status)
    VALUES (@strIP,'DELETE')


CREATE FUNCTION [dbo].[GetCurrentIP] ()  
RETURNS varchar(255)  
AS  
BEGIN  
   DECLARE @IP_Address varchar(255);  

   SELECT @IP_Address = client_net_address  
   FROM sys.dm_exec_connections  
   WHERE Session_id = @@SPID;  

  Return @IP_Address;  
  END  

但问题是用户可以在禁用特定表上的触发器后更改数据。因此触发器不会触发,用户可以无缝更改数据。

所以请指导我什么是捕获数据更改并记录它们的最佳方法。所以没有人可以绕过安全性。请不要告诉我禁用 sa 帐户,因为我正在寻找不同的方法来捕获更改数据。sql server 2005/2008 中是否存在任何安全方式,如果是,请在此处讨论。谢谢

4

1 回答 1

3

SA 的问题在于,此登录(或任何其他 sysadmin 角色登录)都跳过了所有安全检查。因此,您无法撤销 SA 的任何特权,并且您在实例级别上也无能为力,SA 无法绕过。

就像其他人已经说过的那样,除非有真正的系统管理员工作要做,否则不要让任何人以系统管理员身份登录。最佳做法是完全禁用 SA 登录。

在建设性方面,最好的办法是创建 SQL Server 审计会话并使用 Windows 安全日志作为目标。这样您至少会知道谁以及何时停止审计。

于 2014-04-14T14:22:03.173 回答