四巨头第十二周作业翻译

通往SQL Server安全级别2的楼梯:认证。

唐•吉利 2014/06/18

该系列

这篇文章是楼梯系列的一部分:SQL Server安全性的阶梯。

SQL Server拥有您需要的一切来保护您的服务器和数据,以抵御当今复杂的攻击。但是在您能够有效地使用这些安全特性之前,您需要了解您所面临的威胁和一些基本的安全概念。这个第一个楼梯级别提供了一个基础,这样您就可以充分利用SQL Server中的安全特性,而不必浪费时间在那些不能保护您的数据的特定威胁的特性上。

身份验证是验证一个委托-一个用户或进程需要访问SQL Server数据库的过程—是谁或它声称是什么。一个主体需要唯一的标识,以便SQL Server能够确定主体拥有的权限,如果有的话。正确的身份验证是提供对数据库对象的安全访问的第一步。

SQL Server支持两种身份验证路径:Windows集成的身份验证和SQL Server身份验证。您使用的路径依赖于网络环境、访问数据库的应用程序类型以及这些应用程序的用户类型。

Windows身份验证: 当用户登录到Windows时,这种身份验证形式依赖于Windows来执行重启动验证标识。访问SQL Server对象的权限被分配给Windows登录。只有在支持Windows NT或Kerberos身份验证的Windows版本上运行SQL Server时,这种类型的身份验证才可用。

SQL Server身份验证: SQL Server完全可以自己处理身份验证。在这种情况下,您可以创建独特的用户名——在SQL server和密码中称为登录。用户或应用程序连接到SQL Server并提供这些凭据以供访问。然后将权限分配给该登录,或者直接或通过成员身份登录。

在SQL Server中配置身份验证并不是这两种类型之间的简单选择。您可以通过以下两种方式配置身份验证:

混合模式验证: 服务器支持SQL server和Windows身份验证。

Windows只有模式: 服务器只支持Windows身份验证。

微软强烈建议尽可能使用Windows认证。Windows具有强大的身份验证选项,包括密码策略,但Windows身份验证在实际应用程序中并不总是实用的。SQL Server身份验证可以连接到一些Windows身份验证功能,但它并不安全。

Windows身份验证

如果您将SQL服务器配置为在Windows身份验证模式下运行,那么SQL Server将假定与Windows服务器的信任关系。它假设Windows在登录到Windows时验证了用户的身份。然后,SQL Server检查用户帐户、任何Windows组和任何SQL Server角色,用户可能是决定该用户是否被允许使用各种SQL Server对象的成员。

与SQL Server身份验证相比,Windows身份验证具有几个优势,包括:

由用户单独登录,这样她就不必单独登录到SQL Server。

l  审计功能

l  简化登录管理

l  密码策略(在Windows Server 2003和以后)

Windows身份验证的另一大优点是,对Windows用户和组的任何更改都会自动反映在SQL Server中,因此您不必单独管理它们。但是,如果您在Windows用户连接到SQL Server时对其进行更改,那么这些更改直到用户下一次连接到SQL Server时才会生效。

配置SQL Server安全设置。

安装SQL Server时,可以选择服务器实例允许的身份验证模式。稍后,您可以在SQL Server Management Studio中更改服务器属性对话框中的设置。这些设置适用于SQL Server实例中的所有数据库和其他对象。因此,如果需要为任何数据库使用SQL Server身份验证,则必须为服务器设置混合模式。

图2.1显示了管理Studio中选择的Security页面的服务器属性对话框。要打开这个对话框,右键单击对象资源管理器中的服务器实例名,并从弹出菜单中选择Properties,然后进入安全页面。只需单击适当的单选按钮并单击OK提交更改,就可以更改身份验证模式。

图2.1。为SQL服务器实例配置身份验证模式。

添加一个Windows登录

要使用Windows身份验证,用户在访问SQL Server之前需要一个有效的Windows登录帐户。然后,您可以将权限授予Windows组,以连接到SQL Server,如果您不想授予集体权限,则可以向单个Windows用户授予权限。

使用管理Studio来管理安全性的优点之一是,您可以同时设置登录和提供数据库访问。要启用Windows登录访问SQL Server和AdventureWorks2012数据库,请使用以下步骤,该步骤假定本地机器已经定义了JoeStairway登录。

1. 打开SQL Server管理Studio,确保对象资源管理器窗口可见,并连接到一个SQL服务器实例。

2. 展开服务器对象的树视图,然后展开安全性部分。您将看到几个子节点,如图2.2所示。

图2.2 服务器对象资源管理器的安全部分,您可以在其中定义登录。

3. 右键单击Logins节点并从弹出菜单中选择New Login以打开Login - New对话框。

4. 确保选中了Windows身份验证单选按钮。

5. 您可以通过两种方式选择Windows登录。第一种方法是直接输入域或机器名,然后是反斜杠和用户的Windows登录名。第二种方法,通常更简单的方法是单击Search按钮打开“选择用户”或“组”对话框。键入用户名并单击Check name按钮以查找准确的名称。如果找到该用户,将会出现完整的名称,如图2.3所示。单击OK选择该用户。

图2.3 找到一个Windows登录以添加到SQL Server。

6. 回到Login - New对话框,将AdventureWorks2012数据库设置为登录的默认数据库。这是当用户连接到服务器并没有指定数据库时使用的数据库。它不限制用户只访问该数据库。图2.4显示了在名为Marathon的机器上的Windows JoeStairway用户的结果登录,并将默认数据库设置为示例AdventureWorks2012数据库。

图2.4 Login - New对话框允许Windows登录访问一个SQL服务器实例。

提示:

永远不要将默认数据库设置为主数据库。我从痛苦的经验中说:连接到服务器和忘记更改数据库太容易了。如果您运行一个在主数据库中创建数百个数据库对象的脚本,那么您将会有一个非常繁琐的工作:手动删除这些对象,以清理主数据库。

7. 接下来,让用户访问数据库。从对话框左侧的列表中选择User Mapping页面。通过检查数据库名称旁边的复选框,授予用户访问AdventureWorks2012数据库的权限。SQL Server自动将用户映射到数据库中具有相同名称的用户,正如您可以在表的第三列中看到的那样,尽管您可以更改用户名。在数据库中指定Sales作为用户的默认模式,或者通过在默认的模式列中键入它,或者单击省略号(…)按钮从列表中选择它。对话框应该如图2.5所示。

图2.5 授予对AdventureWorks2012数据库的Windows登录访问权限。

提示:

设置一个登录和授予访问数据库的默认数据库之间是有区别的。默认数据库仅仅意味着SQL Server尝试在用户登录而不指定数据库时将上下文更改为该数据库。但这并没有授予任何权限来在数据库中执行任何操作,甚至不允许访问数据库。这意味着可以为用户分配一个无法访问的默认数据库。对于用户在访问数据库时做任何有用的事情,您需要显式地授予用户权限。

8. 默认情况下,新的Windows登录可以访问服务器。但是,如果您想要显式地拒绝对服务器的登录访问,请从login - New对话框左侧的页面列表中选择Status,并选择deny单选按钮。您还可以通过选择禁用按钮来临时禁用登录。图2.6显示了这些选项。

图2.6 授予或拒绝访问服务器的选项,并临时禁用登录帐户。

9. 单击OK以创建用户。

您还可以以同样的方式向SQL Server添加一个Windows组。在这种情况下,组中的任何成员都可以访问数据库服务器,无论您将该组提供给数据库中的对象。

SQL Server身份验证

当你使用SQL Server登录进行身份验证时,客户机应用程序必须提供有效的用户名和密码才能连接到数据库。这些SQL Server登录在SQL Server中保存,而不涉及Windows。当登录时,如果没有帐户匹配用户名和密码,SQL Server就会引发错误,用户无法访问SQL Server。

即使Windows身份验证更加安全,你也可以选择在某些情况下使用SQL Server登录。对于没有广泛安全需求的简单应用程序,SQL Server身份验证更容易管理,而且它允许你避免与Windows安全性纠缠在一起。如果客户端运行的是旧版本的Windows(基本上,任何比Windows 2000更老的版本)或非Windows操作系统,就必须使用SQL Server登录。

要创建一个SQL Server登录,请使用与Windows登录相同的登录新对话框。但是,不要选择Windows登录,输入一个没有域或机器名的唯一登录名,并提供一个密码。例如,图2.7显示了如何创建一个新的SQL Server登录Casper,并将AdventureWorks2012作为他的默认数据库。

用户映射和状态的所有其他选项都是与Windows登录相同的SQL Server登录。

SQL Server登录通过Transact-SQL

你还可以使用Transact-SQL代码执行相同的操作。清单2.1中的创建登录代码创建了一个具有相当强密码的SQL Server登录Topaz:

CREATE LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v';

GO

清单2.1使用T-SQL创建新的SQL Server登录的代码

然后,为了让Topaz访问AdventureWorks2012数据库,使用CREATE USER语句并分配一个默认模式,如清单2.2所示。

USE AdventureWorks2012;

GO

CREATE USER Topaz FOR LOGIN Topaz

    WITH DEFAULT_SCHEMA = HumanResources;

GO

清单2.2创建与SQL Server登录关联的数据库用户的代码。

提示:

与一级阶梯一样,如果你想在本地的SQL Server实例中运行它们,你可能需要对代码示例进行一些更改。清单2.2中的代码假设你已经安装了AdventureWorks2012数据库。稍后的代码示例假设你正在运行名为Marathon的机器上的代码,并在Windows中有一个JoeStairway用户。你可以随意命名你的机器马拉松或创建一个具有该名称的用户,或者适当地更改代码。

与Windows登录一样,你可以将服务器登录Topaz映射到数据库中的其他名称。清单2.3中的代码将Topaz映射到AdventureWorks2012数据库中的TopazD用户:

DROP USER Topaz;

GO

CREATE USER TopazD FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources;

GO

清单2.3删除现有用户的代码,然后添加一个与登录名不同的数据库用户。

小心sa登录

如果你配置你的SQL服务器来支持SQL Server登录,那么你需要注意一个内置的SQL Server登录,你可能已经注意到在对象资源管理器的logins节点上挂着。该sa或系统管理员登录主要是为了向后兼容老版本的SQL Server。sa登录映射到sysadmin固定服务器角色,任何登录到SQL server as sa的人都是完整的系统管理员,对整个SQL server实例和其中的所有数据库都拥有不可撤销的权限。这确实是一个强大的登录。

你不能修改或删除sa登录。如果在安装SQL Server时选择混合模式身份验证,将提示输入sa用户的密码。如果没有密码,任何人都可以以没有密码的方式登录,并播放“让我们来管理服务器”。不用说,这是你最不希望用户做的事情。如果其他系统管理员不可用或忘记了他们的Windows密码,则只使用sa登录作为后门。如果发生这种情况,您可能需要新的管理员!

永远不要使用sa登录来访问应用程序中的数据库。如果黑客能够控制应用程序,那么这样做可以在你的数据库服务器上提供一个黑客管理员级别的控制。在遥远的过去,这是攻击服务器的一种简单方法,也是一种可怕的做法。相反,可以为应用程序设置一个自定义窗口或SQL Server登录,并提供运行应用程序所需的绝对最小权限(实现最小特权原则)。

提示:

实际上,你应该考虑完全禁用sa登录,使用你之前看到的登录属性对话框的状态页。这样,攻击者就不能使用这种全能的登录来获得对服务器实例的控制,无论你是否拥有强大的sa密码。

密码策略和执行

在2005年之前的SQL Server版本中,对于系统管理员来说,缺少一种简单的方法来执行能够帮助系统更安全的密码策略。例如,SQL Server没有办法强迫用户创建一个最小长度的以及字母数字和其他字符的混合的强密码。如果有人想用单个字母来创建一个密码,那么就不能配置SQL Server来阻止它。同样,也没有办法让密码定期过期,比如每三个月。有些人认为这是不使用SQL Server登录的主要原因。

最近版本的SQL Server可以连接到Windows Server 2003、windowsvista或更高版本的密码策略。密码仍然存储在SQL Server中,但是SQL Server对NetValidatePasswordPolicy() Windows API方法进行了调用,该方法最初是在Windows Server 2003中引入的。这个API函数将Windows密码策略应用于SQL Server登录,并返回一个值,该值指示密码是否有效。SQL Server在用户创建、设置或重置密码时调用此函数。

您可以通过Windows控制面板的管理工具中的本地安全设置applet来定义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密码策略设置。

在创建登录时,您可以启用或禁用密码策略强制。Login - New对话框中有一个在创建SQL Server登录时启用的登录名的部分,如图2-10所示。

图2 - 10。为新登录执行密码策略。

当您使用Transact-SQL创建登录时,密码策略也适用。例如,如果您在Windows 2003服务器上运行SQL Server,或者稍后启用了密码策略,那么清单2.4中的代码将会失败。

USE master;

GO

CREATE 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。更改登录以禁用此登录的密码策略的代码。

check_过期选项控制SQL Server是否检查密码的年龄,而不是策略和CHECK_POLICY应用于其他策略。可以使用MUST_CHANGE选项强制用户在下一次登录时更改密码。

如果用户尝试登录的次数过多,超过帐户锁定策略中设置的数字,管理员可以使用UNLOCK选项重置帐户,如清单2.6所示。

ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK

清单2.6。解锁的代码由于太多失败的登录尝试而被锁定。

在Windows Server 2003之前在Windows版本上运行SQL Server时,可以启用强制密码策略。但是SQL Server使用默认设置的最小长度为6个字符,检查密码不匹配所有或任何部分的登录名,并且是大写字母、小写字母、数字和其他字符的混合。您无法更改这些默认值。但是希望您没有在一个旧版本的Windows上运行SQL Server,只是因为从那以后的巨大的安全改进。

总结

在这个级别的SQL Server安全级别上,您已经了解了SQL Server中可用的一些身份验证选项。Windows集成的身份验证是最安全的,但并不总是可行的,而且微软多年来已经使SQL Server认证变得更好和更安全。但是如果您使用混合模式认证,不要忘记给sa登录一个非常强的密码,或者,甚至更好,禁用它!与大多数安全对象一样,您可以使用管理Studio或T-SQL代码中的nice GUI界面来创建和更改它们。如果您在现代版的Windows上运行SQL Server,您可以连接到本地安全策略的密码策略。

猜你喜欢

转载自www.cnblogs.com/hawking-520/p/9096606.html