SQL SERVER数据库中GUEST用户
问题
谁邀请这些客人(guest)到我的数据库中?你可知道在你的SQL SERVER数据库中还存在guest用户?你可知道SQL SERVER 需要guest用户来实现些特殊功能,且这些功能在2000和2005是不同的?你可知道你的SQL SERVER 2000或2005数据库中有guset用户登录?你可考虑过这是个问题或者你的SQL SERVER就是需要这样?
解决
SQL SERVER2000和2005中都存在guest用户,我模糊的记得早在SQL SERVER6.5或更早的时候就有guest用户了。guest用户用在没有明确权限分配的情况下跨数据库存取对象的。该用户依赖于部分SQL SERVER2000的系统函数(master和tempdb库中),且用来维护SQL Server服务器的正常运行。不幸的是,从应用程序的角度来看,guest用户在某些方面被看成是一种威胁,此种威胁在用户定义的数据库中可被解决。
Guest用户真是我的SQL SERVER的威胁吗?
答案因SQL SERVER 2000还是2005而异,还跟你需要的数据的安全层次有关。下面是一些需要考虑的关键点:
1.SQL SERVER 2000 :因为guest用户存在于Model数据库中,所以该用户存在于所有数据库中,当然也包括用户创建的数据库。为了使SQL SERVER能正常工作,guest用户在Master和tempdb两个数据库中必须存在,不能被删除。至于其它用户定义的数据库中是否需要guest用户依赖于应用程序,并且必须要彻底地测试。
2.SQL SERVER 2005 :随着架构的使用,数据库用户和对象之间比SQL SERVER2000又添加了一个安全层。尽管guest用户必须存在于SQL SERVER 2005的用户和系统的数据库中,发挥着和SQL SERVER2000中相同的作用。Guest用户不能被删除,但是guest用户可被取消CONNECT权限。(译者注:SQL SERVER 2000中guest用户可以删除;而2005中是不能删除的,却可以取消CONNECT权限,而且为安全起见,所有用户定义的数据库中缺省情况下guest用户的权限都是被取消了的。 )
3.数据安全 :如果你想你的数据不会被错误的存取,那么请使用下面的代码,看看是否存在或是否激活了guest用户。然后决定你的应用程序是否需要用guest用户而不明确授予其权限。
是否真的需要Guest用户?
正如前面提到,SQL SERVER 2000和2005中的master和tempdb数据库总是需要guest用户。另一个需要guest用户的地方就是SQL SERVER 2000企业版中自带的缺省的日志传送(log shipping)功能。
注意:另外可能需要guest用户的地方依赖于:SQL SERVER的缺省功能和第三方/客户应用程序时如何开发的。就后一点而言,你需要先彻底检测你的应用程序,然后再修改guest用户的权限。
我如何发现是否存在guest用户?
请在每个数据库中使用下面的代码来判断是否存在guest用户(SQL SERVER 2000和2005都行):
EXEC sp_MSforeachdb 'USE [?];
SELECT * FROM sysusers;'
GO
Guest用户映射到哪个登陆账号?
这是关键点:guest用户不需要映射到登录名。这种用户账号是供数据库中没有明确授予权限给已映射至认证用户使用的。(译注:guest供那些已经成功登录到SQL SERVER实例,但是却没有通过用户访问数据库的权限的登录者使用的。)
我该如何避免依赖于guest用户?
在SQL SERVER 2000中有部分系统功能需要用到guest用户。所以想不破坏SQL SERVER的禁用这部分功能是不行的。但是商业应用程序应当明确分配权限。
我应当做那类测试?
1. 应当特别注意所有访问多数据库的应用程序。
2. 依据一个综合应用程序测试计划,测试你的所有应用程序。
3. 实现管理功能的例行程序。
4. 哪些每夜,每周或每月执行所有的批处理。
5. 运行的所有第三方应用程序。
6. 确定你的开发和测试环境与最终的产品在guest用户的配置上一致。
我该如何删除/禁止guest账号?
一旦你彻底的测试了你的应用程序,你可以通过下面的代码删除/禁止guest用户账号:
--SQL Server 2000
USE <Database Name>
GO
EXEC sp_revokedbaccess 'guest'
GO
-- SQL Server 2005
USE <Database Name>
GO
REVOKE CONNECT FROM GUEST
GO
下一步
如果你现在(译注:原文有误)对guest用户比较熟悉了,那么可以进一步的检查一下你的SQL SERVER,看看有guest被使用。
如果guest账户被使用,并且发现有数据攻击的苗头,请按下面的步骤:
1. 研究一下不使用guest账号需要授予的权限。
2. 在测试环境中授予所需权限。
3. 测试你的应用程序
4. 为SQL SERVER和应用程序的相关代码生成回滚的脚本代码
5. 测试回滚脚本代码
6. 一旦在测试环境中通过测试,就可以部署产品了。
7. 为应用程序作后期测试来决定是否改变成功还是代码需要回滚。
原文地址:
http://www.mssqltips.com/tip.asp?tip=1172