22.6 更高级的安全性
实际上,本节不过是关于“另外要考虑的问题”的一节。这一节中的所有内容都位于本章前面阐释的基本规则的范围之外,但是,它们提供了一些问题的解决思路,并且,也给出了如何关闭系统中一些常见漏洞的方法。
22.6.1 关于guest账户应该怎么办
guest账户提供了一种拥有默认访问权限的方法。当激活guest账户时,会发生如下一些事情:
l 对于没有明确授予登录账户对其进行访问的权限的数据库,登录账户能获得guest级别的访问权限。
l 外部的用户能够通过guest账户进行登录,从而获得访问权限。虽然,这需要他们知道guest的密码,但是,他们已经知道该用户是存在的(他们或许也知道sa账户是存在的)。
就我个人而言,我对SQL Server首先要做的事情之一就是,去除guest账户所拥有的每一点访问权限。这是一个漏洞,它最终会以你不曾意识到的方式提供访问权限(你或许认为,当给某人指派权限时,你所指派的权限就是此人拥有的所有权限。但是,在激活了guest时,就不一定是这样了)。建议你跟我一样。
然而,我意识到,实际上guest账户能提供一种很圆滑的用途——当它与应用程序角色一起使用时。在这种情况下,guest账户能够访问数据库,但是,除了登录到数据库中外,它没有任何权限——guest账户只是让登录成为数据库中“当前的”登录。然后,就能够使用sp_setapprole来激活应用程序角色,于是,就有了一种方式,可以让匿名用户登录到服务器中,并具有适当的权限。尽管如此,如果要使用应用程序,只有在执行了任何可用的登录后才能够使用。
这绝对是想要保护应用程序角色的密码的场景,就好像你的工作都靠它一样(可能是这样的)。请使用ODBC加密选项——尤其是当连接是通过因特网进行时!
22.6.2 TCP/IP端口设置
默认情况下,在使用TCP/IP时,SQL Server会使用1433端口号。可以把端口想成是类似无线电信道的东西——在什么信道上进行广播并不重要,如果没有任何人侦听那个信道,则这样做没什么用处。
让端口设置保持默认值1433可能会非常方便——如果没有另外指定的话,所有的客户都将自动使用1433端口,因此,这意味着如果就这样听其自然,那么,关于设置是否正确的问题,你少了一件要担心的事情。
然而,问题在于任何潜在的SQL Server黑客也同样知道,在所有的SQL Server中,大约有99%都会侦听1433端口。如果你的SQL Server有直接到因特网的连接,我强烈建议将端口更改为非标准的端口号——与你的网络管理员商量,看看他(或她)推荐以什么端口作为可用的端口。只是要记住,当修改了服务器“侦听”的端口时,同时也需要修改所有基于IP的客户端所使用的端口。例如,如果要更改为使用1402端口,我们可以进入到客户端网络实用工具,并用1402作为要使用的IP端口为我们的服务器建立一个特定的条目。
从SQL Server 2000开始,我们还有一个选择,这就是让客户端通过选中动态确定端口框来动态确定端口。
22.6.3 别使用sa账户
所有在SQL Server上学习过10分钟以上的人,都会对系统管理员账户有一些了解。现在,SQL Server有了sysadmin固定服务器角色,我强烈建议把真实的登录账户添加到那个角色中,然后,将sa的密码更改为非常长并且非常难以理解的密码——不值得为了潜入系统而在这样的密码上耗费时间。如果只需要Windows安全性,则关闭SQL Server安全性,那样的话,就可以一劳永逸地处理有关sa账户的问题。
22.6.4 让xp_cmdshell保持隐秘
你准备授予谁使用xp_cmdshell的访问权限,在这一问题上一定要非常小心。它可以运行任何DOS或Windows命令提示符命令。授予了用户多大的权限,这取决于SQL Server运行在什么账户之下。如果是系统账户(多数是这样),则xp_cmdshell的用户将拥有到服务器的很高的访问权限(例如,他们能够把文件从网络的其他地方复制到服务器上,然后执行这些文件)。让我们再提高一点利害关系:在Windows域管理员账户的安全上下文之下,有大量的服务器运行于其中,现在,任何使用xp_cmdshell的人,对你的整个网络访问都拥有相当开放的访问权限。
对于所有你不预备给予其对服务器甚至对域的管理权限的人,不要给予他们到xp_cmdshell的访问权限。
22.6.5 不要忘记作为安全手段的视图、存储过程以及UDF
记得视图、存储过程和UDF都在隐藏数据的问题上做出了大量的贡献。通常,视图能够取代列级安全性。它们能迷惑用户,让用户以为访问到了整张表,而实际上,只访问到了整张表的子集(还记得我们筛选敏感的雇员信息的例子吗?如工资信息?)。存储过程和UDF能够做的事情大致相同——你能够授予对存储过程或UDF执行的权限,但是,那并不意味着用户从表中得到了所有的数据(用户得到的是存储过程或UDF给予他们的)——最终的用户甚至不知道是由什么底层表提供的数据。此外,视图、存储过程和UDF有它们自己隐含的权限——即是说,不能因为视图和存储过程使用表,就意味着用户具有对那个表的访问权限。






