Stairway to SQL Server Security Level 3: Principals and Securables

QL Server安全级别3的stairway:主体和负责人安全

唐•吉利,2014/07/16

该系列

本文是stairway系列的一部分:SQL Server Security的stairway

SQL Server提供了保护服务器和数据免受当今复杂攻击所需的一切。但是在您能够有效地使用这些安全特性之前,您需要了解您所面临的威胁和一些基本的安全概念。第一个stairway级别提供了一个基础,这样您就可以充分利用SQL Server中的安全特性,而不必将时间浪费在无法保护数据免受特定威胁的特性上。

通常,通过将对象的权限分配给主体,可以在SQL Server中实现用户和对象的安全性。但是什么是SQL Server主体呢?它得到了什么许可?在这个阶梯级别中,您将了解可以通过权限授权的各种主体,以执行操作并访问SQL Server实例中的可保护对象。SQL Server中一组重要的主体是角色,您将了解角色如何使管理安全性比将单个用户作为唯一类型的主体更容易。您还将了解SQL Server中可安全使用的对象,并将其设置为了解下一层的权限。

授权

第2级包含的身份验证只是访问数据库服务器中所有优点的一部分。身份验证有点像护照,可以证明你是谁,但没有签证——你需要签证才能进入这个国家,在这个国家四处走动。在这个级别中,您将了解授权以及它如何作为提供对数据库对象访问的visa。

主体是可以访问SQL服务器或其数据库中的一个或多个可保护对象的用户或进程。可保护的对象(或仅仅是可保护的)是一种受保护的资源,只有某些人或进程才能查看或更改,例如表中的数据。权限使主体能够获得对可安全访问的特定类型的访问。

继续这个护照类比,校长是护照的持有者,护照上有照片的人。最安全的是校长想要访问的国家,而许可则是跨越国家边境并享受访问的签证。

负责人

在安全性上下文中,主体是任何用户(人类类型)、用户组(在SQL Server中称为角色)或运行在进程中的代码,该进程可以请求对可保护对象的访问,并授予或拒绝对该对象的访问权。所有Windows和SQL Server登录都是主体,以及它们在数据库中映射到的用户。下面的列表显示了SQL Server中大多数更重要的主体的层次结构,从具有SQL Server实例权限的服务器级主体到数据库级主体:

windows级别主体

Windows域登录

Windows组

Windows本地登录

SQL服务器级主体

SQL Server登录

将SQL Server登录映射到证书。

SQL Server登录映射到Windows登录

SQL Server登录映射到非对称密钥

数据库级的主体

应用程序角色

数据库的作用

数据库用户

数据库用户映射到证书

数据库用户映射到Windows登录。

数据库用户映射到非对称密钥。

公共角色

理解这个层次结构很重要,因为主体的范围部分地决定了授予它的权限的范围。例如,数据库用户只能在该数据库的上下文中授予其权限。SQL server级主体可以在整个服务器上具有权限,而Windows级主体可以具有超出SQL server范围的权限,可以扩展到Windows的本地实例和整个网络。

请注意,在前面的列表中,主体可以是登录(或用户)和角色。SQL Server中的角色类似于Windows组。拥有角色成员资格的用户继承分配给角色的权限。角色使安全管理更加容易,因为您不需要为单个用户管理复杂的权限集。SQL Server支持以下类型的角色:

1、固定服务器角色:SQL server内置角色,用于执行服务器级任务。

2、用户定义的服务器角色:您创建的自定义服务器角色,为服务器级权限分配,并为其分配登录,以便它们继承服务器对象上的权限。

3、固定数据库角色:用于执行数据库任务和分配基本权限的内置角色。

4、用户定义的数据库角色:您创建的自定义数据库角色,为其分配权限,然后向其添加用户,以便用户继承数据库对象上的权限。

 

4、将登录名分配给dbcreator和diskadmin角色。图3.1显示了登录的对话框。

5、单击OK保存更改。

或者,可以使用对象资源管理器中的安全节点下的服务器角色节点向角色添加登录。向安全管理服务器角色添加:

1、在对象资源管理器的安全节点下展开服务器角色节点。

2、右键单击对象资源管理器中的SuffigyAdmin服务器角色并选择属性。这将打开“服务器角色属性”对话框。

3、单击对话框右下角的“添加”按钮,打开“选择登录”对话框。您可以键入并单击“检查名称”,或者单击“浏览”按钮获得登录列表。一旦进入-topaz,对话框看起来像图3.2。

图3.2。选择黄玉以添加到服务器角色。

4、单击OK向服务器角色添加黄玉。“服务器角色属性”对话框如图3.3所示。

图3.3。将Topaz添加到SuffigyAdmin服务器角色。

5、单击OK保存更改。

另一种向服务器角色添加登录的方法是使用Transact-SQL,使用sp_addsrvrolemember系统存储过程。下面的代码将现有登录Topaz添加到系统管理员角色:

清单3.1:将登录添加到服务器角色的代码。

通过运行两个存储过程sp_helpsrvrole角色和sp_helpsrvrolemember,可以找到有关固定服务器角色的信息。如果将服务器角色的有效名称传递给sp_helpsrvrole角色,它将显示该角色的描述;否则,它将显示所有服务器角色。图3.4显示了在ManagementStudio中执行的系统存储过程,以显示SuffigyAdmin角色及其当前成员资格的描述。

图3.4。使用系统存储过程获取有关服务器角色的信息。

用户定义的服务器角色

SQL Server 2012中期待已久的安全特性是用户定义的服务器角色。SQLServer对数据库级权限有很长的灵活的用户定义的数据库角色(稍后将在本层中了解),但是使用自定义服务器角色,您最终可以得到具有服务器级权限的许可。

在旧版本的SQLServer中,向用户授予某种权限的唯一方法是将它们分配给内置的固定服务器角色,该角色通常具有太多权限。让每个人成为一个系统管理员是一个可怕但常见的做法,尤其是有问题的,因为你不能否认一个系统管理员任何事情。这违反了最大特权的原则,但往往是一种现实的需要。SQLServer 2005和更高版本使这些更加粒度化,允许您为用户分配任何特定的服务器级权限,但缺乏将这些权限分组到服务器角色的能力。

SQL Server 2012解决了它对用户定义的服务器角色的支持。创建新的服务器角色与使用CREATE Server角色语句一样简单:

清单3.2:创建新服务器角色的代码。

然后,您可以授予和拒绝您想要的任何服务器级权限的角色。下面的代码授予控制服务器对新角色的许可,类似于授予系统管理员权限,然后拒绝了一些权限来缩小服务器角色成员的权限。这是授予特定于组特定权限的用户的非常灵活的方式。

清单3.3:添加和拒绝服务器角色权限的代码。

为了测试这个角色,清单3-4中的代码在一个名为马拉松的机器上创建了一个与Windows组、DBA相关联的登录,并将新的登录添加到LimeDeDBA角色。

提示:

在运行此代码之前,必须在Windows的本地实例上存在DBA组。您可以通过进入控制面板的计算机管理小程序,扩展系统工具和本地用户和组节点,并将其添加到组节点中来创建它。此外,将机器名称从马拉松改为本地机器。

清单3.4:创建登录并将其添加到服务器角色的代码。

清单3.5中的代码然后创建一个SQLServer登录卡,在SQL Server实例中没有任何权限。然后,代码尝试在CAROL的安全上下文中需要服务器级别权限的各种操作:创建另一个登录,查看系统信息,并创建另一个服务器角色。所有这些操作都失败了,如图3.5所示,因为CAROL主体没有执行这些操作的权限。

清单3.5:创建登录和测试以查看它是否具有特定权限的代码。

提示:

此代码不检查SQLServer实例中是否存在现有的CAROL登录。如果存在,则创建Login语句将失败。在这种情况下,跳过该语句。

图3.5。失败,因为CAROL没有权限。

接下来,代码将CAROL添加到新的LimeDeDBA用户定义的服务器角色中,并再次尝试执行相同的操作。如图3.6所示,这次CAROL能够获得系统信息(选择动作),因为该权限是控制服务器权限。但CAROL仍然无法创建登录或服务器角色,因为这些权限是从LimitedDBA角色明确拒绝的。

清单3.6:再次测试服务器角色成员是否具有特定权限的代码。

图3.6。通过LimitedDBA的部分权限的服务器级操作的结果。

为了查看所有可以授予和拒绝服务器角色的可用服务器级权限,请执行以下代码。图3.7显示了结果。

清单3.7:查看所有可用的服务器级权限的代码。

图3.7。服务器级别权限的部分列表。

您可以创建用户定义的服务器角色,以授予用户和组一个非常特定的权限集,它们需要完成自己的任务,而不再需要。这比SQLServer的早期版本更灵活,使得SQL Server 2012的安全管理变得更容易,更容易的管理必然意味着更安全的服务器。

固定数据库角色

固定数据库角色存在于数据库级别,而不是服务器级别,并且仅在该数据库内控制授权。每个数据库都有自己的固定数据库角色集合,因此您可以单独配置每个数据库中的角色。固定数据库角色类似于固定服务器角色,因为它们不能被删除、修改或更改,但可以将数据库用户和用户定义的角色添加为成员。固定数据库的角色是:

db_accessadmin:可以添加或删除数据库中的Windows登录和组和SQL Server登录。

db_backupoperator:可以备份数据库。

db_datareader:可以查看数据库中所有用户表中的任何数据。

db_datawriter:可以在数据库中的所有用户表中添加、更改或删除数据。

db_ddladmin:可以在数据库中添加、修改或删除对象。(DDL代表数据定义语言,对数据库进行结构更改的Transact-SQL命令集)。

db_denydatareade:无法查看数据库中的任何数据。

db_denydatawriter:不能更改数据库中的任何数据。

db_owner:可以执行所有数据库角色的活动以及维护和配置活动。这个角色包括所有其他角色,所以它本质上是这个数据库的管理员。

db_securityadmin:可以管理数据库中的角色成员资格和语句和对象权限。

固定数据库角色可以简化数据库中的权限分配。例如,假设您希望允许用户访问特定数据库,以便只备份它。您不希望用户能够读取数据,只是备份它。您可以通过让用户成为the db_backupoperator和db_denydatareader角色的成员来轻松实现这一点。使用SPHELPROLE和SPHELPROMLMENS系统存储过程查看数据库角色的信息。

公共角色和访客用户

有几个特殊的主要的事物需要提及。 你不可能以任何有意义的方式使用这些主要的事物,但他们确实会影响安全性,所以你需要知道他们是什么。

公共角色是一个特殊的服务器角色,不能被删除。 每个数据库用户都属于这个公共角色,因此您不需要为其分配用户,组或角色。 每个SQL Server数据库都包含公共角色,包括master,msdb,tempdb和model。 但是,您可以根据您的安全需求决定授予或限制公共角色的权限。 关于公共角色需要牢记的重要一点是您授予公众的权限适用于所有数据库用户。

小贴士:

通常情况下,您需要限制授予公共角色的权限,因为向每个人授予权限很少能产生安全的数据库。

来宾用户存在于每个数据库中,包括像master和model这样的系统数据库。 作为用户,它继承了公共角色的权限。 它在服务器登录未映射到特定数据库中的用户时起作用。 默认情况下,来宾用户没有权限,但您可以授予访问数据库对象的权限并在数据库中执行操作。 正如您所预料的那样,这是一个非常危险的事情,这对于数据库服务器的设计良好的安全方案中很少需要,您应该避免为该用户分配权限。 虽然你不能删除这个用户,但你应该在用户数据库中通过使用代码清除它的CONNECT权限来禁用它,如清单3.8所示。

清单3.8:通过撤销CONNECT权限来禁用用户数据库中的访客用户的代码。

小贴士:

不要禁用系统数据库中的访客用户,这可能会导致您不想处理的问题! 这些数据库要求访客用户提供各种功能。

dbo用户和架构

dbo是映射到sysadmin固定服务器角色的每个数据库内的特殊用户帐户。 这意味着如果你是sysadmin角色的成员并且你在任何数据库中创建了一个对象,那么该对象的所有者将是dbo,而不是你。 您不能删除dbo用户,它仅映射到sysadmin,而不映射到数据库所有者(db_owner)。 这可能令人困惑,因为dbo用户确实与db_owner角色无关。

每个数据库还有一个由dbo用户拥有的dbo模式,并且是dbo用户的默认模式。 因此,当您以sysadmin身份访问数据库并创建对象而未指定模式时,其两部分名称将为dbo.objectname。 如果没有指定模式名称,dbo模式也是访问数据时任何其他用户的默认辅助模式。

如果用户joe尝试访问名为sales的表,SQL Server将首先检查用户joe的默认模式中是否存在销售表,如果不存在,它将检查以查看是否存在销售表 dbo架构。 只有在任何模式中不存在销售额的情况下,才会发现该对象无法找到的错误。 最佳做法是始终为每个访问的对象指定一个模式名称。

用户定义的数据库角色

数据库角色不限于预定义角色 - 您可以创建自己的角色。 用户可以定义两种类型的数据库角色:

•标准角色:使用此角色可简化为用户组分配的权限。 您可以嵌套固定的数据库角色或其他用户定义的角色,并将用户分配给角色,在这种情况下,他们会继承角色的权限。

•应用程序角色:应用程序使用此角色允许应用程序或连接登录到数据库并通过提供角色名称和密码来激活应用程序角色。 您不能像对其他角色一样将用户添加到应用程序角色,并且一旦激活,应用程序角色的权限将适用于连接的持续时间。 用户可能拥有的任何单个权限都将被挂起,并且只检查应用程序角色的权限。

小贴士:

您可以将用户定义的角色添加到固定数据库角色,这与将用户添加到固定数据库角色的方式相同:通过固定数据库角色的属性对话框。

安全对象

安全对象是您可以控制访问的受保护资源。 通常它是一个物理的东西,或者至少像数字对象一样物理化! 但是,安全也可以是一种行为,即对数据库或SQL Server实例进行某种更改的能力。 例如,管理员可以授予主体获取对象所有权的能力。 授予此权限不会立即更改对象的所有权; 它只是让委托人有能力在未来的某个时间做到这一点。

图3.8显示了SQL Server实例中的大多数安全对象。 服务器级安全对象具有最广泛的范围,包含所有SQL Server,包括影响委托人对所有数据库进行更改的权限。 数据库范围包含特定数据库中的所有对象,例如用于管理用户以及创建加密密钥的对象。 模式范围包括模式中的所有对象 - 实质上是数据库的数据结构,包括表格及其数据。 一个数据库可以包含很多模式,每个模式可以包含全部数据库对象的一个子集。 使模式功能强大的是,您可以在模式上分配和拒绝权限,并且这些权限适用于模式包含的所有对象。

图3.8。 SQL Server中的安全对象。 箭头显示了一个范围如何在对象层次结构中包含更小的范围。

理解在服务器级授予权限往往意味着权限范围较小是很重要的。 例如,授予数据库级权限可能意味着委托人对一个或全部数据库的模式中的对象具有隐含的权限。

总结

在SQL Server安全性的这一级别中,您了解了授权的第一部分,SQL Server及其数据库实例中可用的主体和安全对象。 在下一个层次中,您将学习权限,当授予给安全对象的委托人时授予或剥夺委托人对该对象执行某些操作的权限。 有了这样的理解,您将能够有效地利用SQL Server中的身份验证和授权的粒状性质来严格控制数据库资产,同时允许授权用户和流程完成其工作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值