你的位置:首页 > 数据库

[数据库]SQL Server安全(1/11):SQL Server安全概述


在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切。但在你能有效使用这些安全特性前,你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础,因此你可以对SQL Server里的安全特性充分利用,不用在面对特定威胁,不能保护你数据的特性上浪费时间。


从让人眼花缭乱的客户端使用连接,通过到处分布的网络,尤其是互联网,关系数据库在各种应用程序里广泛使用。这使数据对任何人,在任何地方都可访问。数据库可以保存人类知识的很大部分,包括高度敏感的个人信息和让国际商务工作的关键数据。

对于想要偷取数据或通过篡改数据来伤害数据的拥有者的人来说,这些特性使数据库成为有吸引力的目标。确保你的数据安全是SQL Server配置和使用它来保存数据的程序的重要部分。这个系列会探寻SQL Server 2012安全的基本,这样的话你可以保护你的数据和服务器资源,按你需要的安全等级来保护数据,免受这些威胁对你数据的影响。大部分信息对SQL Server的早期版本也适用,回到SQL Server 2005也可以,因为那是微软在产品里彻底检查安全的时候。但我也会谈论只在SQL Server 2012和后续版本里才有的功能。

在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切。但在你能有效使用这些安全特性前,你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础,因此你可以对SQL Server里的安全特性充分利用,不用在面对特定威胁,不能保护你数据的特性上浪费时间。

威胁

在理解如何配置和使用SQL Server来保护你的数据,识别特定数据集和它的服务器的威胁是重要的第一步。你创建的用来管理你的小学足球队的设备清单很可能不需要严格的安全措施。很可能你会想提供最小的访问控制,这样的话,足球队成员不能随机修改他拥有哪个足球盒的记录。即使这些数据被盗或篡改也不会是世界末日。

另一方面,如果数据库有关于足球队孩子的个人信息,例如家庭地址和联系电话,很可能你想加强安全保护(或许法律上也要求你这么做)。可能你会通过隔离访问来保护数据的隐私,这样的话,几乎任何可以访问数据库来修改设备数据,但只有一些人可以访问个人数据。如果数据包括家长的信用卡号,你会需要极其小心的保护那个数据。

你的数据很容易受到很多威胁,下列清单是常见的几个。在网络上有很多资源可以针对你的特定情况帮你分析。这个清单只想帮助你开始考虑这些威胁,如何使用SQL Server的特性来应对它们,或者至少减少暴露数据给他们。

  • 数据窃取:数据窃取包括各种对你数据的未授权访问,无论通过黑入你网络的外界人员,还是在重要人物上非法扫描的内部人员。它会涉及到读取到禁止信息的兴奋,或者被通过销售窃取的信用卡号的利益所驱动。
  • 数据破坏:获的你数据访问权限的可以修改它,它会带来一系列的问题,包括关闭你的所有业务让你在公众面前尴尬(当你所有的客户记录被删除时就会发生)。
  • 数据篡改:在关系数据库里存储数据的一个最大好处是数据库本身可以帮助保护数据的完整性。数据完整性包括每个订单有关联的客户,在日期列存储的日期代表日历上的日期,百分比字段只包含0和100之间的值等这些约束。当你考虑安全的时候,数据完整性不会是第一个想到的,但却是你的数据保护的重要部分。
  • 非法存储:在过去,在商业过程期间,你收集的数据只是你个人的事。但选择在美国,遍及欧盟和可以控制你存储的各种个人信息,你如何存储它,你如何保护它的其他国家里的都有对应的法律存在。违法的处罚是严格的——包括罚款和对你公司的公共形象损失费。

这个系列文章谈到的SQL Server 2012的特性可以帮你缓解这些各类威胁和其他方面。你必须理解对你数据的威胁,才可以知道如何保护它们。不要在不能防止你特定数据威胁的措施上浪费时间。你永远不能考虑到所有的假设情况,但最为最坏的情况你要保证你的数据库服务器对它的面向客户是完全不可用的。安全总是个妥协,对时间的风险和实现保障的必要金钱之间的平衡。

安全设计理念

早在2012年,比尔盖茨发布了他臭名昭著的计算机可信备忘录,即微软在产品里如何考虑和实现安全的,可以证明是个转折点。根据微软官方网站,可信计算机政策启动了。“基于良好的商业实践,专注创建和带来安全,隐私和可靠的计算体验。我们的目标是更安全、更可信的互联网”。

话句话说,微软在十多年前就变得非常关注安全。关于这个修改的第一个版本是SQL Server 2005,微软开始在产品考虑充分的安全。自那以后,SQL Server的每个版本都会保留新的安全架构,同时加强它,增加新的功能来同时提高安全来应对新出现的威胁。

如微软在SQL Server 2005时期里所描述的,通过定义产品安全的四大支柱来影响SQL Server可信计算发展。

  • 安全设计(Secure by design):微软进行广泛的威胁分析和代码设计与交互的安全审计,来确定攻击者可以立足获得服务器和数据的地方。这样让微软设计的SQL Server可以保护你在服务器上存储的数据的保密性,完整性和可用性。
  • 默认安全(Secure by default):SQL Server创造性的默认安装并激活关键的核心数据库组件。这就是说不是核心的数据库的功能不会安装,或者安装之后不会启用。没有安装的功能不安装就不会作为攻击目标。你必须清醒意识安装或启用的非核心功能。这会阻止你可能不知道却安装功能的很多攻击,你以为从未用过它们。
  • 部署安全(Secure in deploymen):微软提供工具,支持安装SQL Server的安全并保持它的安全。SQL服务器配置工具帮助你配置服务器安全。最重要的是,SQL Server的更新已经是微软在线更新的一部分,因此很容易获得安全的更新和补丁。
  • 互动安全(Secure through communication):微软已经建立了完善的基础设施来手机它产品中的漏洞。但这些信息如果只留在微软内部的话是没有任何用处的。因此公司致力于新漏洞的互动,积极打补丁来修正它们,定期发布更新到它的在线帮助系统来体现新的安全信息。

“它是安全的”的理念已经影响了整个产品。尽管SQL Server一打开就是相当安全的,当你创建数据库和安装服务时,你必须做出明智的安全选择来保持SQL Server的安全。作出并保证生产数据库服务器的安全需要行动和警惕。

记住有时候保护数据的最佳方法是直接不把它不放到数据库里——例如,只保存你必须绝对坚持有效的信用卡信息(这样的人并不多)。如果你没有这样的需求,你应该处理信用卡事务,保存结果,而不是信用卡信息本身。你不会承受你没有数据上的安全风险。

安全的2个阶段

SQL Server的安全模型,像Windows一样,是个2个阶段的过程,允许用户和其它登录的访问服务器里受保护的资源。

  • 验证(Authentication):一个用户登录成功,是有效的,可以访问服务器。验证回答问题,“你是谁?“需要用户去证明它,通常需要用户提供用户名和对应的密码,但其它形式的证据变得更加流行。
  • 授权(Authorization):用户可以和SQL Server对象互动——例如数据库,表和存储过程——哪个用户有权限。授权回答问题,”你可以做什么?“。

用户可以登录到SQL Server,但除非它们有权限做什么,例如访问数据库,它就做不了什么。因此你不仅需要为你的用户提供授权凭证,你还要授权它们访问数据,在每个它们需要使用的数据库里为它们授权一次,定义账号。

当你考虑它的时候,在每个数据库里需要一个用户账号更有意义。不然的话,什么可以阻止用户登录到SQL Server并可以访问想访问任何数据库。这个概念有不同的含义来实现不同的场景,但这是安全的基本状态。

在这个系列的接下来文章会谈到验证和授权,你会学到在SQL Server里如何实现各种安全功能来应付你对数据已经识别的威胁。

SQL Server安全术语

当你与SQL Server和其它产品打交道时,你会碰到各种特定的专业术语。这里有一些最常见的术语,还有在数据库安全上下文里它们的含义。

  • 验证(Authentication):如上面提到的,验证是积极识别一个人的过程,通过需要证明它是可以登录的人。它回答问题:你是谁?
  • 授权(Authorization):一旦系统验证你为一个有效用户,授权(如上所述)决定用户在服务器或数据库拥有的权限。它回答问题,这里现在你能做什么?
  • 组(Group):在Windows里,组是已登录后与它关联的主角。任何授权到组都会授权到组里相关联的登录。
  • 模拟(Impersonation):所有的Windows进程,包括各种SQL Server进程,在特定的安全上下文里运行,通常是主角引起进程启动。当进程临时在不同的安全上下文时会发生模拟。这是非常强大的切必需的能力,但会引起潜在的滥用。
  • 登录(Login):登录是拥有服务器实例里的对象一些访问级别的主角。通常,登录常用来与用户交互。但是SQL Server登录是一个用来从外面访问服务器的账号。有时候登录包括访问服务器级别的对象,例如配置信息,但不会授予数据库里的任何权限。
  • 许可(Permission):许可是访问保护资源的权利,例如从表读取数据或在服务器级别创建新的数据库。一个学科通常意味着其他许可,取决于对象许可的范围。
  • 主体(Principal):主体是可以接收访问SQL Server里保护资源的任何用户或代码组件。
  • 权限(Privilege):权限是主角拥有的广泛权利和许可。这个词有时候和许可交替使用,通常意味着特定、狭义的权利。权利意味着一组广泛的许可。
  • 角色(Role):SQL Server角色类似于Windows用户组,但只限于SQL Server实例范围。对于一个组,你可以分配登录和用户到角色,这就是这个角色拥有登录和用户的所有许可。
  • 用户(User):用户是在特定数据库里拥有对象的一些访问级别的主角。用户通常会映射到登录。简单来说,登录可以访问SQL Server实例,用户可以访问数据。

在这个系列的文章里你会看到大部分这些术语的使用。

SQL Server安全管理和实现

正如SQL Server里大多数操纵和管理任务,通常安全功能几乎都有很多管理和实现方法,包括使用SSMS的图形界面,编写和执行T-SQL代码,使用在命令行编写PowerShell与SQL Server进行交互。使用PowerShell已经不是本系列文章的讨论范围,但在这个系列文章里,你会看到另外2个技术的很多例子。

使用SSMS的安全功能,通常你可以在对象浏览器里右击合适的对象,选择【属性】,然后在对话框里使用合适的页来做你想要的修改。例如,在AdventureWorksLT2012示例数据库上设置安全,在对象浏览器里右击数据库名,选择【属性】,然后选择【权限】页,如插图1.1所示。

插图1.2:用来修改AdventureWorksLT2012数据库安全的权限页

同时在数据库和服务器级别,对象浏览器包括了安全节点,让你管理和实现其他各种安全功能。插图1.2显示了对AdventureWorksLT2012数据库和服务器实例级别的这个节点。这2个高亮的节点包括各种子节点,给你在选择范围内访问合适的安全对象。

插图1.2:在对象浏览器里,在服务器和数据库级别的安全对象

你会在SSMS和它各个窗体里找到各种隐藏的安全功能,因此你可以好好点开这些安全性节点。

在SQL Server 2005彻底安检里另外一个改变是可以允许更颗粒度的方式分配安全。在接下来的文章里你就会学到,你会对各种主体分配各种许可来实现“最小特权”的重要安全原则——这个想法是每个主体只能有它们需要的许可:不多也不少。随着这个改变,微软增强了T-SQL,在语言上有强大的支持,可以直接操纵安全对象。

代码1.1展示了你可以使用T-SQL创建安全对象的简单例子。代码首先创建链接到现存系统登录的服务器级别的登录。然后在AdventureWorksLT2012数据库里,代码创建了个用户映射到登录,分配了默认架构给用户。最后的一点代码向你展示了你如何在数据库里删除用户和创建另一个用户映射到同样的登录。很作秀,当然,但是它展示了在代码里你能做什么。或者你也可以在SSMS的图形界面里实现,如果你喜欢的话。

 1 -- Add a Windows login to SQL Server 2 CREATE LOGIN [PC201602202041\woodytu] FROM WINDOWS; 3 GO 4  5 USE AdventureWorksLT2012; 6 GO 7  8 -- Name the user the same name as login 9 CREATE USER [PC201602202041\woodytu] FOR LOGIN [PC201602202041\woodytu]10   WITH DEFAULT_SCHEMA = Production;11 GO12 13 -- Or, rename the user in the database14 DROP USER [PC201602202041\woodytu];15 GO16 CREATE USER woody FOR LOGIN [PC201602202041\woodytu];17 GO18 19 -- Query metadata to show that user was created20 SELECT * FROM sys.database_principals WHERE name = 'PC201602202041\woodytu';21 SELECT * FROM sys.database_principals WHERE name = 'woody';

代码1.1:创建服务器登录和数据库用户的示例代码

如果你想运行这个代码,首先你要做些改动。除非你的计算机名称和我的一样,且有一个woodytu的用户存在,你需要在代码里修改名称。这个代码在AdventureWorksLT2012数据库创建数据库用户,并使用它的Production架构,因此你要么需要安装这个数据库,要么修改代码使用另一个数据库和它里面存在的架构。但我还是建议你安装AdventureWorks数据库,因为接下来的文章会频繁用到它。

小结

这个系列的第一篇文章给你概括介绍了SQL Server 2012里的基本安全概念。你学到了一些常见的数据威胁,探寻了SQL Server背后的设计理念。你学到了安全的2个阶段——验证和授权,学习了在整个系列文章看到的一些安全术语,目睹了你可以使用SSMS图形界面和T-SQL代码来管理和实现安全。

在下一篇文章里,你会学到SQL Server里验证如何工作和验证可用选项的更多信息。