本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文。
面对当今复杂的攻击SQL Server有你需要的一切来保护你的服务器和数据。但在你能有效地使用这些安全功能之前,你需要了解你所面临的威胁和一些基本的安全概念。本系列的第一篇将讲解基础知识,可以充分利用SQL Server中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上。
Relational databases are used in an amazing variety of applications with connections from a dizzying array of clients over widely distributed networks,特别是互联网,使得数据几乎向任何人,任何地方开放。数据库可以包含相当大部分的人类知识,包括高度敏感的个人信息和关键数据。
数据库的这些特性使得有人想要窃取数据或通过篡改以损害它的主人。确保你的数据是安全的是一个关键部分来配置SQL Server和开发应用程序存储数据。这一系列将探索SQL Server 2012安全基础,那样你可以保护你的数据和服务器资源,getting as granular as you need to be to protect against the unique security threats that can affect your data.大部分的功能适用于早期版本的SQL Server,但我也会讨论只适用于SQL Server 2012和以后版本的功能。
威胁
识别威胁到一个特定的数据集和它的服务器是了解如何配置和使用SQL Server来保护你的数据的重要的第一步。你创建的数据库管理你的小学足球队的设备清单可能不需要大量的安全措施。你很可能想提供至少很小的访问控制,这样一个团队成员不可以随机更改记录。但它可能不是世界末日,如果有人侵入修改数据。
在另一方面,如果数据库有的球队成员的个人数据,如家庭住址和电话号码,你就可能要加强保护(可能是法律要求这样做)。你可以通过隔离访问的方式保护隐私数据,几乎所有能访问数据库的人都可以更改设备数据,但只有少数人可以访问个人数据。如果数据包括了信用卡号码,你需要更极端的保护措施。
你的数据可能会受到一些威胁,下面的列表是比较常见的。在网络上有足够的资源可以帮助你分析特定情况的风险。这个清单的目的是帮助你开始思考威胁和如何使用SQL Server的功能来对付他们或至少减少你的数据暴露给他们。
->数据被盗:数据被盗涵盖了各种类型的未经授权的访问你的数据,无论是由一个外部黑客入侵你的网络或内部扫描对名人污垢。它可能涉及阅读禁止的信息或是出于潜在的销售被盗信用卡号码的刺激。
->数据破坏:黑客获得访问你的数据可以改变它,可以引起一系列的问题,从公共尴尬到关闭你的整个操作(这可能发生当所有客户记录被删除)。
->数据腐败:在关系数据库中存储数据的最大好处之一,数据库本身可以帮助保护数据的完整性。数据的完整性,包括要求每个订单都有一个关联的客户,一个日期存储在日期字段是一个真实的日历上的日期,一百分比字段只包含值0和100之间。数据完整性很可能不是你认为与安全相关的第一件事,但它是保护你的数据的重要组成部分。
->非法储存:在过去,你在业务过程中收集的数据是你自己的业务。但是现在,美国、整个欧洲联盟和其他国家都存在着大量的联邦法律控制你可以存储、你如何存储、如何保护个人数据。对违规行为的处罚比较严厉,包括金钱上的处罚以及会贵公司的公众形象。
这系列覆盖SQL Server 2012的特点,有助于减轻这些威胁和许多其他。你必须了解你的数据的威胁,知道如何保护他们。不要浪费时间在不保护你的具体数据的特定威胁的措施上。你永远不可能覆盖所有假设的情况,在最坏的情况,你会让你的数据库服务器的目标用户完全无法使用。安全问题始终是一种妥协,平衡风险和必要的时间和金钱来实现和维护保障。
安全设计理念
2002年初比尔盖茨发出了他臭名昭著的可信计算备忘录,这是微软如何思考和实现其产品的安全性的转折点。据微软网站称,由此产生的可信计算倡议,“基于健全的业务实践,专注创造和提供安全、私人和可靠的计算经验。我们的目标是一个更安全、更可信的互联网。”
换句话说,十多年前对于安全微软变得非常严肃。这种变化后发布的第一个版本是SQL Server 2005,在微软彻底保障整个产品。此后,每个版本的SQL Server保留新的安全基础设施,逐步提高和增加新的功能,以提高安全性和解决新出现的威胁。
作为微软形容它在SQL Server 2005的日子,可信赖计算影响SQL服务器的发展通过定义产品的安全设计四大支柱:
安全的设计:微软广泛进行威胁分析和设计、编码和交互的安全审核确定的点,攻击者可以进入到服务器和数据。结果是,微软SQL Server设计保护机密性,完整性,以及数据的可用性你有店。
默认安全:开箱,SQL Server安装和激活的关键核心组件的默认数据库。这意味着,不关键的核心数据库功能的功能是没有安装或安装,但没有激活。没有安装的功能不易受攻击。你必须有意识地和故意地安装或激活非核心功能。这可以防止许多攻击的功能,你可能不知道被安装,因为你从来没有使用过他们。
………………
安全的两个阶段
类似于Windows系统,SQL Server的安全模式是一个两阶段的过程,允许用户登录访问服务器内受保护的资源。
验证:用户登录、验证、并获得访问服务器。验证回答了这个问题,“你是谁?”并要求用户证明它,通常通过用户名、密码,但其他形式的证明变得更受欢迎。
授权:用户只能操作SQL Server对象,如数据库表和存储过程--限于那些她有权限的。授权回答这个问题,“你可以做什么?”
用户可以登录到SQL Server,但除非他们被允许做某事,如访问数据库,否则他们不能做任何操作。所以你不仅需要为你的用户提供验证凭证,你还需要授权他们访问数据,通过在需要的数据库下定义用户。
当你考虑一下,在每个数据库中都需要一个用户帐户是有意义的。否则,什么会阻止用户登录到SQL Server然后使用任何他们想要的数据库?不同的场景会有不同的概念,但这是安全的基本状态。
在这一系列的后续章节会包括验证和授权,你将学习如何实施/执行SQL Sserver的各种安全功能,以防止你的数据的受到威胁。
SQL Server安全术语
当你在SQL Server和其他产品的安全工作,你会遇到各种各样的专业术语。下面是一些比较常见的术语和它们在数据库安全方面的含义。
验证:如上所述,验证是一个识别用户的进程,通过要求她来证明她是与登录匹配的用户。它回答了这个问题,你是谁?
授权:一旦系统对用户进行验证,授权决定了用户在服务器或数据库的权限。它回答了这个问题,你在这里能做什么?
组:在Windows中,组是一个主体(有登录名与其关联)。任何授予组的权限会授予给相关的登录。
模拟:所有的Windows进程,包括各种SQL Server进程,运行在一个特定的安全上下文(通常是引起进程启动的主体)。模拟发生在当一个进程暂时需要在不同的安全上下文。这是一个非常强大和必要的功能,但有可能滥用。
登录:登录是一个主体,在一个服务器实例中具有某种访问对象的权限。在常见的用法,登录通常与用户交替使用。但一个SQL Server登录是从外部访问服务的帐户。登录有时包括访问服务器对象的权限,如配置信息,但通常不授予数据库中的任何权限。
权限:权限是访问受保护的资源的权利,例如从表中读取数据,或者在服务器级别创建新的数据库。一个权限通常意味着其他权限,这取决于主体权限的范围。
主体:主体是任何用户或可以接收访问SQL Server受保护资源的权限组件。
特权:特权是主体拥有的一组广泛的权利/权限。这个词有时被允许和权限(往往意味着一个特定的,狭隘的权利)互换使用,特权意味着一组更广泛的权限。
角色:SQL Server角色类似于Windows组,但仅限于SQL Server实例的范围。你可以指定登录名和用户的角色,角色拥有的权限会继承给登录名和用户。
用户:用户是特定数据库中一个具有访问对象权利的主体。用户通常映射到登录名。简单来说,登录名访问SQL Server实例,用户访问数据。
管理和实施SQL Server安全
如同SQL Server中大多数配置和管理,有多种方式管理和实施安全功能,包括使用Management Studio的图形界面,编写和执行T-SQL代码,PowerShell。使用PowerShell已经超出本系列的范围,但在本系列你会看到大量使用另外两项技术的例子。
使用Management Studio,在对象资源管理器中,右键单击一个对象并选择属性,然后在对话框中使用合适的选项做出你想要的改变。例如,设置AdventureWorksLT2012示例数据库的权限,请右键单击数据库名称,选择“属性”,然后选择“权限”选项卡,如图1.1所示。
图1.1 修改AdventureWorks2012数据库的安全权限页面
在数据库和服务器实例级别,对象资源管理器均包括一个安全节点,该节点可以管理和实施其他类型的安全功能。图1.2显示了AdventureWorksLT2012数据库和服务器实例级别的安全节点。每一个高亮显示的节点包含了不同的子节点,不同的选择对应访问不同的安全对象范围。
图1.2 资源管理器中服务器和数据库的安全对象
你会发现Management Studio窗体下隐藏有各种安全功能,因此在你操作它们之前,有必要做一些探索。
SQL Server 2005安全检修引入一个变化,允许的权限被赋予更多粒度的方式。为了实施最小特权,你可以将多种权限分配给主体,每个主体有且仅有他们需要的权限:权限不多也不少。随着这种变化,微软加强T-SQL直接操纵安全对象。
1.1中的代码显示你可以使用T-SQL来创建安全对象的例子。代码首先创建一个服务器级登录连接到一个现有的Windows登录。然后,在AdventureWorks2012数据库,创建了一个用户映射到登录,以及向用户分配一个默认的架构。最后显示了在数据库中如何删除用户,并创建另一个用户映射到相同的登录名。当然也可以在图形界面操作。
--Add a Windows login to SQL Server CREATE LOGIN [Marathon\JoeStairway] FROM WINDOWS; GO USE AdventureWorks2012; GO --Name the user the same name as login CREATE USER [Marathon\JoeStairway] FOR LOGIN [Marathon\JoeStairway] WITH DEFAULT_SCHEMA = Production; GO --Or, rename the user in the database DROP USER [Marathon\JoeStairway]; GO CREATE USER Jane FOR LOGIN [Marathon\JoeStairway]; GO --Query metadata to show that user was created SELECT * FROM sys.database_principals WHERE name = ‘Marathon\JoeStairway‘; SELECT * FROM sys.database_principals WHERE name = ‘Jane‘;
代码1.1 创建服务器登录名和数据库用户
如果你想试着运行这段代码,你可能首先需要做些调整。除非你的机器名是Marathon并且存在JoeStairway用户名,你需要在代码中更改这些名称。该代码在AdventureWorks2012创建数据库用户并且使用Production架构,所以你需要有这个数据库或更改代码使用另一个数据库和已有架构。但你可能需要AdventureWorks示例数据库,因为这一系列会频繁地使用到它们。
总结
这一篇讲述了SQL Server 2012基本的安全概念。你已经了解到的一些数据常见的威胁,并探讨了SQL Server安全背后的设计理念。你学会了安全的两个阶段——验证和授权,学到了一些安全术语,你可以通过图形界面和T-SQL语句来管理和实施安全。
下一篇,你会学到更多关于验证如何工作和验证选项。