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 に答える