Sql-Server

有沒有辦法拒絕對來自連結伺服器的連接進行 CRUD 操作?

  • May 30, 2012

我有一個 SQL Server 實例RPT1(2008 R2),它是為“高級使用者”設置的,以執行他們自己的查詢。該伺服器連結到我們的生產報告伺服器PRD1(SQL Server 2008 實例),並帶有直接RPT1查詢連結伺服器 ( PRD1) 的視圖 (on )。

已使用需要能夠在伺服器上進行 CRUD(用於報告審計等)的帳戶創建連結伺服器。

隨著使用者變得成熟,他們也請求更大的權限(例如,創建他們自己的視圖)。我想確保他們不會在連結伺服器上執行任何 CRUD 操作,但與之鍊接的帳戶具有這些權限。

我看到的第一個解決路徑是創建一個具有較低權限的不同使用者,然後重新連結伺服器。

我的第二條路徑是查看是否有辦法在伺服器上顯式地對來自連結伺服器的連接進行DENYCRUD 。PRD1

是否可以僅從連結中明確拒絕 CRUD?還是我應該簡單地著手用不同的帳戶重新連結伺服器?我忽略了另一個明顯的解決方案嗎?

您是否看過設置伺服器範圍的 DDL 觸發器?我已在多個生產伺服器上成功使用它來阻止開發人員進行的未經授權的更改。我加入了一家所有開發人員都擁有完全 SA 訪問權限的公司。

當我們試圖改變他們的權利時,我們發生了一場全面的革命,因為開發人員突然“無法完成他們的工作”。所以我使用了一個伺服器範圍的 DDL 觸發器來限制他們可以做什麼。這很簡單。

我創建了一個名為 AuthorizedDDLUser 的表,它的結構非常簡單,如下所示:

CREATE TABLE [dbo].[AuthorizedDDLUser](
   [Username] [nvarchar](256) NOT NULL,
   CONSTRAINT [PK_AuthorizedDDLUser] PRIMARY KEY CLUSTERED 
   (
     [Username] ASC
    )
   WITH (
          PAD_INDEX  = OFF
          , STATISTICS_NORECOMPUTE  = OFF
          , IGNORE_DUP_KEY = OFF
          , ALLOW_ROW_LOCKS  = ON
          , ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
   ) ON [PRIMARY]

 GO

然後我插入了允許進行更改的開發人員的登錄名(即 DBA 團隊和高級 SQL 開發人員)。

然後我創建了一個與此類似的伺服器範圍的 DDL 觸發器:

CREATE TRIGGER [block_ddl]
ON SERVER
FOR CREATE_PROCEDURE,ALTER_PROCEDURE, DROP_PROCEDURE, 
   CREATE_TABLE,ALTER_TABLE, DROP_TABLE, 
   CREATE_FUNCTION,ALTER_FUNCTION, DROP_FUNCTION, 
   CREATE_INDEX,ALTER_INDEX, DROP_INDEX, 
   CREATE_VIEW,ALTER_VIEW, DROP_VIEW,
   CREATE_TRIGGER,ALTER_TRIGGER, DROP_TRIGGER
AS
   IF NOT EXISTS(SELECT UserName FROM AuthorizedDDLUser WHERE UserName=CURRENT_USER)
   BEGIN
           //RAISE CUSTOM ERROR MESSAGE HERE AND ROLLBACK THE TRANSACTION 
           // ROLLING BACK EFFECTIVELY CANCELS THE DDL STATEMENT
           ROLLBACK TRANSACTION --
   END

我的實施涉及更多一點,因為它也進行了審計。但是我試圖在這裡保持簡單。

因此,簡而言之,您可以有選擇地限制連結使用者可以在系統上執行的操作。要真正開始使用,我建議您閱讀以下文章。

  1. 使用 DDL 觸發器阻止 SQL Server 中的架構更改:http ://www.mssqltips.com/sqlservertip/2646/using-a-ddl-trigger-to-block-schema-changes-in-sql-server/
  2. 在 SQL Server 2005 中審核 DDL(創建、更改、刪除)命令:http ://www.mssqltips.com/sqlservertip/1006/auditing-ddl-create-alter-drop-commands-in-sql-server-2005/
  3. DDL 事件列表:http: //msdn.microsoft.com/en-us/ms189540.aspx
  4. DDL 觸發器:http: //msdn.microsoft.com/en-us/library/ms175941.aspx
  5. 在 SQL Server 2005 中將 EventData() 函式與 DDL 觸發器一起使用:http ://www.mssqltips.com/sqlservertip/1571/using-the-eventdata-function-with-ddl-triggers-in-sql-server-2005/

所以在我的情況下,開發人員仍然可以做任何事情,除了搞砸我的系統。最終,我們讓他們擺脫了 SA 訪問權限,並且由於 DDL 觸發器,我的生活再次變得正常。

希望有幫助!

更新:

感謝 Martin Smith 指出這些是在觸發器之後。直到現在我才意識到的東西(你每天都在學習)。MSDN 文章非常令人困惑,因為它表明它既是前觸發器又是後觸發器。所以是的,如果像 Martin 說的那樣,你在一個相當大的表上回滾索引建構,這可能會帶來一些潛在的性能問題。但是,如果您只是要阻止創建視圖和表格,那麼應該沒問題。

所以明智地使用。

他們確實需要解決此問題,因為它限制了此功能的可用性。

引用自:https://dba.stackexchange.com/questions/18371