SQL Server用别名用户的安全问题

  SQL Server有很多很好用的小功能,但是有时候这些功能反过来给你制造麻烦。其中一个这样的问题是别名用户的使用。本技巧教你如何在数据库中建立别名用户时找到安全漏洞,不过在SQL Server 2008种不推荐这个功能。

  首先,你可以对每个数据库运行下面的简单查询或者针对所有数据库操作它来运行以便找到带有“dbo”访问权限的用户。

  SELECT DISTINCT DB_NAME() DATABASE_NAME,

  SU.NAME DATABASE_USERNAME

  FROM SYSUSERS SU

  JOIN SYSMEMBERS SM

  ON SM.MEMBERUID = SU.UID

  INNER JOIN SYSMEMBERS SM1

  ON SM.MEMBERUID = SM1.MEMBERUID

  INNER JOIN SYSUSERS SU1

  ON SM1.GROUPUID = SU1.UID

  AND SU1.NAME = ‘db_owner‘

  AND SU.NAME ‘dbo‘

  但是,此查询可能不能找到所有具有“dbo”访问权限的用户,因为SQL Server 中的一个安全漏洞。让我来解释这个问题。

  让我们创建两个登录,AliasUser1和DBUser1.

  别名AliasUser1分配给“dbo”角色。

  把用户DBUser1添加到角色“dbo”中,假如我们需要把“dbo”权限授给一个数据库用户,那么这是一种很正常的行为。

  下面的脚本将为我们做这些动作:

  IF NOT EXISTS (SELECT

  FROM SYS.SERVER_PRINCIPALS

  WHERE NAME = N‘AliasUser1‘)

  CREATE LOGIN [AliasUser1]

  WITH PASSWORD=N‘test‘, DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english],

  CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

  GO

  IF NOT EXISTS (SELECT

  FROM SYS.SERVER_PRINCIPALS

  WHERE NAME = N‘DBUser1’)

  CREATE LOGIN [DBUser1]

  WITH PASSWORD=N‘test‘, DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english],

  CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

  GO

  --add a aliased user with dbo priveleges

  exec sp_addalias ‘AliasUser1‘,‘dbo‘

  --add a regular db user to the dbo role

  CREATE USER [DBUser1] FOR LOGIN [DBUser1]

  现在,让我们从SSMS中检验我们刚创建的用户。注重,我们别名到“dbo”中的“AliasUser1”没有在用户下面出现。SQL Server没有在“用户”列表中显示别名用户。

  那么我们要如何找到一个数据库中的别名用户呢?执行下面的查询:

  selectfrom sys.sysusers

  在下面的结果集中,我们看到“AliasUser1”前面有一个““”,假如我们检查字段“isaliased”,在右边的第三个字段,那么它有一个为1的值。

  下面的命令也能运行来显示所有的用户和别名。在下面的输出结果中,你可以看到别名用户“AliasUser1”没有作为一个用户出现,但是在第二个结果集中它作为一个别名用户出现。

  exec sp_helpuser

  另一个需要注重的有趣之处是,你不能使用sp_dropuser存储过程来删除一个别名用户,相反,要使用sp_dropalias来删除。

  通过一个登录使用一个到“dbo”的别名,这将让你完全访问自己的数据库,例如一个db_owner.不足之处是在SSMS中没有一个地方可以看到这个过程。你可以自己尝试。在其中一个你自己数据库中按照下面的步骤,然后使用登录“AliasUser1”和密码“test”,你可以看到该登录可以在你创建别名的数据库中进行任何它想要的行为。

  下一步骤

  针对你的数据库运行sp_helpuser,看看你是否建立了别名。

  假如有别名用户具有“dbo”级别的权限,那么看看删除这些并使用下面所述的角色。

  这个别名功能被微软阻止了很长一段时间,但是它仍然在2005中使用。我认为这是基于向后兼容的考虑。该功能在SQL 2008中取消了。

  因此,假如你的应用程序正在使用别名,而它在SQL 2008中不能使用,那么使用上面提到的不同方法试试。

时间: 2024-08-31 12:33:48

SQL Server用别名用户的安全问题的相关文章

终止SQL Server中的用户进程方法

一.情景:在很多情况下,往往会要求数据库管理员终止SQL Server中的用户进程.本文将为大家介绍如何创建一个简单的存储过程来实现同时终止多个会话.结束连续的会话和结束连接到数据库的所有会话等功能. 在很多情况下,往往会要求数据库管理员终止SQL Server中的用户进程,例如在停止某个数据库的运作时,或者还原数据库之前,或者长时间运行活动事务等情况下.数据库管理员通常会使用SQL Server中提供的"KILL"命令来完成任务. 但是,SQL Server提供的"KILL

图片-SQL server创建新用户出现问题,如何解决?

问题描述 SQL server创建新用户出现问题,如何解决? 解决方案 XZU1是Windows登陆的用户名表现形式,要Windows(域或本机)有这个用户才行.不能从SqlServer去创建操作系统的用户

SQL Server中授予用户查看对象定义的权限

SQL Server中授予用户查看对象定义的权限   在SQL Server中,有时候需要给一些登录名(用户)授予查看所有或部分对象(存储过程.函数.视图.表)的定义权限存.如果是部分存储过程.函数.视图授予查看定义的权限,那么就像下面脚本所示,比较繁琐:     GRANT VIEW DEFINITION ON  YOUR_PROCEDURE TO   USERNAME;   GRANT VIEW DEFINITION ON  YOUR_FUNCTION TO USERNAME;   GRAN

SQL Server 2008 R2用户'sa'登录失败(错误18456)

SQL Server 2008 R2用户'sa'登录失败(错误18456),如下图: 解决办法: 1.首先用windows身份登录,有如下界面: 2.右键实例-->属性,选择[安全性],选择身份验证方式: 3.右键实例-->[重新启动] 4.选择[安全性]-->[登录名]-->[sa] 5.双击[sa],出现下面视图,点击[常规],设置新的密码 6.选择[状态],修改为如下设置 重新登录即可,如果还是提示标题的错误,可以在登录的时候不使用sql server记忆的密码,自己载输入一

SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法

以下仅为参照,如果有多个实例,可能会有些许不同: 本环境是SQL Server 2005 Standard Version 64-bit 和 SQL Server 2008 Standard Version 64-bit 双实例同时安装在一个 Windows Server 2008 Standard Version 64-bit OS上: 代码 复制代码 代码如下: Windows Server 2008 Standard Version 64-bit SQL Server 2005 Stand

使用SQL语句赋予SQL Server数据库登录用户权限

server|数据|数据库|用户权限|语句 GRANT在安全系统中创建项目,使当前数据库中的用户得以处理当前数据库中的数据或执行特定的 Transact-SQL 语句.语法语句权限: GRANT { ALL | statement [ ,...n ] } TO security_account [ ,...n ] 对象权限: GRANT    { ALL [ PRIVILEGES ] | permission [ ,...n ] }    {         [ ( column [ ,...n

使用SQL语句取消SQL Server数据库登录用户权限

server|数据|数据库|用户权限|语句 REVOKE删除以前在当前数据库内的用户上授予或拒绝的权限.语法语句权限: REVOKE { ALL | statement [ ,...n ] } FROM security_account [ ,...n ] 对象权限: REVOKE [ GRANT OPTION FOR ]    { ALL [ PRIVILEGES ] | permission [ ,...n ] }    {         [ ( column [ ,...n ] ) ]

SQL Server 2005 控制用户权限访问表

一.需求 在管理数据库过程中,我们经常需要控制某个用户访问数据库的权限,比如只需要给这个用户访问某个表的权限,甚至是CRUD的权限,更小粒度的还可以去到某几个字段的访问权限.写这篇文章就是说明下这个操作过程. 其实这只是SQL Server权限管理很简单的一小块,有些地方并没有深入理解和讲述,只是希望对一些刚入门的童鞋有帮助,其它大侠就当是:我当堂吓一跳,然后得啖笑.(赌圣) 二.操作步骤 1. 首先进入数据库级别的[安全性]-[登录名]-[新建登录名] (图1:新建登录名) 2. 在[常规]选

SQL Server解决孤立用户浅析

孤立用户概念        所谓孤立用户即指在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例. 这样的用户被称为此服务器实例上的数据库的"孤立用户". 如果删除了对应的 SQL Server 登录名,则数据库用户可能会变为孤立用户. 另外,在数据库还原或附加到 SQL Server 的其他实例之后,数据库用户也可能变为孤立用户. 如果未在新服务器实例中提供数据库用户映射到的 SID,则该用户可能变为孤立用户 检测孤立用户 检测孤立用户相当简