数据库


通向SQLServer安全级别2的楼梯:身份验证唐·基利,
2014/06/18
系列
本文是楼梯系列的一部分:通向SQLServer安全的阶梯
SQLServer拥有保护服务器和数据免受当今复杂攻击所需的一切。但是,在有效使用这些安全特性之前,您需要了解所面临的威胁和一些基本的安全概念。第一个阶梯级别提供了一个基础,这样您就可以充分利用SQLServer中的安全特性,而不必浪费时间在无法防止数据受到特定威胁的功能上。
身份验证是指验证主体-需要访问SQLServer数据库的用户或进程-是否是它声称的对象或对象的过程。主体需要唯一标识,以便SQLServer能够确定主体具有哪些权限(如果有的话)。正确的身份验证是提供对数据库对象的安全访问的必要的第一步。
SQLServer支持两种身份验证途径:Windows集成身份验证和SQLServer身份验证。您使用的路径取决于网络环境、将访问数据库的应用程序类型以及这些应用程序的用户类型。
Windows身份验证:当用户登录到Windows时,这种形式的身份验证依赖于Windows来完成繁重的提升-验证标识。然后将访问SQLServer对象的权限分配给Windows登录。这种类型的身份验证只有在SQLServer运行在支持Windows NT或Kerberos身份验证的Windows版本上时才可用,该版本自Windows 2000以来一直是标准的。SQLServer身份验证:SQLServer完全可以单独处理身份验证。在这种情况下,您可以创建唯一的用户名(在SQLServer中称为登录)和密码。用户或应用程序连接到SQLServer,并为访问提供这些凭据。然后直接或通过角色中的成员身份将权限分配给该登录名。在SQLServer中配置身份验证并不是在这两种类型之间的简单选择。您可以通过以下两种方式之一配置身份验证:
混合模式身份验证:服务器同时支持SQLServer和Windows身份验证。WindowsOnly模式:服务器只支持Windows身份验证。Microsoft强烈建议尽可能使用Windows身份验证。
Windows具有健壮的身份验证选项,包括密码策略,但Windows身份验证在实际应用程序中并不总是实用的。SQLServer身份验证可以连接到其中的一些Windows身份验证功能,但它并不是那么安全。
Windows身份验证如果将SQLServer配置为在Windows身份验证模式下操作,则SQLServer将假定与Windows Server建立信任关系。它假设Windows在用户登录到Windows时对其进行身份验证。然后,SQLServer检查用户帐户、任何Windows组和用户可能参与的任何SQLServer角色,以确定是否允许该用户处理各种SQLServer对象。
与SQLServer身份验证相比,Windows身份验证有几个优点,包括:用户只需登录一次,就不必单独登录SQLServer审计特征
简化登录管理密码策略(Windows Server 2003及更高版本)
Windows身份验证的另一个优点是,对Windows用户和组所做的任何更改都会自动反映在SQLServer中,因此不必单独管理它们。但是,如果在Windows用户连接到SQLServer时对其进行更改,则这些更改在用户下次连接到SQLServer之前不会生效。
配置SQLServer安全设置安装SQLServer时,可以选择服务器实例允许的身份验证模式。稍后,您可以在SQLServerManagementStudio中可用的“服务器属性”对话框中更改该设置。
这些设置适用于SQLServer实例中的所有数据库和其他对象。因此,如果需要对任何数据库使用SQLServer身份验证,则必须为服务器设置混合模式。图2.1显示了ManagementStudio中的ServerProperties对话框,其中选择了Security页面。要打开此对话框,右键单击对象资源管理器中的服务器实例名称,然后从弹出菜单中选择“属性”,然后转到“安全”页。只需单击适当的单选按钮并单击OK提交更改即可更改身份验证模式。

图2.1.为SQLServer实例配置身份验证模式。
添加Windows登录要使用Windows身份验证,用户在访问SQLServer之前将需要一个有效的Windows登录帐户。然后,可以向Windows组授予连接到SQLServer的权限,如果不希望授予集体权限,则可以向单个Windows用户授予权限。
使用ManagementStudio来管理安全性的好处之一是您可以同时设置登录并提供数据库访问。若要使Windows登录名能够访问SQLServer和AdventureWorks 2012数据库,请使用以下步骤,这些步骤假定本地计算机已经定义了JoeStair登录名。
1.打开SQLServerManagementStudio,并确保对象资源管理器窗口可见,并且您已连接到SQLServer实例。
2.展开服务器对象的树视图,然后展开Security部分。您将看到几个子节点,如图2.2所示。
图2.2.服务器对象资源管理器的安全部分,您可以在其中定义登录。右键单击“登录”节点,然后从弹出菜单中选择“新建登录”,以打开“登录-新”对话框。确保选中了Windows身份验证单选按钮。您可以通过两种方式中的任何一种选择Windows登录名。
第一种方法是直接键入域或机器名,然后为用户使用反斜杠和Windows登录名。
第二种方法(通常更容易)是单击“搜索”按钮,打开“选择用户或组”对话框。键入用户名,然后单击“检查名称”按钮,以找到确切的名称。如果找到用户,全名将出现在框中,如图2.3所示。单击OK选择该用户。

图2.3.查找要添加到SQLServer的Windows登录名。回到Login-New对话框中,将AdventureWorks 2012数据库设置为登录的默认数据库。这是当用户连接到服务器而不指定数据库时使用的数据库。
图2.4显示了Windows JoeStay用户在一台名为马拉松的机器上的登录,默认数据库设置为示例AdventureWorks 2012数据库。

图2.4.“登录-新建”对话框使Windows登录名能够访问SQLServer实例。提示:永远不要将默认数据库设置为主数据库。我说的是痛苦的经历:连接到服务器而忘记更改数据库太容易了。如果然后运行一个在主数据库中创建数百个数据库对象的脚本,您将需要手动删除这些对象以清理主数据库,这将是一项非常繁琐的工作。接下来,让用户访问数据库。从对话框左侧的列表中选择“用户映射”页面。通过选中数据库名称旁边的框,授予用户对AdventureWorks 2012数据库的访问权限。SQL Server自动将用户映射到数据库中具有相同名称的用户,正如您在表的第三列中看到的那样,尽管您可以根据需要更改用户名。通过在默认模式列中键入销售或单击省略号(…),将销售指定为用户在数据库中的默认模式按钮从列表中选择它。对话框应该如图2.5所示。

图2.5授予对AdventureWorks 2012数据库的Windows登录访问权限。提示:为登录设置默认数据库与授予对数据库的访问权限之间存在差异。默认数据库仅意味着SQLServer在用户登录时试图将上下文更改为该数据库,而不指定数据库。但这并不授予任何类型的权限在数据库中执行任何操作,甚至不允许访问数据库。
这意味着可以分配用户根本无法访问的默认数据库。一旦访问了数据库,用户就可以执行任何有用的操作,您需要显式地授予用户权限。默认情况下,新的Windows登录可以访问服务器。但是,如果要显式拒绝对服务器的登录访问,请从Login-New对话框左侧的页面列表中选择Status,然后选择拒绝单选按钮。还可以通过选择“禁用”按钮暂时禁用登录。图2.6显示了这些选项。

图2.6.授予或拒绝对服务器的访问以及暂时禁用登录帐户的选项。单击OK创建用户。您还可以同样的方式将Windows组添加到SQLServer中。在这种情况下,组中的任何成员都可以访问数据库服务器,可以对数据库中的对象进行任何访问。
SQLServer身份验证
当您使用SQLServer登录进行身份验证时,客户端应用程序必须提供有效的用户名和密码才能连接到数据库。这些SQLServer登录保存在SQLServer中,而不引用Windows。登录时,如果没有与用户名和密码匹配的帐户,则SQLServer将引发错误,用户无法访问SQLServer。即使Windows身份验证更安全,在某些情况下也可以选择使用SQLServer登录。对于不具有广泛安全需求的简单应用程序,SQLServer身份验证更容易管理,它允许您避免与Windows安全性纠缠在一起。如果客户端运行在旧版本的Windows(基本上是比Windows 2000更早的版本)或非Windows操作系统上,则必须使用SQLServer登录。若要创建SQLServer登录名,请使用与Windows登录相同的Login-New对话框。但是,不要选择Windows登录名,而是键入没有域名或机器名称的唯一登录名,并提供密码。例如,图2.7显示了如何创建一个新的SQLServer登录Casper并将AdventureWorks 2012作为默认数据库。
图2.7.创建SQLServer登录名。用于用户映射和状态的所有其他选项都是与Windows登录相同的SQLServer登录。通过Transact-SQL登录SQLServer您还可以使用Transact-SQL代码执行相同的操作。
清单2.1中的CREATE登录代码创建了一个具有相当强密码的SQLServer登录Topaz:

清单2.1。使用T-SQL创建新SQLServer登录名的代码.然后,要授予Topaz对AdventureWorks 2012数据库的访问权限,请使用CREATEUSER语句并分配一个默认模式,如清单2.2所示。

清单2.2.创建与SQLServer登录名关联的数据库用户的代码。提示:与第一级阶梯一样,如果要在SQLServer的本地实例中运行代码示例,则可能需要对代码示例进行一些更改。清单2.2中的代码假设您安装了AdventureWorks 2012数据库。稍后的代码示例假设您在一台名为马拉松的机器上运行代码,并且在Windows中有一个JoeStairway用户。可以随意命名您的机器马拉松,或者创建一个具有该名称的用户,或者酌情更改代码。与Windows登录一样,您可以将服务器登录名Topaz映射到数据库中的其他名称。清单2.3中的代码将Topaz映射到AdventureWorks 2012数据库中的TopazD用户:

清单2.3。删除现有用户的代码,然后添加与登录名不同的数据库用户。小心SA登录如果将SQLServer配置为支持SQLServer登录,则需要注意一个内置的SQLServer登录-SA登录-您可能已经注意到对象资源管理器中登录节点中的挂起。Sa或系统管理员登录的主要目的是为了向后兼容SQLServer的旧版本。sa登录名映射到sysadmin固定服务器角色,以sa身份登录到SQLServer的任何人都是完整的系统管理员,对整个SQLServer实例及其中的所有数据库拥有不可撤销的权限。这确实是一个强大的登录。您不能修改或删除sa登录。如果在安装SQLServer时选择混合模式身份验证,系统会提示您输入sa用户的密码。没有密码,任何人都可以在没有密码的情况下作为sa登录,并播放“让我们管理服务器”。不用说,这是您最不希望用户做的事情。如果其他系统管理员不可用或忘记了他们的Windows密码,请使用sa登录作为后门登录。如果发生这种情况,你可能需要新的管理员!永远不要使用sa登录来访问应用程序中的数据库。
如果黑客能够控制应用程序,那么这样做可以让黑客在管理级别上控制您的数据库服务器。在遥远的过去,这是攻击服务器的一种简单方法,是一种可怕的做法。相反,可以设置自定义Windows或SQLServer登录以供应用程序使用,并为该登录提供运行应用程序所需的绝对最小权限(该权限实现了最小特权原则)。提示:实际上,您应该考虑完全禁用sa登录,使用前面看到的Login Properties对话框的状态页。这样,无论您是否具有强sa密码,攻击者都不能使用这个功能强大的登录来控制您的服务器实例。

密码政策与执行在2005年以前的SQLServer版本中,系统管理员执行有助于提高系统安全性的密码策略是不容易的。例如,SQLServer无法强制用户创建最小长度的强密码以及字母、数字和其他字符的混合。如果有人想用一个字母为密码创建登录名,则无法配置SQLServer来阻止它。同样,没有办法使密码定期过期,例如每三个月一次。有些人正确地认为这是不使用SQLServer登录的一个主要原因。更多最新版本的SQLServer可以连接到Windows Server 2003、WindowsVista或更高版本的密码策略。密码仍然存储在SQLServer中,但SQLServer调用NetValidatePasswordPolicy()Windows API方法,该方法最初是在Windows Server 2003中引入的。此API函数将Windows密码策略应用于SQLServer登录,并返回一个值,该值指示密码是否有效。当用户创建、设置或重置密码时,SQLServer将调用此函数。可以通过Windows控制面板的管理工具中的本地安全设置小程序定义Windows密码策略。密码策略部分显示在图2.8中,其中包含默认设置。applet有一个单独的帐户锁定策略部分,如图2.9所示,当用户尝试太多登录失败时,这个部分就会生效。默认情况下,在新的Windows安装中禁用锁定策略。

图2.8Windows本地安全策略小程序,显示默认密码策略。

图2.9Windows本地安全策略小程序,显示默认帐户锁定策略。
表2.1列出了密码策略和默认值,并说明了它们的工作方式。

表2.1.Windows密码策略设置。您可以在创建登录时启用或禁用密码策略强制执行。Login-New对话框在登录名下有一个节,在创建SQLServer登录时启用该部分,如图2-10所示。

图2-10强制新登录的密码策略。当您使用Transact-SQL创建登录时,也会应用密码策略。例如,如果您在Windows 2003 Server或更高版本上运行SQL Server,并且启用了密码策略,则清单2.4中的代码将失败。
清单2.4。试图使用违反密码策略的密码创建登录。此代码失败的原因是密码不能与用户名相同。您可以在创建或更改登录时控制策略。清单2.5中的代码关闭了检查过期和策略的选项。

清单2.5。更改登录名以禁用此登录密码策略的代码。CHECK_FIPURE选项控制SQLServer是否根据策略检查密码的使用时间,Check_Policy是否适用于其他策略。有一个强制用户在下一次登录时更改密码的选项。如果用户多次尝试登录失败,超过了帐户锁定策略中设置的数字,管理员可以使用解锁选项重置帐户,如清单2.6所示。

清单2.6.由于登录尝试失败而锁定的登录的解锁代码。
在Windows Server 2003之前的Windows版本上运行SQLServer时,可以启用“强制密码策略”。但SQLServer使用至少6个字符的默认设置,检查密码是否与登录名的全部或任何部分不匹配,并且是大写字母、小写字母、数字和其他字符的组合。您不能更改这些默认值。但是,希望您没有在这样一个旧版本的Windows上运行SQLServer,如果仅仅是因为从那时起就有了巨大的安全改进!
摘要
在SQLServer安全性阶梯的这个级别上,您了解了SQLServer中可用的许多身份验证选项。Windows集成身份验证是最安全的,但并不总是可行的,多年来,Microsoft使SQL Server身份验证变得更好、更安全。但是,如果您使用混合模式认证,不要忘记给sa登录一个非常强的密码,或者,更好的是,禁用它!与大多数安全对象一样,您可以使用ManagementStudio中漂亮的GUI界面或T-SQL代码来创建和更改它们。如果在现代版本的Windows上运行SQL Server,则可以连接到本地安全策略的密码策略。
本文是SQLServer安全阶梯的一部分注册我们的RSS提要,并得到通知,一旦我们发布一个新的层次在楼梯上!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值