到SQL Server安全级别2的阶梯:身份验证
此系列
本文是阶梯系列的一部分:通往SQLServer安全的阶梯
SQLServer拥有你所需要的一切来保护服务器和数据免受当今复杂的攻击。但在有效使用这些安全特性之前,需要了解所面临的威胁和一些基本的安全概念。第一个阶梯级别提供了一个基础,以便你可以充分利用SQLServer中的安全特性,而不浪费时间来保护你的数据免受特定威胁。
身份验证是验证需要访问SQLServer数据库的主用户或进程是谁或它声称的过程的过程。主体需要唯一的标识,以便SQLServer可以确定主体有哪些权限,如果有的话。正确的身份验证是提供对数据库对象安全访问的必要的第一步。
SQLServer支持两种身份验证路径:Windows集成身份验证和SQLServer身份验证。你使用的路径取决于网络环境、将访问数据库的应用程序类型和这些应用程序的用户类型。
Windows身份验证:这种身份验证依赖于Windows在用户登录到Windows时执行重启验证身份。然后将访问SQLServer对象的权限分配给Windows登录。只有当SQLServer在支持Windows NT或Kerberos身份验证的Windows版本上运行时,这种类型的身份验证才可用,这从Windows 2000以来几乎都是标准的。
SQLServer身份验证:SQLServer可以完全独立地进行身份验证。在这种情况下,你可以在SQLServer和密码中创建名为Login的唯一用户名。用户或应用程序连接到SQLServer并为访问提供这些凭据。然后直接或通过角色中的成员资格将权限分配给该登录。
在SQLServer中配置身份验证不是这两种类型之间的简单选择。你可以通过两种方式来配置身份验证:
混合模式身份验证:服务器支持SQLServer和Windows身份验证。
仅Windows模式:服务器只支持Windows身份验证。
微软强烈建议尽可能使用Windows身份验证。Windows具有强大的身份验证选项,包括密码策略,但Windows身份验证在实际应用程序中并不总是实用的。SQLServer身份验证可以钩住一些Windows身份验证功能,但它并不安全。
Windows身份验证
如果将SQL Server配置为在Windows身份验证模式下运行,SQLServer将与WindowsServer承担信任关系。它假设Windows在登录到Windows时对用户进行了身份验证。然后,SQLServer检查用户帐户、任何Windows组和任何SQL Server角色,用户可能是其中的一个成员,以确定该用户是否可以与各种SQLServer对象一起工作。
Windows身份验证具有优于SQLServer身份验证的几个优点,包括:
用户的单一登录,因此她不必单独登录到SQLServer
审计特点
简化登录管理
密码策略(在Windows Server2003和以后)
Windows身份验证的另一大优点是,你对Windows用户和组的任何更改都会自动反映在SQLServer中,因此你不必单独管理它们。但是,如果在Windows用户连接到SQLServer时对其进行更改,那么这些更改将在下次用户连接到SQLServer时生效。
配置SQLServer安全设置
安装SQLServer时,可以选择服务器实例允许的身份验证模式。稍后,你可以更改SQLServer Management Studio中可用的“服务器属性”对话框中的设置。这些设置适用于SQLServer实例中的所有数据库和其他对象。因此,如果需要对任何数据库使用SQLServer身份验证,则必须为服务器设置混合模式。
图2.1显示了ManagementStudio中的服务器属性对话框,其中选择了安全页面。若要打开此对话框,请右击对象资源管理器中的服务器实例名称,并从弹出菜单中选择属性,然后转到安全页面。通过单击适当的单选按钮并单击OK提交更改,即可更改验证模式。
图2.1 配置SQLServer实例的验证模式。
添加Windows登录
要使用Windows身份验证,用户在访问SQLServer之前需要一个有效的Windows登录帐户。然后,你可以将权限授予Windows组以连接到SQLServer,或者如果你不想授予集体权限,则可以授予单个Windows用户的权限。
使用ManagementStudio来管理安全性的一个好处是,你可以同时设置登录并提供数据库访问。为了使Windows登录可以访问SQLServer和AdvyWorks2012数据库,请使用以下步骤,假定本地机器已经定义了JoestAuto登录。
打开SQLServerManagement Studio并确保对象资源管理器窗口可见并连接到SQLServer实例。
展开服务器对象的树视图,然后展开安全部分。你将看到几个子节点,如图2.2所示。
图2.2 服务器的对象资源管理器的安全部分,你可以在其中定义登录。
右键单击登录节点并从弹出菜单中选择新登录以打开登录-新对话框。
请确保选中Windows身份验证单选按钮。
你可以通过两种方式来选择Windows登录。第一种方法是直接键入域或机器名,然后使用反斜杠和用户的Windows登录名。第二种,通常更容易的方法是单击“搜索”按钮来打开“选择用户或组”对话框。键入用户名并单击“检查名称”按钮以找到确切名称。如果找到了用户,全名将出现在框中,如图2.3所示。单击“确定”以选择该用户。
图2.3 查找要添加到SQLServer的Windows登录名。
在登录-新对话框中,将AdvyWorks2012数据库设置为登录的默认数据库。这是当用户连接到服务器而不指定数据库时使用的数据库。它不限制用户只访问该数据库。图2.4显示了一个名为马拉松的机器上的Windows JoestRoad用户的登录结果,默认数据库设置为AdvaseAdvyWorks2012数据库。
图2.4。登录-新对话框使Windows登录可以访问SQLServer实例。
提示:
决不要将默认数据库设置留给主数据库。我从痛苦的经验中说:连接服务器太容易了,忘记更改数据库。如果你在主数据库中运行一个创建数百个数据库对象的脚本,你将非常繁琐地删除这些对象以清理主数据库。
接下来,让用户访问数据库。从对话框左侧的列表中选择用户映射页。通过检查数据库名称旁边的框,授予用户访问AdvyWorks2012数据库的权限。SQLServer自动将用户映射到数据库中同名的用户,如表中的第三列中所示,尽管你可以更改用户名。在数据库中分配销售作为用户的默认模式,或者通过将其键入默认架构列或单击省略号(…)按钮来从列表中选择它。对话框应该像图2.5所示。
图2.5。授予AdvutuWorks2012数据库的Windows登录访问权限。
提示:
设置默认数据库用于登录和授予对数据库的访问之间存在差异。默认数据库仅意味着当用户登录而不指定数据库时,SQLServer试图将上下文更改为该数据库。但这不允许在数据库中执行任何权限,甚至允许访问数据库。这意味着可以分配一个用户根本无法访问的默认数据库。为了让用户在访问数据库后做任何有用的事情,你需要显式地授予用户权限。
默认情况下,新的Windows登录可以访问服务器。但是,如果要明确拒绝对服务器的登录访问,请从登录左侧的页面列表中选择“状态”-“新建”对话框,然后选择“拒绝单选”按钮。还可以通过选择禁用的按钮暂时禁用登录。图2.6显示了这些选项。
图2.6。授予或拒绝对服务器的访问并暂时禁用登录帐户的选项。
单击OK创建用户。
你还可以以相同的方式向SQLServer添加Windows组。在这种情况下,该组的任何成员都可以访问数据库服务器,无论你将该组访问到数据库中的对象。
使用用户名和密码
当使用SQLServer登录进行身份验证时,客户端应用程序必须提供有效的用户名和密码才能连接到数据库。这些SQL Server登录保存在SQLServer中,不引用Windows。登录时,如果没有帐户与用户名和密码匹配,则SQLServer会引发错误,用户无法访问SQLServer。
尽管Windows身份验证更安全,但在某些情况下,你可能会选择使用SQLServer登录。对于没有广泛安全需求的简单应用程序,SQLServer身份验证更容易管理,并且允许你避免与Windows安全性纠缠在一起。如果客户端运行在较旧版本的Windows(基本上是Windows 2000以上的版本)或非Windows操作系统,则必须使用SQLServer登录。
若要创建SQLServer登录,请使用与Windows登录相同的登录新对话框。但不是选择Windows登录,而是键入没有域或机器名称的唯一登录名,并提供密码。例如,图2.7显示了如何创建一个新的SQLServer登录CASPER,并将AdvultWorks2012作为默认数据库。
图2.7 创建SQL Server登录名。
用户映射和状态的所有其他选项都是与Windows登录相同的SQL Server登录。
通过Transact-SQL登录SQL Server
你还可以使用Transact-SQL代码执行相同的操作。清单2.1中的创建登录代码创建了一个具有相当强密码的SQLServer登录:
CREATE LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v';GO清单2.1 用T-SQL创建新SQL Server登录的代码。
然后,为了授予Topaz访问AdvultWorks2012数据库,使用CREATE USER语句并分配默认模式,如清单2.2所示。
USE AdventureWorks2012;GO CREATE USER Topaz FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources;GO清单2.2 创建与SQL Server登录相关的数据库用户的代码。
提示:
与1级阶梯一样,如果你想在SQLServer的本地实例中运行这些代码示例,则可能需要对代码示例进行一些更改。清单2.2中的代码假定你安装了AdvyWorks2012数据库。稍后的代码示例假定你在一个名为马拉松的机器上运行代码,并且在Windows中有一个JoestAuto用户。请随意命名你的机器马拉松或创建具有该名称的用户,或适当地更改代码。
与Windows登录一样,你可以将服务器登录黄玉映射到数据库中的其他名称。清单2.3中的代码将Topaz映射到AdvutuWorks2012数据库中的TopAZD用户:
DROP USER Topaz;GOCREATE USER TopazD FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources;GO清单2.3删除现有用户的代码然后添加一个数据库用户,其名称与登录名不同。
谨防SA登录
如果配置SQL Server以支持SQLServer登录,则有一个内置的SQLServer登录,你需要注意SA登录,你可能注意到在对象资源管理器的登录节点中挂起了SO登录。SA或系统管理员登录主要包括与旧版本的SQLServer的向后兼容性。SA登录被映射到系统管理员固定服务器角色,登录到SQLServer作为SA的任何人都是一个完整的系统管理员,对整个SQL Server实例及其所有数据库具有不可撤销的权限。这确实是一个强大的登录。
不能修改或删除SA登录。如果在安装SQLServer时选择混合模式身份验证,则提示你为SA用户输入密码。没有密码,任何人都可以在没有密码的情况下登录到SA,并玩“让我们管理服务器”。不用说,这是你最不希望用户做的事情。如果其他系统管理员不可用或忘记他们的Windows密码,则只使用SA登录作为后门登录。如果发生这种情况,你可能需要新的管理员!
永远,永远不要使用SA登录来访问应用程序中的数据库。如果黑客能够获得应用程序的控制权,那么这样做可以在数据库服务器上提供黑客管理级别的控制。在遥远的过去,这是一个简单的攻击服务器的方法,是一个可怕的做法。相反,要么设置应用程序使用的自定义Windows或SQLServer登录,然后给该登录提供运行应用程序所必需的绝对最小权限(实现最小特权原则)。
提示:
事实上,你应该考虑使用前面所看到的登录属性对话框的状态页来完全禁用SA登录。这样,攻击者就无法使用这个全能的登录来获得对服务器实例的控制权,无论你是否拥有强大的SA密码。
口令政策与执行
在2005之前的SQLServer版本中,系统管理员没有简单的方法来执行可以帮助系统更安全的密码策略。例如,SQLServer无法强制用户创建一个最小长度的强密码和字母数字和其他字符的混合。如果有人想用一个字母创建一个登录密码,则无法配置SQL Server来阻止它。同样,没有办法使密码定期过期,比如每三个月。有些人正确地认为这是不使用SQL Server登录的一个主要原因。
SQL Server的最新版本可以链接到Windows Server 2003、Windows Vista或更高版本的密码策略中。密码仍然存储在SQL Server中,但SQLServer对NestValuePaseWordPrand()Windows API方法进行调用,该方法最初是在Windows Server 2003中引入的。此API函数将Windows密码策略应用于SQLServer登录,并返回一个值,该值指示密码是否有效。当用户创建、设置或重置密码时,SQLServer调用此函数。
可以通过Windows控件面板的管理工具中的本地安全设置小程序定义Windows密码策略。密码策略部分如图2.8所示,带有默认设置。Applet有一个单独的帐户锁定策略部分,如图2.9所示,当用户尝试登录次数太多时会生效。默认情况下,在新的Windows安装中禁用锁定策略。
图2.8 Windows本地安全策略Applet,显示默认密码策略。
图2.9 Windows本地安全策略applet,显示默认帐户锁定策略。
表2.1列出了密码策略以及默认值以及关于它们如何工作的一些注释。
类别策略名称默认注释
密码策略实施密码历史0密码记住防止用户重用旧密码,如两个密码之间的交替。
最小密码长度0个字符使用这需要更长的密码,使他们更难打破。
密码必须满足复杂度要求,禁用字母数字和其他字符的最小混合,并且不包含用户名。
密码到期最大密码年龄42天,在用户提示更改密码前的天数。
允许用户更改密码前的最小密码年龄0天。
帐户锁定策略帐户锁定时间不适用于分钟,如果锁定阈值被启用,帐户被锁定。
帐户锁定阈值0无效登录尝试在帐户锁定之前尝试不成功的登录尝试的最大次数。
在不可用的时间之后重置帐户锁定计数器,在该分钟之后,重置未成功尝试的计数器;启用锁定阈值时启用。
表2.1。Windows密码策略设置。
在创建登录时,可以启用或禁用密码策略执行。登录-新对话框有一个在登录名下的部分,在创建SQLServer登录时启用,如图2-10所示。
图2-10。为新登录执行密码策略。
当使用Transact-SQL创建登录时,也适用密码策略。例如,如果在Windows 2003服务器上或以后运行SQLServer并启用密码策略,则清单2.4中的代码将失败。
USE master;GOCREATE LOGIN SIMPLEPWD WITH PASSWORD = 'SIMPLEPWD';GO清单2.4 试图用违反密码策略的密码创建登录名。
此代码失败的原因是密码不能与用户名相同。
你可以在创建或更改登录时控制策略。清单2.5中的代码关闭检查过期和策略的选项。
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v', CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF;清单2.5 仅更改登录名以禁用此登录的密码策略的代码。
CufferExpOutlook选项控制SQLServer是否检查策略的密码年龄,并将检查策略应用于其他策略。一个MudioChchange选项可用,强制用户在下一次登录时更改密码。
如果用户在登录锁定策略中设置过多的不成功登录次数,管理员可以使用解锁选项重置帐户,如清单2.6所示。
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK清单2.6 用于解锁登录的代码,因为登录尝试失败太多。
在Windows Server2003之前在Windows版本上运行SQLServer时,可以启用强制密码策略。但是SQLServer使用默认长度为六个字符的默认设置,检查密码与登录名的全部或任何部分不匹配,并且是大写字母、小写字母、数字和其他字符的混合。不能更改这些默认值。但希望你不会在这样一个旧版本的Windows上运行SQLServer,如果仅仅是因为此后的巨大安全改进!
总结
在SQLServer安全性的这个级别中,你已经了解了SQLServer中可用的多个身份验证选项。Windows集成认证是最安全的,但并不总是可行的,微软多年来使SQL Server认证更安全、更安全。但是,如果你使用混合模式认证,别忘了给SA登录一个非常强的密码,甚至更好,禁用它!与大多数安全对象一样,你可以使用管理工作室中的漂亮GUI接口或T-SQL代码来创建和更改它们。如果你在Windows的现代版本上运行SQLServer,则可以钩住本地安全策略的密码策略。
1936

被折叠的 条评论
为什么被折叠?



