数据库权限分配探讨

沈云,资深工程师,微软解决方案专家

SQL Server如何指定用户单独权限

上周, 有位朋友给我提出了需求:

为公司应用提供用户分配数据访问权限。顺便总结了下有如下要求:

给某个用户查询所有数据库的权限

给某个用户只有备份数据库的权限

给一个用户只有指定数据库的权限

给一个用户只有某个表的权限

要进行以上任务,首先我们先了解下数据库的权限相关的内容

主体

“主体” 是可以请求 SQL Server 资源的实体。 与 SQL Server 授权模型的其他组件一样,主体也可以按层次结构排列。 主体的影响范围取决于主体定义的范围(Windows、服务器或数据库)以及主体是否不可分或是一个集合。 例如,Windows 登录名就是一个不可分主体,而 Windows 组则是一个集合主体。 每个主体都具有一个安全标识符 (SID)。

Windows级别的主体

Windows域登录名

Windows本地登录名

SQL Server-级的主体

SQL Server登录名

服务器角色

数据库级的主体

数据库用户

数据库角色

应用程序角色

SQL Server sa登录名

SQL Server sa登录名是服务器级的主体。 默认情况下,该登录名是在安装实例时创建的。

public数据库角色

每个数据库用户都属于 public数据库角色。 当尚未对某个用户授予或拒绝对安全对象的特定权限时,则该用户将继承授予该安全对象的public角色的权限。

INFORMATION_SCHEMA和sys

每个数据库都包含两个实体:INFORMATION_SCHEMA和sys,它们都作为用户出现在目录视图中。 这两个实体是SQL Server所必需的。 它们不是主体,不能修改或删除它们。

基于证书的SQL Server登录名

名称由双井号 (##)括起来的服务器主体仅供内部系统使用。 下列主体是在安装SQL Server时从证书创建的,不应删除。

##MS_SQLResourceSigningCertificate##

##MS_SQLReplicationSigningCertificate##

##MS_SQLAuthenticatorCertificate##

##MS_AgentSigningCertificate##

##MS_PolicyEventProcessingLogin##

##MS_PolicySigningCertificate##

##MS_PolicyTsqlExecutionLogin##

guest用户

每个数据库包括一个guest。 授予guest用户的权限由对数据库具有访问权限,但在数据库中没有用户帐户的用户继承。 不能删除guest用户,但可通过撤消该用户的CONNECT权限将其禁用。 可以通过在master或tempdb以外的任何数据库中执行REVOKE CONNECT FROM GUEST来撤消CONNECT权限。

客户端和数据库服务器

根据定义,客户端和数据库服务器是安全主体,可以得到保护。 在建立安全的网络连接前,这些实体之间可以互相进行身份验证。 SQL Server支持Kerberos身份验证协议,该协议定义客户端与网络身份验证服务交互的方式。

创建数据库用户

SQL 2016 中支持11种用户类型:

用户基于登录名在master这是最常见的用户类型。

基于登录名基于的 Windows Active Directory 帐户的用户。 CREATE USER [Contoso\Fritz];

基于 Windows 组的登录名的用户。 CREATE USER [Contoso\Sales];

基于使用 SQL Server 身份验证的登录名的用户。 CREATE USER Mary;

在数据库进行身份验证的用户建议以帮助使你的数据库可移植性。

始终允许在 SQL Database。 中包含的数据库中只允许存在 SQL Server。

基于无登录名的 Windows 用户的用户。 CREATE USER [Contoso\Fritz];

基于无登录名的 Windows 组的用户。 CREATE USER [Contoso\Sales];

中的用户 SQL Database 或 SQL 数据仓库 基于 Azure Active Directory 的用户。 CREATE USER [Contoso\Fritz] FROM EXTERNAL PROVIDER;

拥有密码的包含数据库用户。 (在中不可用 SQL 数据仓库。) CREATE USER Mary WITH PASSWORD = '********';

基于Windows主体通过Windows组登录名进行连接的用户

基于无登录名但可通过 Windows 组中的成员身份连接到数据库引擎的 Windows 用户的用户。 CREATE USER [Contoso\Fritz];

基于无登录名但可通过其他 Windows 组中的成员身份连接到数据库引擎的 Windows 组的用户。 CREATE USER [Contoso\Fritz];

无法进行身份验证的用户这些用户无法登录到 SQL Server 或 SQL Database。

没有登录名的用户。 不能登录,但可以被授予权限。 CREATE USER CustomApp WITHOUT LOGIN;

基于证书的用户。 不能登录,但可以被授予权限,也可以对模块进行签名。 CREATE USER TestProcess FOR CERTIFICATE CarnationProduction50;

基于非对称密钥的用户。 不能登录,但可以被授予权限,也可以对模块进行签名。 CREATE User TestProcess FROM ASYMMETRIC KEY PacificSales09;

下面的图片显示了创建数据库用户需要的选项的含义:



创建用户可以使用界面完成:





也可以使用T-SQL 来进行创建

-- 创建登录名:Test  密码是: '123456'.

CREATE LOGIN Test

WITH PASSWORD = '123456';

GO

上面说完了用户,下面说下数据库的角色和权限

服务器级别的权限

SQL Server提供服务器级角色以帮助你管理服务器上的权限。 这些角色是可组合其他主体的安全主体。 服务器级角色的权限作用域为服务器范围。 (“角色”类似于Windows操作系统中的“组”。)

SQL Server提供了九种固定服务器角色。 无法更改授予固定服务器角色的权限。 从SQL Server 2012开始,您可以创建用户定义的服务器角色,并将服务器级权限添加到用户定义的服务器角色。

你可以将服务器级主体(SQL Server登录名、Windows帐户和Windows组)添加到服务器级角色。 固定服务器角色的每个成员都可以将其他登录名添加到该同一角色。 用户定义的服务器角色的成员则无法将其他服务器主体添加到角色。

下表显示了服务器级的固定角色及其权限



下表显示了固定数据库角色及其能够执行的操作。 所有数据库中都有这些角色。 无法更改分配给固定数据库角色的权限



无法更改分配给固定数据库角色的权限。 下图显示了分配给固定数据库角色的权限:



SQL 2016有一些数据库的特殊权限

msdb角色

msdb数据库中包含下表显示的特殊用途的角色。



使用R Services

SQL Server(从SQL Server vNext开始)

安装R Services时,其他数据库角色可用于管理包



下面讲如何实现文章前面说的需求:

给某个用户查询所有数据库的权限

给某个用户只有备份数据库的权限

给一个用户只有指定数据库的权限

给一个用户只有某个表的权限

给某个用户查询所有数据库的权限

创建一个用户

USE [master]

GO

CREATE LOGIN [Test1] WITH PASSWORD=N'password@123'

使用Test1连接数据库实例



可以看到数据库列表, 但是无法访问数据库,



赋予test1对FinaceDemo的读取权限

USE [FinaceDemo]

GO

CREATE USER [Test1] FOR LOGIN [Test1]

ALTER ROLE [db_datareader] ADD MEMBER [Test1]

GO





这样就可以给test1用户对finacedemo的读取权限

给某个用户只有备份数据库的权限

Test1对于finacedemo无备份权限



赋予备份权限

ALTER ROLE [db_backupoperator] ADD MEMBER [Test1]



给一个用户只有指定数据库的权限

我们需要Test1只能看到FinanceDemo,其他所有数据库都不能看到

执行下面脚本

USE [master]

Deny VIEW any DATABASE TO Test1;

go

运行后的效果



执行:

ALTER AUTHORIZATION ON DATABASE::FinanceDemo TO test1

完成后结果:



给一个用户只有某个表的权限

创建测试用户test3

USE [master]

GO

CREATE LOGIN [Test3] WITH PASSWORD=N'password@123'

-----赋予test2可以登录testDB

USE [testdb]

GO

CREATE USER [Test3] FOR LOGIN [Test3]

GO

赋予test3对于t2表的updateselect权限

grant update on dbo.t2 to test3

grant select on dbo.t2 to test3

use testDB

查看test3用户获得的权限

exec sp_helprotect @username = 'test3'



执行select * from t2



执行插入操作失败。



以上实现了对数据库权限很细致的管理,更加详细的控制可以参考technet上面的信息。

权限管理非常复杂,以上只是做了简单的介绍。需要更加详细的内容,需要自己去研究。在technet上可以找到更加详细的信息。

立即访问http://market.azure.cn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容