SQL Server安全级别2的楼梯:身份验证
来自 Don Kiely, 2014/06/18
该系列
本文是阶梯系列的一部分:通往SQL Server安全的阶梯。
SQL服务器拥有您所需的一切,以保护您的服务器和数据免受当今复杂的攻击。但在您能够有效地使用这些安全特性之前,您需要了解所面临的威胁和一些基本的安全概念。这第一个阶梯级别提供了一个基础,这样您就可以充分利用SQL Server中的安全特性,而不会浪费时间来处理对您的数据没有特定威胁的功能。
认证过程的验证,principal-a用户或进程需要访问SQL Server数据库是谁或什么它声称是。主体需要唯一的标识,这样SQLServer就可以确定主体有哪些权限,如果有的话。正确的身份验证是向数据库对象提供安全访问的必要的第一步。
SQLServer支持两种身份验证路径:Windows集成身份验证和SQLServer身份验证。您使用的路径取决于网络环境、将访问数据库的应用程序类型以及这些应用程序的用户类型。
Windows身份验证:这种身份验证形式依赖于Windows在用户登录到Windows时执行重验证身份。访问SQL Server对象然后被分配到Windows登录权限。只有当SQL Server在支持Windows NT或Kerberos身份验证的Windows版本上运行时,这种类型的认证才可用,这是Windows 2000以来的标准。
SQLServer身份验证:SQL Server可以完全独立地处理身份验证。在这种情况下,您可以创建独特的用户名称为SQL Server和密码登录。用户或应用程序连接到SQL Server,并提供这些凭据以供访问。然后直接将权限分配给登录,或者通过角色中的成员分配权限。
在SQL Server中配置身份验证并不是这两种类型之间的简单选择。可以以两种方式任意配置身份验证:
混合模式认证:服务器支持SQL Server和Windows身份验证。
Windows唯一模式:服务器只支持Windows身份验证。
微软强烈建议尽可能使用Windows身份验证。Windows具有强大的身份验证选项,包括密码策略,但Windows身份验证在实际应用中并不总是实用的。SQLServer身份验证可以钩住一些Windows身份验证特性,但它并不是那么安全。
Windows身份验证
如果配置SQL Server以在Windows身份验证模式下运行,则SQLServer将与Windows服务器假定信任关系。它假定Windows在登录到Windows时对用户进行身份验证。SQL Server然后检查用户帐户、任何Windows组和用户可能是哪个成员的SQL Server角色,以确定该用户是否允许与各种SQLServer对象一起工作。
Windows身份验证与SQLServer身份验证相比,有许多优点,包括:
用户只需登录一次,那么她就不必单独登录SQLServer了。
审计特征
简化登录管理
密码策略(在Windows Server 2003和以后)
Windows身份验证的另一大优势是,您对Windows用户和组的任何更改都会自动反映在SQL Server中,因此您不必单独管理它们。但是,如果在连接到SQL Server时对Windows用户进行了更改,那么在下次用户连接到SQLServer之前,这些更改将不会生效。
配置SQL Server安全设置
安装SQL Server时,可以选择服务器实例允许的身份验证模式。稍后,您可以更改SQL Server Management Studio中可用的“服务器属性”对话框中的设置。这些设置适用于SQL Server实例中的所有数据库和其他对象。因此,如果您需要为任何数据库使用SQL Server身份验证,则必须为服务器设置混合模式。
图2.1显示了安全管理页面中的服务器属性对话框,其中选择了安全页面。要打开此对话框,右键单击对象资源管理器中的服务器实例名称,然后从弹出菜单中选择属性,然后转到安全页面。通过单击相应的单选按钮并单击OK提交更改,即可更改身份验证模式。
图2.1 为SQL服务器实例配置身份验证模式。
添加Windows登录
要使用Windows身份验证,您的用户在访问SQL Server之前需要一个有效的Windows登录帐户。然后您可以向Windows组授予连接到SQLServer的权限,或者如果不想授予集体权限,可以授予个别Windows用户的权限。
一个关于使用Management Studio管理安全的好东西,你可以设置登录,同时提供数据库访问。为了使Windows登录访问SQL Server和adventureworks2012数据库,使用以下步骤,假设本地机器上已经有一joestairway登录定义。
1、打开SQL Server Management Studio,并确保对象资源管理器窗口可见,并连接到SQLServer实例。
2、展开服务器对象的树视图,然后展开安全部分。您将看到几个子节点,如图2.2所示。
图2.2 服务器对象资源管理器的安全部分,您可以在其中定义登录。
3、右键单击登录节点,从弹出菜单选择新的登录,打开登录–新对话框。
4、确保选中了Windows身份验证单选按钮。
5、您可以通过以下两种方式选择Windows登录。第一种方法是直接输入域名或计算机名,然后一个反斜杠和用户的Windows登录名。第二,一般容易,方法是点击“搜索”按钮打开“选择用户或组”对话框。键入用户名并单击“检查名称”按钮以找到确切名称。如果找到用户,将在框中显示全名,如图2.3所示。单击OK选择该用户。
图2.3 找到一个Windows登录以添加到SQL Server。
6、在登录–新建对话框,设置adventureworks2012数据库登录的默认数据库。这是当用户连接到服务器而不指定数据库时使用的数据库。它不限制用户只能访问该数据库。图2.4显示了结果在机命名为马拉松的Windows joestairway用户登录,用默认的数据库设置为样本adventureworks2012数据库。
图2.4 Login - New对话框允许Windows登录访问一个SQL服务器实例。
提示:
永远不要将默认数据库设置保留到主数据库。我从痛苦的经历中说:连接服务器太容易,忘记更改数据库。如果您运行的脚本在主数据库中创建了数百个数据库对象,那么手工删除这些对象以清理主数据库将是一项非常单调乏味的工作。
7、接下来,让用户访问数据库。从对话框左侧的列表中选择“用户映射”页。通过检查框旁边的数据库名称授予用户访问数据库的adventureworks2012。SQL Server自动将用户映射到数据库中具有相同名称的用户,如在表中的第三列中可以看到的那样,尽管您可以更改用户名,如果您愿意的话。在数据库中分配销售作为用户的默认模式,或者在默认模式列中键入它,或者单击省略号(…)按钮从列表中选择它。对话框应该如图2.5所示。
图2.5 授予对AdventureWorks2012数据库的Windows登录访问权限。
提示:
设置登录的默认数据库并授予对数据库的访问权限有区别。默认数据库仅仅意味着SQL Server试图在用户登录时将上下文更改为该数据库,而不指定数据库。但这并不授予任何权限在数据库中做任何事情,甚至不允许访问数据库。这意味着可以分配一个用户不能访问的默认数据库。要让用户在访问数据库后做任何有用的事情,就需要显式地授予用户权限。
8、默认情况下,新的Windows登录访问服务器。但是,如果要显式拒绝对服务器的登录访问,请从登录左侧页面列表中选择“新对话框”,然后选择“拒绝单选”按钮。还可以通过选择禁用按钮临时禁用登录。图2.6显示了这些选项。
图2.6 授予或拒绝访问服务器的选项,并临时禁用登录帐户。
9、单击OK创建用户。
您也可以以同样的方式向Windows Server添加一个Windows组。在这种情况下,组中的任何成员都可以访问数据库服务器,无论您将该组的访问权限用于数据库中的对象,都可以访问数据库服务器。
SQL Server身份验证
当您使用SQL Server登录认证,客户端应用程序必须提供一个有效的用户名和密码以连接到数据库。这些SQL Server登录保存在SQL Server中,没有提及Windows。登录时,如果没有帐户匹配用户名和密码,SQLServer将引发错误,用户无法访问SQLServer。
尽管Windows身份验证更安全,你可以选择在某些情况下,而不是使用SQL Server登录。对于不具有广泛安全需求的简单应用程序,SQL Server身份验证更容易管理,它可以让您避免与Windows安全混淆。如果客户端是在旧版本的Windows上运行(基本上,比Windows 2000以上)或非Windows操作系统,你必须使用SQL Server登录。
创建一个SQL Server登录,使用相同的登录–新Windows登录对话框。但是,不要选择Windows登录,键入一个唯一的登录名,没有域或机器名,并提供密码。例如,图2.7显示了如何创建新的SQL Server登录Casper,adventureworks2012他的默认数据库。
图2.7 创建一个SQL Server登录。
所有的用户定位和地位的其他选项都是相同的SQL Server登录他们的Windows登录。
SQL Server登录通过Transact-SQL
还可以使用Transact-SQL代码执行相同的操作。清单2.1中的创建登录代码用相当强的密码创建了一个SQLServer登录黄玉:
CREATE LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v';
GO
清单2.1。使用T-SQL创建新的SQL Server登录的代码。
然后,给黄玉进入adventureworks2012数据库,使用创建用户声明和分配一个默认的模式
USE AdventureWorks2012;
GO
CREATE USER Topaz FOR LOGIN Topaz
WITH DEFAULT_SCHEMA = HumanResources;
GO
清单2.2。创建与SQL Server登录关联的数据库用户的代码。
提示:
与级别为1的楼梯一样,如果您希望在sql服务器的本地实例中运行这些代码示例,您可能需要对代码示例进行一些更改。清单2.2中的代码假定你有adventureworks2012数据库安装。以后的代码示例假定你的机器上运行代码,命名为马拉松在Windows中有joestairway用户。可以随意命名您的机器马拉松或创建具有该名称的用户,或酌情更改代码。
像Windows登录,你可以地图服务器的登录黄玉其他一些名称数据库。清单2.3中的代码映射黄玉在adventureworks2012 topazd用户数据库:
DROP USER Topaz;
GO
CREATE USER TopazD FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources;
GO
谨防SA登录
如果你配置你的SQL Server支持的SQL Server登录,有一个内置的SQL Server登录,你需要提防sa登录,你可能已经注意到了挂在对象资源管理器登录节点。SA或系统管理员登录主要包括与旧版本的SQL Server的向后兼容性。sa登录名映射到sysadmin固定服务器角色,谁登录到SQL Server作为SA是一个完整的系统管理员,以不可撤销的权利在整个SQL Server实例中所有数据库它。这是一个强大的登录,确实。
不能修改或删除SA登录。如果在安装SQL Server时选择混合模式身份验证,则提示您为SA用户提供一个密码。没有密码,任何人都可以用没有密码的SA登录,玩“让我们管理服务器”,不用说,这是你最不希望你的用户做的事情。如果其他系统管理员不可用或忘记了Windows密码,请使用SA登录作为后门登录。如果发生这种情况,你可能需要新的管理员!
永远不要使用SA登录来访问应用程序中的数据库。如果黑客能够获得应用程序的控制权,那么这样做可以使黑客管理级别控制你的数据库服务器。在遥远的过去,这是攻击服务器的一种简单方式,是一种可怕的做法。相反,要么为应用程序设置一个定制的Windows或SQLServer登录,然后给该登录应用程序运行所需的绝对最低权限(实现最小特权原则)。
提示:
事实上,您应该考虑完全禁用SA登录,使用您刚才看到的登录属性对话框的状态页。这样一来,攻击者就不能使用这个功能强大的登录来获得服务器实例的控制权,无论您是否拥有强大的SA密码。
密码策略和实施
在2005之前的SQL服务器版本中,系统管理员没有容易的方法来执行密码策略,从而有助于使系统更安全。例如,SQL Server没有办法强制用户创建最短长度的强密码和字母数字和其他字符的混合。如果有人想为密码创建一个带有一个字母的登录,那么就不能配置SQL Server来阻止它。同样,也没有办法使密码定期过期,比如每三个月一次。一些人理所当然地认为这是不使用SQL Server登录的主要原因。
SQL Server的更新版本可以连接到Windows Server 2003、Windows Vista或更高版本的密码策略。密码仍然存储在SQL Server中,但SQL Server打电话到netvalidatepasswordpolicy() Windows API的方法,这是首次推出的Windows Server 2003。这个API功能适用于Windows密码政策的SQL Server登录并返回一个值,指示是否密码是有效的。当用户创建、设置或重置密码时,SQLServer调用此函数。
您可以在Windows控制面板的管理工具中通过本地安全设置小程序定义Windows密码策略。密码策略部分如图2.8所示,具有默认设置。applet有一个单独的帐户锁定策略部分,如图2.9所示,当用户做出太多不成功的登录尝试时生效。默认情况下,在一个新的Windows安装中禁用锁定策略。
图2.8。Windows本地安全策略applet,显示默认密码策略。
图2.9。Windows本地安全策略applet,显示默认的帐户锁定策略。
表2.1列出了密码策略以及默认值以及关于它们如何工作的一些注释。
Category | Policy Name | Default | Notes |
Password Policy | Enforce password history | 0 passwords remembered | Prevents users from reusing old passwords, such as alternating between two passwords. |
Minimum password length | 0 characters | Use this to require longer passwords to make them harder to break. | |
Password must meet complexity requirements | Disabled | Minimum mix of alphanumeric and other characters, and does not contain the user name. | |
Password Expiration | Maximum password age | 42 days | Number of days before a user is prompted to change their password. |
Minimum password age | 0 Days | Number of days before a user is allowed to change a password. | |
Account Lockout Policy | Account lockout duration | Not applicable | Time in minutes that the account is locked out if the lockout threshold is enabled. |
Account lockout threshold | 0 invalid login attempts | Maximum number of unsuccessful login attempts before the account is locked out. | |
Reset account lockout counter after | Not applicable | Time in minutes after which the counter of unsuccessful attempts is reset; enabled when the lockout threshold is enabled. |
在创建登录时,可以启用或禁用密码策略执行。登录–新对话框,启用当你创建一个SQL Server登录名下的部分,在图2-10中显示。
图2 - 10。为新登录执行密码策略。
密码策略适用于当您使用Transact-SQL创建登录以及。例如,如果您在Windows 2003 Server或更高版本运行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。更改登录以禁用此登录的密码策略的代码。
检查_选项控制是否有效的SQL Server检查the age of the password against Policy and检查_ Policy applies to the other政策。他必须改变_选项是available that the user to change the password部队at the next登录。
如果有太多的尝试都失败了。让用户登录,exceeding the number set in the帐户锁定政策,一个管理员可以复位帐户using the解锁选项列表
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK
在Windows Server 2003之前在Windows版本上运行SQL Server时,可以启用强制密码策略。但是SQL Server使用默认设置的最小长度为六个字符,检查密码与登录名的所有部分或任何部分不匹配,并且是大写字母、小写字母、数字和其他字符的组合。不能更改这些默认值。但希望您不会在这样一个旧版本的Windows上运行SQL Server,如果只是因为那时的安全性有了很大的改进的话!
总结
在SQL Server安全性的这个级别中,您已经了解了SQL Server中可用的许多身份验证选项。Windows集成身份验证是最安全的,但并不总是可行的,微软多年来使得SQL Server认证更加完善和安全。但是,如果您使用混合模式身份验证,请不要忘记给SA登录一个非常强的密码,或者更好地禁用它!最喜欢的对象,你可以创造和改变了他们使用的很好的GUI界面管理工作室或T-SQL代码。如果您在一个现代版本的Windows上运行SQL Server,则可以连接到本地安全策略的密码策略中。