我有一个能够删除任何数据库的 sql server 用户。我一直在运行下面的代码来检查用户在 SQL Server 中拥有的权限,但无法确定用户如何能够删除数据库。是否有一个 sql 脚本可以帮助我确定该用户如何删除数据库?是否有命令拒绝他们删除任何数据库?(SSMS 未将用户显示为 dbcreator 角色的一部分)
select USER_NAME(p.grantee_principal_id) AS principal_name,
dp.type_desc AS principal_type_desc,
p.class_desc,
OBJECT_NAME(p.major_id) AS object_name,
p.permission_name,
p.state_desc AS permission_state_desc
from sys.database_permissions p
inner JOIN sys.database_principals dp
on p.grantee_principal_id = dp.principal_id
order by principal_name
如果有帮助,上面查询的输出为用户提供了以下三个记录
class_desc object_name permission_name permission_state_desc OBJECT_OR_COLUMN xp_cmdshell 执行 GRANT DATABASE NULL CONNECT GRANT
DATABASE NULL CREATE DATABASE GRANT
我建议在 master 上运行这个查询
这应该让您很好地了解有权访问您的主数据库的角色,并查看用户是否具有这些角色中的任何一个。您还可以针对任何其他数据库运行此程序,以按数据库级别检查用户对数据库的权限。这应该是帮助追踪的重要工具。
我已经使用了几次并取得了一些不错的效果,下面的代码源可以在这里找到:
继续此处的文档,用户删除数据库的安全要求如下:
您可以明确拒绝对上述权限的许可,但要了解您拒绝的级别可能不会像您想象的那样生效。我记得读过一篇白皮书,其中介绍了 SQL Server 如何在连接时验证用户的权限,但现在无法找到它。如果我记得我可能会拒绝他们连接到数据库,但用户是
sysadmin
角色的一部分这一事实优先。DROP DATABASE
为了确保命令安全,我会专门查看审计。您在那里获得的查询将仅列出您运行它的数据库的权限。获得删除数据库权限的一种方法是更改任何数据库,这是服务器级别的权限。要检查这些,请尝试以下查询:
换句话说,用户可能会在服务器登录级别而不是数据库用户级别获得删除数据库的权限。