第一篇 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中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上。
威胁
识别威胁到一个特定的数据集和它的服务器是了解如何配置和使用SQL Server来保护你的数据的重要的第一步。你创建的数据库管理你的小学足球队的设备清单可能不需要大量的安全措施。你很可能想提供较小的访问控制,这样一个团队成员不可以随机更改记录。但它可能不是世界末日,如果有人侵入修改数据。
在另一方面,如果数据库有球队成员的个人数据,如家庭住址和电话号码,你就可能要加强保护(可能是法律要求这样做)。你可以通过隔离访问的方式保护隐私数据,几乎所有能访问数据库的人都可以更改设备数据,但只有少数人可以访问个人数据。如果数据包括了信用卡号码,你需要更极端的保护措施。
你的数据可能会受到一些威胁,下面的列表是比较常见的。在网络上有足够的资源可以帮助你分析特定情况的风险。这个清单的目的是帮助你开始思考威胁和如何使用SQL Server的功能来对付他们或至少减少你的数据暴露给他们。
->数据被盗:数据被盗涵盖了各种类型的未经授权的访问你的数据,无论是由一个外部黑客入侵你的网络或内部扫描对名人污垢。它可能涉及阅读禁止的信息或是出于潜在的销售被盗信用卡号码的刺激。
->数据破坏:黑客获得访问你的数据可以改变它,可以引起一系列的问题,从公共尴尬到关闭你的整个操作(这可能发生当所有客户记录被删除)。
->数据腐败:在关系数据库中存储数据的最大好处之一,数据库本身可以帮助保护数据的完整性。数据的完整性,包括要求每个订单都有一个关联的客户,一个日期存储在日期字段是一个真实的日历上的日期,一个百分比字段只包含值0~100之间。数据完整性很可能不是你认为与安全相关的第一件事,但它是保护你的数据的重要组成部分。
->非法储存:在过去,你在业务过程中收集的数据是你自己的业务。但是现在,美国、整个欧洲联盟和其他国家都存在着大量的联邦法律控制你可以存储、你如何存储、如何保护个人数据。对违规行为的处罚比较严厉,包括金钱上的处罚以及对贵公司的公众形象。
这系列覆盖SQL Server 2012的特点,有助于减轻这些威胁和许多其他。你必须了解你的数据的威胁,知道如何保护他们。不要浪费时间在不保护你的具体数据被特定威胁的措施上。你永远不可能覆盖所有假设的情况,在最坏的情况,你会让你的数据库服务器的目标用户完全无法使用。安全问题始终是一种妥协,平衡风险和必要的时间和金钱来实现和维护保障。
安全设计理念
2002年初比尔盖茨发出了他那臭名昭著的Trustworthy Computing备忘录,这是微软如何思考和实现其产品的安全性的转折点。据微软网站称,由此产生的可信计算倡议,“基于健全的业务实践,专注创造和提供安全、私人和可靠的计算经验。我们的目标是一个更安全、更可信的互联网。”
换句话说,十多年前微软对于安全变得非常严肃。这种变化后发布的第一个版本是SQL Server 2005——微软彻底检查整个产品的安全。此后,每个版本的SQL Server保留安全基本特性,逐步提高并增加新的功能,以提高安全性和解决新出现的威胁。
Trustworthy Computing通过定义产品安全设计四大支柱影响SQL Server的发展:
Secure by design:微软对它的设计、编码和交互进行广泛的威胁分析和安全审核,来确定/识别攻击者可以进入到服务器和数据的入口点。结果是,微软设计SQL Server保护数据的机密性、完整性、以及可用性。
Secure by default:SQL Server默认只安装和激活关键核心数据库组件。这意味着,不关键的核心数据库组件/功能是没有安装或安装但没有激活。没有安装的功能不易受攻击。你必须有意识的和慎重的安装或激活非核心功能。这可以防止许多攻击,你可能不知道被安装,因为你从来没有使用过他们。
Secure in deployment:微软提供工具支持安装SQL Server并保持它的安全。SQL Server配置工具可以帮助你配置服务器的安全。最重要的是,更新SQL Server现在已经是在线微软更新服务的一部分,所以很容易获得安全更新和补丁。
Secure through communication:微软已经建立了一个详细的基础设施来收集有关其产品中的漏洞的信息。但是,如果在微软内部,所有的信息都是毫无价值的。因此,公司致力于沟通新的漏洞并积极修补它们,并定期更新在线图书帮助系统反映新的安全信息。
"it's just secure"这一理念贯穿整个产品。虽然SQL Server是相当安全的,但在你创建数据库和安装服务时,你必须作出明智的选择保证SQL Server实例的安全。It takes work and vigilance to make and keep a production database server secure.
记住,有时候保护数据的最好方法就是不把它放在数据库中。
安全的两个阶段
类似于Windows系统,SQL Server的安全模式是一个两阶段的过程,允许用户登录访问服务器内受保护的资源。
验证:用户登录、验证、并获得访问服务器。验证回答了这个问题,“你是谁?”并要求用户证明它,通常通过用户名、密码,但其他形式的证明变得更受欢迎。
授权:用户只能操作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中大多数配置和管理,有多种方式管理和实施安全功能,包括使用Management Studio的图形界面,编写和执行T-SQL代码,PowerShell。使用PowerShell已经超出本系列的范围,但在本系列你会看到大量使用另外两项技术的例子。
使用Management Studio,在对象资源管理器中,右键单击一个对象并选择属性,然后在对话框中使用合适的选项做出你想要的改变。例如,设置AdventureWorks2012示例数据库的权限,请右键单击数据库名称,选择“属性”,然后选择“权限”选项卡,如图1.1所示。
图1.1 修改AdventureWorks2012数据库的安全权限页面
在数据库和服务器实例级别,对象资源管理器均包括一个安全节点,该节点可以管理和实施其他类型的安全功能。图1.2显示了AdventureWorks2012数据库和服务器实例级别的安全节点。每一个高亮显示的节点包含了不同的子节点,不同的选择对应访问不同的安全对象范围。
图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语句来管理和实施安全。
下一篇,你会学到更多关于验证如何工作和验证选项。
第一篇 SQL Server安全概述的更多相关文章
- 第一篇 SQL Server代理概述
本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...
- 【译】第一篇 SQL Server安全概述
本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...
- 【译】第一篇 SQL Server代理概述
本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...
- 旧电脑做服务器--第一篇 sql server 服务器搭建
背景:旧电脑为2015年的老电脑,联系G50系列,目前键盘鼠标操作都有问题,键盘按键和鼠标左键莫名奇妙变成右击,屏幕显示也是大颗粒.但是配置还可以,16GB内存+256GB三星固态硬盘.所以想搭建作为 ...
- 第三篇——第二部分——第一文 SQL Server镜像简介
原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...
- 第一篇——第一文 SQL Server 备份基础
原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net ...
- 第九篇 SQL Server代理了解作业和安全
本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...
- 第八篇 SQL Server代理使用外部程序
本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...
- 第六篇 SQL Server代理深入作业步骤工作流
本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...
随机推荐
- 更新AD对象属性值
1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...
- require(__DIR__ . "/../sss.php"
魔法函数 __DIR__ 是 php5.2以后新加的函数,返回当前文件所在的目录,返回的目录不带 \,所以上边的意思是:Require当前目录的父目录中的 sss.php
- emacs tutorial笔记
emacs tutorial笔记---基本控制 C-字母 表示一起按下Ctrl和字母/ 表示“或者”的意思 C - ctrlM - alt C-p C-b C-f C-n C-l 当前行放中央 ...
- 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(2)
Lighting和Shading(2)镜面反射的控制和模拟次级表面散射技术 http://www.4gamer.net/games/216/G021678/20140703095/index_2.ht ...
- 状态模式 java && php
状态模式 java && php 状态模式 输入信号是事件:输出是状态结果,状态模式状态机就是一个黑盒子.状态模式主要突出了两个字:”改变”,对象的状态决定了状态的行为,事物的 ...
- delphi 创建DBASE和FOXPRO两类DBF数据文件的差异
delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...
- html5之canvas初解
<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 必须使用脚本来完成实际的绘图任务. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属 ...
- js制作带有遮罩弹出层实现登录小窗口
要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并 ...
- go access database demo
package main import ( "database/sql" "fmt" _ "github.com/lib/pq" " ...
- Python之什么是dict
我们已经知道,list 和 tuple 可以用来表示顺序集合,例如,班里同学的名字: ['Adam', 'Lisa', 'Bart'] 或者考试的成绩列表: [95, 85, 59] 但是,要根据名字 ...