有没有办法拒绝对来自链接服务器的连接进行 CRUD 操作?

swa*_*eck 7 sql-server-2008 sql-server permissions sql-server-2008-r2 linked-server

我有一个 SQL Server 实例RPT1(2008 R2),它是为“高级用户”设置的,可以运行他们自己的查询。此服务器链接到我们的生产报告服务器PRD1(SQL Server 2008 实例),具有直接RPT1查询链接服务器 ( PRD1) 的视图 (on ) 。

已使用需要在服务器上进行 CRUD 的帐户创建链接服务器(用于报告审核等)。

随着用户的成熟,他们也会请求更大的权限(例如创建自己的视图)。我想确保他们不会在链接的服务器上执行任何 CRUD 操作,但链接的帐户具有这些权限。

我看到的第一个解析路径是创建一个不同的用户,权限较低,然后重新链接服务器。

我的第二条路径是查看是否有办法DENYPRD1服务器上为来自链接服务器的连接显式CRUD 。

是否可以仅从链接中明确拒绝 CRUD?或者我应该简单地将服务器与不同的帐户重新链接?我忽略了另一个明显的解决方案吗?

Nam*_*ian 4

您是否考虑过设置服务器范围的 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
Run Code Online (Sandbox Code Playgroud)

然后我插入了我允许更改的开发人员的登录名(即 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
Run Code Online (Sandbox Code Playgroud)

我的实施涉及更多一点,因为它还进行审计。不过,我在这里尽量保持简单。

简而言之,您可以有选择地限制链接用户可以在系统上执行的操作。要真正开始使用此功能,我建议您阅读以下文章。

  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 触发器,我的生活再次变得正常。

希望有帮助!

更新:

感谢马丁·史密斯指出这些都是后触发因素。直到现在我才意识到一些事情(你每天都在学习)。MSDN 文章非常令人困惑,因为它表明它既是之前触发器又是之后触发器。因此,是的,如果像 Martin 所说的那样回滚在相当大的表上构建的索引,这可能会带来一些潜在的性能问题。但是,如果您只是要阻止创建视图和表,那么应该没问题。

所以要明智地使用。

他们确实需要解决这个问题,因为它限制了此功能的可用性。

  • 值得指出的是,这些都是在触发器之后发生的,因此只会在事后回滚。例如,在大表上执行“CREATE_INDEX”,然后进行回滚,仍然可能造成相当大的损害。 (2认同)