sqlserver权限体系(上)

简介

权限两个字,一个权力,一个限制。在软件领域通俗的解释就是哪些人可以对哪些资源做哪些操作。 在SQL Server中,”哪些人”,“哪些资源”,”哪些操作”则分别对应SQL Server中的三个对象,分别为主体(Principals),安全对象(Securables)和权限(Permissions),而权力和限制则是 对应了SQL Server中的GRENT和DENY。对于主体,安全对象和权限的初步理解,见图1.

图1.简单理解主体,安全对象和权限的关系

对于图1中的造句来说,并没有主语,也就是并没有说谁给予的权限(难道是上帝?)。你可以理解为SA账户在最开始时给予了其他主体对于安全对象的权限。

SQL Server中的验证方式

在给予别人权限之前,或是检查你是否有某项权限之前,SQL Server首先要知道“你”这个主体是否是你自己号称的那个主体。比如武侠小说中接头时对的暗号”天王盖地虎,宝塔镇河妖…”就是验证身份的一种方式。而对于SQL Server,是在你连接SQL Server时SQL Server就需要确认你是谁。SQL Server提供了两种身份验证模式:

Windows身份验证模式

    Windows 身份验证模式就像其名称所示那样,由Windows来验证主体,SQL Server并不参与验证。SQL Server完全相信Windows的验证结果。所以用此方式登录SQL Server时并不需要提供密码。虽然如此,但Windows身份验证模式要更加安全,因为Windows身份验证模式使用了Kerberos(这一名词 来源于希腊神话“三个头的狗——地狱之门守护者”)协议。这也是微软推荐的最安全的做法。

但Windows身份验证模式在由域控制器控制网络访问的情况下才得以使用(当然了,单机也包括在内)。

SQL Server和Windows身份验证模式(混合模式)

我一直觉得这种模式的名称应该改为SQL Server或Windows身份验证模式更容易理解。这种模式即允许由Windows来验证主体身份,又允许SQL Server来验证主体身份,当由SQL Server验证主体身份时,需要用户名和密码来确认主体身份,和使用什么Windows账户半毛钱关系都没有。这些用户信息被加密后存在Master数 据库中。

设置验证模式

设置验证模式非常简单。既可以在安装的时候进行设置,也可以在安装之后通过右键点击实例,选择属性,在安全性选项卡中进行改变,如图2所示。

图2.安装完SQL Server之后改变身份验证方式

理解主体

“主体”是可以请求 SQL Server 资源的实体。主体可以是个体,组或者进程。主体可以按照作用范围被分为三类:

  • Windows级别主体
  • 服务器级别主体
  • 数据库级别主体

Windows 级别的主体包括Windows 域登录名和Windows 本地登录名。

SQL Server级的主体包括SQL Server 登录名和服务器角色。

数据库级的主体包括数据库用户和数据库角色以及应用程序角色。

登录名

   登 录名是服务器级别的主体,但无论是上述哪个层级的主体,因为需要登录到SQL Server实例,所以每一个层级的主体都需要一个与之对应的登录名。对于Windows级别的主体来说,Windows用户会映射到登录名。对于数据库 级别的主体来说,其用户必须映射到登录名中。而登录名可以不映射到数据库用户,如图3所示。

图3.登录名的映射关系

在图3中实例层级的登录名中,我们看到除了自定义添加的用户之外,还有一些由系统添加的登录名。首先,以”##”开头和结尾的用户是SQL Server内部使用的账户,由证书创建,不应该被删除。其次是sa账户,sa登录名拥有一切特权,可以在SQL Server中为所欲为,并且不能够被删除。因此sa作为分配权限的起点(也就是图1中所说的主语).因此对于Sa的密码要设置的尽可能复杂,否则Sa登 录名被盗取后果不堪设想。还有NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM账户是和启动SQL Server这个Windows服务的账户有关,如果使用本地登录账户或是网络账户启动SQL Server服务,请不要删除这两个账户,如图4所示。

图4.以本地系统账户启动服务

最后BUILDIN\Administrator账户是与本地管理员组关联的登录名,默认属于sysadmin角色。这个账户使得任何属于本地管理员的账户都可以获得对SQL Server的完全控制权。

数据库用户
    数
据库用户是数据库级别的主体,被用于访问数据库层面的对象。每一个数据库用户都必须要一个与之对用的登录名。数据库用户的信息存在数据库中,而登录名存在
实例级别的Master数据库中(但SQL SERVER2012的Contained
Database允许将登录名也存在数据库级别)。通常来说,数据库层级的用户可以和映射的登录名不一致,但由于这种做法会引起混淆,因此并不推荐。如图
5所示。

图5.可以让用户名和登录名不一致,但并不推荐

默认情况下,每个数据库都带有4个内置用户,如图6所示。

图6.数据库带的内置用户

dbo用户是Database
Owner的简称,如果说SA是实例级别的老大,那DBO就是数据库级别的老大。这个用户也同样不能被删除,每一个属于sysadmin的服务器角色都会
映射到数据库的dbo用户。每一个表创建时如果没有指定Schema,则默认在dbo这个schema下。

guest用户是一个来宾账户,这个账户允许登录名没有映射到数据库用户的情况下访问数据库。默认情况下guest用户是不启用的,你可以通过代码1来启用或不启用guest用户。

--允许guest用户连接权限
GRANT CONNECT TO guest
--收回guest的连接权限
REVOKE CONNECT TO guest

代码1.启用或回收guest用户的连接权限

你也可以给guest用户分配角色来控制guest的权限(如图7所示),但是这有可能造成潜在的安全问题,最佳做法是单独创建数据库用户。

图7.为guest用户分配角色

而INFORMATION_SCHEMA用户和sys用户拥有系统视图,因此这两个数据库用户不能被删除,如图8所示。

图8.INFORMATION_SCHEMA和sys用于访问系统视图

角色

   
色是方便对主体进行管理的一种举措。SQL
Server中的角色和Windows中的用户组是一个概念。属于某个角色的用户或登录名就会拥有相应的权限,这不难理解,就好比你在公司当经理,你就可
以报销多少钱的手机费用。而比你低一个层级的开发人员则没有这个待遇。用户或登录名可以属于多个角色,这也同样不难理解,就像你在公司中可以是项目经理,
也同时兼任高级工程师一样。

角色在SQL Server中被分为三类,分别为:

内置角色----这类角色在服务器安装时已经默认存在,其权限是固定的,并且不能被删除

用户自定义角色----这类角色由用户按照需求自定义创建

应用程序角色----这类特殊角色用于管理应用程序的数据访问

内置角色是在安装SQL Server时就固定的,无论是服务器角色还是数据库角色,其对应的权限都是固定的。具体每个角色对应的权限请查看MSDN(固定服务器角色http://msdn.microsoft.com/zh-cn/library/ms175892.aspx,固定数据库角色http://msdn.microsoft.com/zh-cn/library/ms189121.aspx),但这里要注意一个特殊的角色: public角色。

public角色不同于其它角色,其权限可以被调整,如图9所示。

图9.Public角色不同于其它角色在于其权限可以被修改

可以将Public角色理解为访问数据库或实例的最小权限,Public所拥有的权限自动被任何主体继承,所以对于Public角色的权限修改要格外小心。

而用户自定义角色是按照用户自己的需求组成的角色,由用户创建。

而应用程序角色并不包含任何用户,应用程序角色与其说是角色,不如说是一个特殊的用户。这是为应用程序专门准备的角色,仅仅为应用程序提供数据库访问权限。这个角色并不提供给用户,而是由应用程序的连接字符串嵌入角色名称和密码来激活对应权限。

图10.不同于其它数据库角色,应用程序角色需要设置密码

理解构架

构架(Schmea)是在SQL Server 2005之后的版本被引入的。可以将构架理解为一个命名空间。在SQL
Server2000中其实也有构架的概念,但概念并不同。因为SQL Server 2000中的构架是和用户绑定的,比如我新建用户Jack,SQL

Server自动分配一个叫Jack构架,用户Jack并不能改变这个选项,而由Jack所建的任何对象都在Jack之下,比如新建一个表,则为
Jack.Table1。当Jack如果离职时,这对管理来说简直是一场噩梦。

在SQL Server 2005之后,SQL Server允许用户和构架分离。使得利用构架去拥有一些数据库层级的对象,比如说:表,视图等。

下面几种选择方式,比如当我默认构架是Sales,时,我可以用代码2中第一种写法,不用构架:

SELECT * FROM Customer

SELECT * FROM sales.Customer

SELECT * FROM AdventureWorks.sales.Customer

代码2.引用对象的几种不同写法

因此,假如Customer表是由Jack建的,我可以将其分配给Sales构架,引用时使用Sales.Customer,而不是Jack.Customer。这无疑大大方便了管理,此外,可以针对构设置权限,这我会在本系列文章后续的文章中讲到。

总结

本文简单讲述了SQL Server的权限体系。以及主体的概念。理解SQL Server的安全性要首先理解这三大方面。下一篇文章中我将接着讲述安全对象。

时间: 2024-07-31 19:38:23

sqlserver权限体系(上)的相关文章

sqlserver权限体系(下)

简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安全对象以及所对应的权限. 理解安全对象(Securable) 安全对象,是SQL Server 数据库引擎授权系统控制对其进行访问的资源.通俗点说,就是在SQL Server权限体系下控制的对象,因为所有的对象(从服务器,到表,到视图触发器等)都在SQL Server的权限体系控制之下,所以在SQL Server中的任何对象都可以被称为安全对象. 和主体一样,安全对象之间也是有层级,对父层级上的安全对象应用的权限会

权限体系构建 - 平台权限

一:介绍 对于大数据平台本身,其最重要的资产就是运行在上面的任务,平台要有对其任务进行权限控制的能力,包括但不限于: 1. 何人可以查看这个任务信息:2. 何人可以修改这个任务定义:3. 何人可以对这个任务进行操作,保存执行该任务,启用/禁用,删除,重跑等操作:4. 什么人有权限可以修改这个任务本身的权限定义.5. 不同的角色默认的权限是什么,不同的任务默认的权限又是什么. 这些都需要有一个统一的规则,即需要确定的答案. 二:权限设计 1.权限类别 同时做一定的简化,将查看设为“读”权限,将修改

Mysql 之权限体系

MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限. 表层级: 表权限适用于一个给定表中的所有列.这些权限存储在mysql.

AppBoxFuture(九): 组织结构与权限体系

??权限体系是用于约束用户访问或操作资源的权利,这里的"资源"可以指数据,也可以指特定的功能(如审核订单).通常的权限体系设计是基于角色的访问控制方式,用户通过角色与权限进行关联.作者的实现方式稍微有些不同,通过组织结构树与权限进行关联,这样可以实现子级节点继承上级节点设置的权限. 一.数据结构 组织单元(OrgUnit):根据上级标识自引用的表结构,另通过EntityRef引用组织或工作组或员工: 权限模型(PermissionModel):框架内置的元数据,包含已赋予权限的组织单元

sql server drop talbe 自动删除关联的外键 ,权限体系

if object_id('Proc_DropTableWithFK') is not null begin drop proc dbo.Proc_DropTableWithFK end GO create proc Proc_DropTableWithFK @PK_tableName nvarchar(50) as begin declare test_cur cursor local for select o2.name as 'FK_name' , O3.name as 'Table_Na

Data Lake Analytics账号和权限体系详细介绍

一.Data Lake Analytics介绍数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake.基于数据湖做分析,可以不用做任何ETL.数据搬迁等前置过程,实现跨各种异构数据源进行大数据关联分析,从而极大的节省成本和提升用户体验. 阿里云数据湖分析产品Data Lake Analytics(简称DLA):https://www.aliyun.com/product/datalakeanalytics产品文档:h

认知,构建个人的知识体系(上)

1.前言 本文将聊聊我对构建个人知识体系的一些想法,主要是为了提升自我认知.从个人经历开始,谈谈对知识的划分,也就是一个是什么,为什么的过程. 2.缘起 把时间回到一年前,那时候我工作快一年了,得益于前面的一些努力,工作比较顺利.特别是技术上,没有遇到太多过无法解决的问题.同时也开始迷茫,工作难道就是这个轻松的样子?三五年之后那不是很无趣,该怎么办? 想找到这个问题的答案,而最好的方式莫过于,亲自去了解那些三五年工作经验的人是怎么的样子. 因此从那时候起,关注了不少来公司面试的人的简历,也有过几

PHP文件路径及操作权限(上)

我们先来了解一下文件处理系统的作用吧(o?▽?)o   1.所有的项目都离不开文件处理 2.可以用文件长时间保存数据 3.建立缓存,服务器中文件操作 一.文件类型 以Linux为模型的,在Windows下只能获取file.dir.unknown这三种类型 在Linux/Unix下,可以获取block.char.dir.fifo.file.link.unknown类型 判断目录的一些函数?(?????)? is_dir -- 判断该文件是否是一个目录 is_executable -- 判断该文件是

L016-linux系统文件权限体系实战深入讲解小节

不知道今天能不能写完哈,能写完发出来就是这周发两次小结了,有进步哦,不过L015和L016两节课内容也确实不多,进入正题 上一课学到了chmod.chown.umask,相对于比较基础的命令,那么这节就要接触这两个命令了,虽然老师也说了,不常用! setuid和setgid 一.setuid 我们先来看看怎么查看一个文件是否有setuid的属性,然后再来总结他的功能把. [[email protected] ~]# ls -l `which passwd` -rwsr-xr-x. 1 root