By Don Kiely, 2014/06/18sql
该系列
本文是楼梯系列的一部分:通往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身份验证特性,但它并非那么安全。app
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以前,这些更改将不会生效。sqlserver
配置SQL Server安全设置
安装SQL Server时,能够选择服务器实例容许的身份验证模式。稍后,您能够更改SQL Server Management Studio中可用的“服务器属性”对话框中的设置。这些设置适用于SQL Server实例中的全部数据库和其余对象。所以,若是您须要为任何数据库使用SQL Server身份验证,则必须为服务器设置混合模式。
图2.1显示了安全管理页面中的服务器属性对话框,其中选择了安全页面。要打开此对话框,右键单击对象资源管理器中的服务器实例名称,而后从弹出菜单中选择属性,而后转到安全页面。经过单击相应的单选按钮并单击OK提交更改,便可更改身份验证模式。
图2.1。为SQLServer实例配置身份验证模式。
添加Windows登陆
要使用Windows身份验证,您的用户在访问SQL Server以前须要一个有效的Windows登陆账户。而后您能够向Windows组授予链接到SQLServer的权限,或者若是不想授予集体权限,能够授予个别Windows用户的权限。
一个关于使用Management Studio管理安全的好东西,你能够设置登陆,同时提供数据库访问。为了使Windows登陆访问SQL Server和adventureworks2012数据库,使用如下步骤,假设本地机器上已经有一joestairway登陆定义。
打开SQL Server Management Studio,并确保对象资源管理器窗口可见,并链接到SQLServer实例。
展开服务器对象的树视图,而后展开安所有分。您将看到几个子节点,如图2.2所示。
图2.2。一个服务器的对象资源管理器中的安所有分,在那里你能够定义登陆。
右键单击登陆节点,从弹出菜单选择新的登陆,打开登陆–新对话框。
确保选中了Windows身份验证单选按钮。
您能够经过如下两种方式选择Windows登陆。第一种方法是直接输入域名或计算机名,而后一个反斜杠和用户的Windows登陆名。第二,通常容易,方法是点击“搜索”按钮打开“选择用户或组”对话框。键入用户名并单击“检查名称”按钮以找到确切名称。若是找到用户,将在框中显示全名,如图2.3所示。单击OK选择该用户。
图2.3。查找要添加到SQLServer的Windows登陆。
在登陆–新建对话框,设置adventureworks2012数据库登陆的默认数据库。这是当用户链接到服务器而不指定数据库时使用的数据库。它不限制用户只能访问该数据库。图2.4显示告终果在机命名为马拉松的Windows joestairway用户登陆,用默认的数据库设置为样本adventureworks2012数据库。
图2.4。登陆-新对话框使Windows登陆能够访问SQLServer实例。
提示:
永远不要将默认数据库设置保留到主数据库。我从痛苦的经历中说:链接服务器太容易,忘记更改数据库。若是您运行的脚本在主数据库中建立了数百个数据库对象,那么手工删除这些对象以清理主数据库将是一项很是单调乏味的工做。
接下来,让用户访问数据库。从对话框左侧的列表中选择“用户映射”页。经过检查框旁边的数据库名称授予用户访问数据库的adventureworks2012。SQL Server自动将用户映射到数据库中具备相同名称的用户,如在表中的第三列中能够看到的那样,尽管您能够更改用户名,若是您愿意的话。在数据库中分配销售做为用户的默认模式,或者在默认模式列中键入它,或者单击省略号(…)按钮从列表中选择它。对话框应该如图2.5所示。
图2.5。授予Windows登陆访问数据库的adventureworks2012。
提示:
设置登陆的默认数据库并授予对数据库的访问权限有区别。默认数据库仅仅意味着SQL Server试图在用户登陆时将上下文更改成该数据库,而不指定数据库。但这并不授予任何权限在数据库中作任何事情,甚至不容许访问数据库。这意味着能够分配一个用户不能访问的默认数据库。要让用户在访问数据库后作任何有用的事情,就须要显式地授予用户权限。
默认状况下,新的Windows登陆访问服务器。可是,若是要显式拒绝对服务器的登陆访问,请从登陆左侧页面列表中选择“新对话框”,而后选择“拒绝单选”按钮。还能够经过选择禁用按钮临时禁用登陆。图2.6显示了这些选项。
图2.6。授予或拒绝访问服务器并临时禁用登陆账户的选项。
单击OK建立用户。
您也能够以一样的方式向Windows Server添加一个Windows组。在这种状况下,组中的任何成员均可以访问数据库服务器,不管您将该组的访问权限用于数据库中的对象,均可以访问数据库服务器。
使用用户名和密码
当您使用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服务器登陆。
全部的用户定位和地位的其余选项都是相同的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
清单2.3。删除现有用户的代码,而后添加与登陆名不一样的名称的数据库用户。
谨防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 200三、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本地安全策略小程序,显示默认密码策略。
图2.9。Windows本地安全策略小程序,显示默认账户锁定策略。
表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. |
表2.1。Windows密码策略设置。
在建立登陆时,能够启用或禁用密码策略执行。登陆–新对话框,启用当你建立一个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。更改登陆以禁用此登陆的密码策略的代码。
的check_expiration选项控制是否对SQL Server检查政策和check_policy密码时代适用于其余政策。一个must_change选项可用,迫使用户在下次登陆时更改密码。
若是用户作了太多失败的登陆尝试,超过了账户锁定策略中设置的数量,管理员可使用解锁选项重置账户,如清单2.6所示。
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK
清单2.6。解锁因为失败的登陆尝试而锁定的登陆的代码。
在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,则能够链接到本地安全策略的密码策略中。
本文是SQL Server安全楼梯的一部分。