安全

常见 SQL Server 安全问题和解决方案

Paul S. Randal

 

概览:

  • 物理和网络安全
  • 攻击面、 服务帐户和最低权限
  • 身份验证、 授权和 SQL 注入
  • 灾难恢复和审核

内容

物理安全
网络安全
攻击面 Minimization
服务帐户
限制使用管理员权限
身份验证
授权
SQL 注入
灾难恢复
审核
摘要

已经在 IT 行业周围的任何人知道安全是一个热点主题。别是忘公司的数据是它的最宝贵资产之一,保护的数据至关重要。根据我已计划如何编写此安全问题,我尝试确定哪些安全功能应该有专用于它的整篇文章。但然后我开始考虑"先天 DBA"burgeoning 数 (这些 IT 专业人员用户无意中 wind 最负责一个 SQL Server 实例) 和很好的响应,我们需要在有关有效的数据库维护的前提示8 月 2008 发行的文章。它将删除我我应该怎么是编写介绍常见 SQL Server 安全问题的文章种入门您 SQL Server 实例更好的安全性。

介绍您应能查看的所有安全问题的文章将是整个杂志本身,因此我 canvassed 我的同事 SQL Server MVP (和我的妻子) 与我应包括的输入。我结算提供我认为您如果不安全的因此 DBA 突然发现自己负责一个 SQL Server 实例应考虑和相关的应用程序在前 10 个安全区域。(请记住这不包括是一个详尽的列表)。 对于每个问题,我已经提供问题,建议如何降低其,和指向详细信息的简短概述。

联机丛书中的所有链接将都是用于在 SQL Server 2008 版本,但每个网页指向 SQL Server 2005 版本。覆盖设置相应,我提供了指向主要的白皮书和联机丛书部分 SQL Server 2005 和 SQL Server 2008 的安全性。

物理安全

强制性不只是考虑 SQL Server 安全本身,但必须首先获取 SQL Server 会遍历的所有层。此概念通常称为"深入,保护"的分层安全性的您不要只是安全的一层,但考虑整个系统。

最明显的第一个考虑因素是,运行 SQL Server 在计算机的物理安全性,这一层但是,经常忽略或 complacency 的主题。我不指只是无论,是否盗计算机而且还要等承载数据库文件,该备份的磁带和承载数据库的冗余副本的任何服务器的存储系统的物理访问。只有具有物理访问这些对象的实际需要应有访问这些,,需要临时访问的任何人应是附带和监视。

一个不太明显的考虑因素是能够 SQL Server 高权限访问人员的桌面的安全性。如果用户具有 SQL Server sysadmin 访问权限,但是它们将解除锁定他们的 Windows 桌面,世界上的所有安全不会以防止有人遍历过去的无人参与系统可能访问敏感数据。多恶劣问题将如果某人 past 遍历,并且更改了某些数据对于是实例在 dishonest 员工知道人力资源数据库的架构,并尝试 undetectably 更改一个的薪水。

还有一个非常有趣 TechNet 白皮书 (包括一个幻灯片卡片组和网络广播,) 名为"在 Microsoft 的物理安全"的介绍了 Microsoft 如何管理其多个服务器的物理安全性。

网络安全

尽管您的服务器可能物理访问,它们很可能被连接到某种类型的网络。这可能是只是一个独立的公司 LAN 与外部连接,无,或者它可能是直接连接到 Internet。无论什么情况,个需要考虑的一些事项:

  • 请确保 Windows 服务器具有正确的网络安全配置。
  • 决定允许的网络协议,并禁用任何不需要。
  • 确保在防火墙设置 (如 Windows 防火墙) 并配置它以允许访问 SQL Server,(如中所示图 1).
  • 决定是否加密 SQL Server 连接,并正确配置。
  • 如果使用 Kerberos 注册服务器主体名称。Kerberos 是 underpins Windows 身份验证我介绍本文后面) 的身份验证机制,但得不好理解。Rob Greene,支持升级工程师,在日志中提供清晰、 简明的说明"Kerberos 进行忙管理." 我建议签出。
  • 决定是否使用 SQL Server 浏览器服务来帮助查找已安装的 SQL Server 实例,并决定是否要隐藏某些实例客户端。隐藏的实例表示客户端应用程序和用户将需要知道该 SQL Server 实例的连接详细信息,但它阻止用户 trawling 网络以查找 SQL Server 实例。

fig01.gif

图 1 配置 Windows 防火墙以允许 TCP 访问 SQL Server

所有这些任务 (和其他) 解释 SQL Server 2008 联机联机开头主题服务器网络配置. 上还有一个好的节客户端网络配置.

攻击面 Minimization

更多的服务和启用的功能,更攻击没有坏家伙攻击的表面或表面区域。SQL Server 2005 所需在"关闭默认情况下"策略,安全隐患的功能默认情况下被禁用,并且由 DBA 需要时只启用。(启用和禁用服务的此过程是通常称为外围应用配置)。

一种功能,您可能需要禁用一个主要示例是 xp _ cmdshell 提供了 Windows 系统上下文中 SQL Server 实例的方式在主机上执行命令。如果该 SQL Server 实例和 SQL Server 服务帐户具有提升的入侵者破坏 xp _ cmdshell 的 Windows 权限能太即可访问该 Windows 系统。

有多种外围应用配置的方法。SQL Server 2005 和 SQL Server 2008 支持 SQL Server 配置管理器配置的服务和网络协议。同时还支持 sp _ configure 存储过程配置数据库引擎功能和选项。例如,此代码将禁用 xp _ cmdshell 功能:

-- To allow advanced options to be changed
EXEC sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for -- advanced options
RECONFIGURE;
GO
-- To disable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0;
GO
-- To update the currently configured value for this -- feature
RECONFIGURE;
GO

在图形的方法配置数据库引擎选项和功能的是两个版本之间完全不同的。 SQL Server 2005 引入了 SQL Server 表面区域配置 (SAC) 工具。 这使您轻松地进行更改。 图 2 ,对于是实例显示了如何禁用 xp _ cmdshell 使用 SAC。

fig02.gif

图 2 Disabling xp _ cmdshell 使用 SAC SQL Server 2005 中

在 SQL Server 2008,SAC 被完全删除,然后功能 subsumed 由基于策略的管理功能。 您可以在 SQL Server 2008 联机联机主题中找到此的详细信息" 使用基于策略的管理管理服务器." 图 3 说明了创建一个条件检查已禁用的 xp _ cmdshell。 配置,策略可以针对 SQL Server 2005 和 SQL Server 2008 的实例和甚至"void*,"允许您本质上更改一次单击设置。

fig03.gif

图 3 创建 SQL Server 2008 中基于策略的管理条件

服务帐户

以一个或多个服务的身份运行的 SQL Server Windows 上,,每个服务需要有一个 Windows 帐户,用于运行该服务。 该帐户需要有 Windows 系统 (如网络和不同的文件系统目录中) 上的访问各种资源。 最佳的做法是为帐户具有最可能允许 SQL Server 正常运行所需的权限。 这将是部分称为最低权限、 可在系统的状态更多保护授予一个用户或处理所需这些权限和任何更多的原则。

在这种情况下,SQL Server 服务帐户不应是高权限帐户 (如本地系统或本地管理员) 因为 SQL Server 受到威胁时, 没有 Windows 系统还会遭到破坏的可能性。 调用网络服务的内置帐户通常运行服务,但如果 SQL Server 需要访问其他域资源,应使用最小权限和资源创建新的域用户帐户所需的访问。 SQL Server 2008 联机联机主题" 设置 Windows 服务帐户"提供服务帐户、 必需的权限和资源完整的列表。 请注意是否必须更改服务帐户 (或者任何关于该),您应始终使用 SQL Server 配置管理器以确保正确地进行所有必要的配置更改。

限制使用管理员权限

更多的曝光 SA 登录或 sysadmin 固定的服务器角色有,多个可能没有安全违反) 或一个意外。 有几个遵循的最佳实践。

最小化访问 SA 帐户,并因此限制 sysadmin 角色 (和其他权限的角色) 的成员身份的人的数目只有确实需要 sysadmin 特权拥有它们。 不要透露 SA 密码要临时访问 SQL Server 或 SQL 用户想要执行一些快速的任务的任何人。 在这的种情况下创建新的 SQL 登录,并授予任何权限是必需。

最好有作为 sysadmin 角色,而不是使用 SA 帐户的成员的人员。 这种方式,您可以删除用户的登录,而不必更改 SA 帐户密码。 如果您接管旧的服务器,并且有 SA 密码的更改之前访问它不知道这样您在控件中。

provokes 争论的一个问题的是是否删除 Windows 内置 / 管理员组从 sysadmin 角色 (它添加默认情况下)。 Windows 管理员能够查询人力资源数据库? 或执行您的公司显式信任所有管理员具有完整性和 honesty? 如果您决定将其删除,请继续关注。 这更是如此,如果不采取正确的步骤,您 SQL Server 可能无法启动在群集环境中。 有关此和其他群集问题的详细信息,请参阅知识库文章" 群集的 SQL Server dos、 不可为事项和基本警告."

对于那些没有 sysadmin 访问,鼓励他们不必使用高特权登录,除非绝对必要时,不授予每个这些两个用户登录、 一个权限和一个。 默认情况下使用 nonprivileged 的帐户将有助于尽量减少成本的错误的可能性,并还减少一个未锁定的 Windows 终端拥有一个窗口在其上打开使用 sysadmin 的权限的可能性。 请记住: 深层防御 !

我将在此处进行的最后一个点是避免需要 sysadmin 特权的应用程序。 遗憾的是,这是常见的和不可避免的无效操作与某些应用程序,但要应避免这种做法 homegrown 的应用程序中,并抱怨任何应用程序开发人员需要 sysadmin 权限的操作。

身份验证

有两种身份验证模式: Windows 身份验证和混合模式 (这是结合 SQL Server 身份验证的 Windows 身份验证)。

Windows 身份验证使用网络 / 域帐户来验证 Windows 帐户被用来连接到 SQL Server。 如果在安装过程中选择此选项,则 SA 帐户是使用随机生成密码创建,但有效地禁用。 安装,紧跟您应为强和安全密码更改 SA 密码,但继续保留帐户禁用除非绝对必要。

SQL Server 身份验证依赖于一个定义 SQL Server 帐户和密码存储在 SQL Server 中每个用户。 当然,这意味着 SA 帐户已启用,并且必须已定义的密码。 使用 SQL Server 身份验证,用户具有至少两个的用户名和密码 (一个用于网络),一个用于 SQL Server。 通常建议您只使用 Windows 身份验证可能时,因为它是更安全的解决方案。 联机丛书主题" 选择一个身份验证模式"说明这与如何更改身份验证模式的更详细地。

如果将使用 SQL 身份验证,则所有用户都应都具有一个强密码复杂为因而到密码破解程序被猜到的。 这一高权限帐户如 SA 和 sysadmin 角色的成员的尤其重要。 (一个最常见,但最坏操作时使用空的 SA 密码。 幸运的是,SQL Server 2000 SP 3 的不可能)。

此外应定期更改密码,并您的公司应发布企业策略,以帮助员工使用安全和强密码最佳实践。 有关创建和保护强密码的最佳实践概述,请参阅文章" 强密码: 如何创建和使用。." 您可以将这些策略合并到公司的策略。

如果 SQL Server 2005 或 SQL Server 2008 正在运行 Windows Server 2003 或更高版本,它可以利用 Windows 密码策略机制来强制执行复杂性和过期策略。 SQL Server 2008 联机联机部分称为" 密码策略"中 SQL Server 有强密码和不同的密码策略的支持信息。

授权

正如我已,提到保护系统的原则之一是使用最低权限原则。 而直接应用于管理员级别权限,还应用于常规数据库用户的权限。 一个数据库中的用户 (可能不能够访问另一个数据库中的数据。 一组表的所有者不能够排列与其他人的表。 用户只应该能够访问的数据应该访问,并且甚至然后它们应只能够对数据 (对于是实例 SELECT,但不是 UPDATE 或 DELETE) 执行所需的操作。

所有这些可以完成 SQL Server 中全面、 层次结构的权限系统的用户或角色 (称为主体) 被授予或拒绝某些资源 (称为 securables) 某些特定权限如对象、 架构或数据库。 概述 SQL Server 权限层次结构如 图 4 所示。 这也意味着您遵循最低权限原则。 例如,不将所有数据库开发人员 db _ owner 角色的成员。 限制公共角色的权限,并仅授予到最低级别 (用户或角色) 尽量减少直接访问的权限。 权限的最佳做法的完整讨论不在本文的范围之内,但 SQL Server 2008 联机联机包含一节" 标识和访问控制 (Database Engine)",将提供到所有概念钻取的列表。

fig04.gif

图 4 The SQL Server 权限层次结构

若要允许更精细的权限和更好地在数据库中的角色分离,SQL Server 2005 引入了用户架构分离: 架构独立于数据库用户,是对象的只是容器。 这允许多个行为的更改,包括的管理权限的更多细化精度。 (包含四个部分的命名遵循格式 Server.database.schema.object SQL Server 2005 和 SQL Server 2008 中,格式以前 Server.database.owner.object)

是例如架构创建与数据库开发人员具有控制权限。 它们可以 CREATE、 ALTER 和 DROP 任何对象架构中它们控制,但它们具有在数据库中的其他架构没有隐含的权限他们不再需要的 db _ owner 权限数据库开发。 此外,用户架构分离允许删除而不必对所有相关的对象或应用程序使用新的用户名称的数据库用户在对象架构的成员并且它们不再与该对象的创建者。

就最好架构用于对象所有权,由于这些原因。 详细信息可在 SQL Server 2008 联机联机主题中" 用户架构分离."

阻止用户执行他们不是应执行的操作的另一个方法是不允许直接访问基本表。 这可以通过提供存储的过程来完成,并函数用于封装,控制,和隔离操作 (如更新和删除,并提供的视图,从而控制和最佳的选择。

SQL 注入

获得未授权的访问数据的最常见的方法之一是使用 SQL Injection 攻击。 SQL 注入可以将许多的窗体,但主要的方法利用使用动态构造的字符串和意外的代码"插入"到构造的代码。 是例如以下 Injection 攻击利用不良编写逻辑来验证用户输入以技巧 SQL Server 到方法中输入字符串包括转义字符接受输入。 尽管 contrived,本示例将突出显示代码动态构造字符串使用不充分验证的输入时可以发生:

DECLARE @password VARCHAR (20);
DECLARE @input    VARCHAR (20);
DECLARE @ExecStr  VARCHAR (1000);

SELECT @password = 'SecretSecret';

-- assume application gets input 'OR''='
SELECT @input = '''OR''''=''';

SELECT @ExecStr = 'IF ''' + @password + ''' LIKE ''' + @input + ''' PRINT ''Password Accepted''';

EXEC (@ExecStr);
GO

如果您运行此代码时,将打印该短语密码接受"即使用户输入显然不匹配密码字符串。 用户输入包含更改 Transact-SQL 逻辑,因为输入了不正确分析并检查的转义序列。

SQL 注入不应为编写良好的应用程序出现问题,并且有一些特定的技巧 (如使用 QUOTENAME 分隔标识符)。 但是,如果您继承旧应用程序 (或可能在 homebrew 项目,成为公司应用程序的),则应特别测试以查看它是否容易受到 SQL Injection 攻击。 有多种方法可用于减少 SQL Injection 攻击。 SQL Server 2008 联机联机有一个全面的节开头适当命名主题" SQL 注入."

灾难恢复

多少需要担心这取决于您停机和数据丢失的要求是什么。 (如果您没有已定义这些要求,应该 !) 安全问题可能在多个级别。 灾难恢复包括故障转移到另一个 SQL Server 或需要还原数据库包含加密的数据时,有一些问题。

在第一种情况下时出现问题需要访问数据库登录具有不被复制在故障转移服务器上对于是实例时使用日志传送或数据库镜像。 如果数据库故障转移到镜像实例,并且应用程序试图在镜像服务器上使用特定的登录名不存在的连接,应用程序将收到 18456 错误"登录失败"。 该登录名是应用程序生态系统的一部分,,必须在承载数据库的实例上定义。 知识库文章 918992" 如何 SQL Server 2005 的实例之间传输该登录名和该密码"说明如何执行此,操作,我将稍后讨论疑难解答错误 18456。

在第二种情况下问题数据库备份含有加密的数据和在加密密钥 (或项) 来加密数据不备份时发生,或在还原了数据库 SQL Server 实例中不可用。 最好的情况是只有部分在数据库中数据被加密,并因此仅数据的子集不能访问。 在最坏的大小写情况是 SQL Server 2008 中使用透明的数据加密 (TDE) 加密的整个数据库。 在这种情况下如果用来保护数据库加密密钥服务器证书不备份,或者不可用,无法还原整个数据库,并返回以下错误:

Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint
'0xFBFF1103AF133C22231AE2DD1D0CC6777366AAF1'.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

这当然,TDE 点人在加密的数据库的迷失备份发生无法恢复,访问敏感数据。 但如果数据是您,并且需要对其进行访问,然后必须提供服务器证书,或者数据将丢失。

加密本身中的大主题并全面覆盖 SQL Server 2008 联机联机以在" SQL Server 加密"一节。 您还可以观看我演示 TDE,并已成功将还原到位于.com / 提示的随附的视频 screencast 中第二个实例。

审核

最重要的操作,应执行以提高系统的安全性之一是实现审核。 与此,就会知道的做。 这甚至可能是业务的必须根据您性质。

最起码,应在以便您可以知道是否,对于是实例五个的失败的登录尝试跟一个成功审核失败和成功的登录。 就会知道当有人正试图以中断到您的 SQL Server 实例 (和使用的登录)。 图 5 显示了配置登录审核通过 SQL Server 2005 Management Studio 中服务器属性对话框。 为邮件错误日志中的 18456 审核失败的登录,并错误状态提供失败的原因。 最佳说明我找到不同的状态以及有关解决这些,长讨论的是从名为 SQL 协议博客上的 il Sung Lee 文章中" 了解登录失败 (错误 18456) 错误信息 SQL Server 2005 中."

fig05.gif

图 5 Confi guring 登录审核 SQL Server 2005 Management Studio 中

所有操作的全面审核很难在 SQL Server 2005 (和也不在本文的范围之内)。 它包括各种触发器和 SQL 跟踪。 在 SQL Server 2008,审核已大大简化在一项新功能引入: SQL Server 审核。 这将介绍新的、 非常详细白皮书标题为" SQL Server 2008 中的审核." 在将随附的视频 screencast 我将阐述 SQL Server 审核。 您可以在其他审核工具在 SQL Server 2008 联机联机获取详细信息" 审核 (数据库引擎)"一节。

摘要

这将大量主题和链接,大量,但这是本文的点。 我想要提供您不使用安全的处理 DBA 时必须考虑的重要的安全主题的概述。

有一些工具可帮助您检查系统的常见的安全漏洞。 第一个是将检查 Windows、 网络、 文件系统和甚至某些 SQL Server 2000 和 SQL Server 2005 的安全问题,Microsoft Baseline Security Analyzer (MBSA) 实用工具。 最新版本 Microsoft Baseline Security Analyzer 2.1. 再次对于 SQL Server 2000 和 SQL Server 2005 只,有是一个名为 SQL Server–specific 工具, 最佳实践分析工具(BPA)。 这会使用预定义的规则列表检查 SQL Server 配置并标记任何问题 (对于是实例为空 SA 密码)。

这些工具都不适用于 SQL Server 2008。 事实上,BPA 将不会释放的 SQL Server 2008 根本,并且已被替换,沿短 SQL Server 2005 外围配置工具由新的基于策略的管理功能,我在前面讨论。 此替换的原因的部分是 BPA 和 SAC 了只读的工具,,帮助您查找问题,它们无法修复的问题。 基于策略的管理提供了多种纠正的选择,它可以甚至能用于目标 SQL Server 2000 和 SQL Server 2005 服务器。

当然,您应该始终使用 Windows Update 以确保可以在适当的时间安装下载新的安全修补程序和 Service Pack,这是最佳的方法保持最新最新更新。 不采用停机时间是超出本文的范围,但一些想法演示中安装这些在 2006 年 12 月 SQL 问题与解答专栏。

如果您在设法查找安全的常规 Microsoft 资源有将显示在您喜爱的搜索引擎的多个目标。 若要保存您某些时间单击周围,我将建议两个密钥白皮书应阅读。

" SQL Server 2005 安全最佳 Practices–Operational 和管理任务"和" 数据库管理员的 SQL Server 2008: 安全性概述."

对于 SQL Server 2005,到安全部分入口点,联机图书的是主题" 数据库和数据库应用程序的安全事项." 用于 SQL Server 2008,等效的联机丛书项关键是," 安全和保护 (数据库引擎)."

就本文中的 takeaways 是而言,我希望您意识到有一些步骤,您需要转到要确保的数据将存储在 SQL Server 是根据需要,才能为安全。 当继承管理其他人的一个 SQL Server 实例时,这一点尤为重要。 就像人购买一个所,您需要要求是否警报工作,是否在码 fenced 在并且用户具有该密钥的副本。 运行通过我授予本文中的列表是一个良好的开端,但一定研究更深入方面与您相关的。 并为始终,如果有任何反馈或问题,放我在一行 Paul@SQLskills.com.

Paul S。 Randal 是在管理 Director 的 SQLskills.com 和 SQL Server MVP。 他效 SQL Server 存储引擎团队 Microsoft 从 1999 年可以 2007。 Paul 写 DBCC CHECKDB / 修复 SQL Server 2005 但负责核心存储引擎 SQL Server 2008 开发过程中。 Paul 在灾难恢复、 高可用性和数据库维护的专家且为常规的演示者在世界各地的会议。 在他博客 SQLskills.com/blogs/Paul.