Sql server 通过TSQL实现SQL Server安全

Sql server 通过TSQL实现SQL Server安全,sql-server,security,tsql,Sql Server,Security,Tsql,我想构造一个transact-sql脚本,该脚本将阻止指定人员对所有数据库运行某些命令: drop database, drop table or preferbly drop * delete update 这可能吗? 用户将已经有权访问服务器 注意:我不是要为服务器开发安全模型,也不是为了防止恶意攻击。这是一个现有服务器,用户可以通过其所属的各种Windows组拥有一系列访问权限。我只是想知道是否有一种快速的保护措施来防止人们在错误的服务器上错误地运行命令。(警告,这是每个数据库;我不

我想构造一个transact-sql脚本,该脚本将阻止指定人员对所有数据库运行某些命令:

drop database, drop table or preferbly drop *

delete

update
这可能吗? 用户将已经有权访问服务器

注意:我不是要为服务器开发安全模型,也不是为了防止恶意攻击。这是一个现有服务器,用户可以通过其所属的各种Windows组拥有一系列访问权限。我只是想知道是否有一种快速的保护措施来防止人们在错误的服务器上错误地运行命令。

警告,这是每个数据库;我不知道服务器范围内的任何东西,因为数据库是主要的独立单元)

假设您的用户不是模式(或dbo)的所有者?在这种情况下,除非你同意,否则他们不应该获得任何东西。所以,不要去做他们不需要的访问,不要去做任何你不正确授予的访问,不要去做任何你绝对不想让他们做的事情


另请参见。

我知道可靠地限制特定权限的唯一方法是使用存储过程。非常安全,但不是动态的

存储过程提供了重要的 安全方面的好处。通过 使用存储过程,您可以 向某些用户授予访问权限 访问数据,减少巨大的成本 您需要在应用程序中进行的编码 客户端应用程序。这是其中之一 控制访问权限的最佳方法 你的数据


您无法真正检查是否看到drop命令,因为有人可能会执行类似的操作

想象一下,这是exec而不是print

print ( convert(varchar(50), 0x64726F7020646174616261736520616263))
您可以为它们提供只读访问权限,并为exec提供仅对存储过程的访问权限

您还可以使用DDL触发器

这里有一个例子

CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You are not allowed to drop or alter tables!' 
   ROLLBACK
;

Cindi-查看DENY permissions命令以获得对用户功能的细粒度控制

不过,我还要问一个更深层次的问题。为什么这些人可以使用SQL命令行访问您的数据库?也就是说,如果他们甚至不能删除或更新记录,那么他们有什么可能的理由被授予访问SQL命令行的权限呢

我真的不认为你需要知道如何拒绝权限。您需要重新考虑您的总体数据访问策略,以避免向这些人提供任何帐户。听起来您需要仅通过前端应用程序对他们的数据访问进行限制


更新:我能想象的一种情况是,如果你有一些人只生成报告,那么这是有意义的。在这种情况下,您应该创建一个具有“全面拒绝”状态的帐户,然后仅对Select和特定的存储过程(仅对那些提取对报表有用的数据的存储过程)授予权限。

当我在目前工作的地方使用SQL Server时,我不太关心它的安全方面。我想您可以对SQL Server执行与Oracle相同的操作(在Oracle中我有更多的经验)

撤销所有访问权限,然后重新添加每个用户所需的访问权限。使用用户组帮助将它们聚集在一起,以便于权限管理

看起来您要限制的用户应该只有:

  • 连接到服务器(并可能选择数据库)所需的任何权限
  • 选择访问特定架构中的所有表和视图
  • 插入对特定架构中所有表的访问权限
  • 可能对中的某些存储过程执行权限 某些模式

如果您使用的是SQL Server 2005或2008,最好的答案是已经给出的答案,即DDL触发器。正确编写的DDL触发器甚至会阻止具有系统管理员权限的人执行任何类型的DDL操作。系统管理员可以禁用触发器以执行工作,也可以编写触发器以允许某些人执行工作,因此您仍然可以根据需要进行修改


如果您使用的是SQL Server 2000(或更低版本),您唯一的办法就是检查每个登录/用户的安全权限。最终,即使您使用的是SQL Server 2005或2008,也需要执行此操作,但在以前的版本中没有快捷方式。

您可以在所有服务器上创建DDL触发器,请参见此处,即使如此,我还是建议使用比SQL命令行更健壮的前端。为什么?定制报告怎么样?让数据库管理数据的安全性。它已经被测试得比任何你可以编写来处理安全问题的应用都要彻底得多。在政府领域(至少在我工作的地方),应用程序级安全是一个巨大的安全禁忌。