您的位置:首页 > 其它

Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据

2017-08-06 13:09 741 查看
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679。专题文件夹:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意。不论什么人不得以“原创”形式公布,也不得已用于商业用途。本人不负责不论什么法律责任。

前一篇:http://blog.csdn.net/dba_huangzj/article/details/38944121

前言:

在SQL Server 2005之前,全部server和数据库元数据都是全部人可见的。当基于网银的系统把SQL Server实例共享给客户时,有可能能够看到其它用户的信息。

从2005開始,能够通过控制权限来限制登录名或用户查看不必要的元数据。

实现:

假设你须要把数据库对全部登录名隐藏,能够移除public角色上的VIEW ANY DATABASE权限:

USE master;
GO
REVOKE VIEW ANY DATABASE TO public;


同意某些帐号查看全部数据库时。能够创建一个用户自己定义server角色:

USE master;
CREATE SERVER ROLE [DatabaseViewer];
GO
GRANT VIEW ANY DATABASE TO [DatabaseViewer];
ALTER SERVER ROLE [DatabaseViewer] ADD MEMBER [Fred];


注意,master和tempdcb总是对全部登录可见。

你不能选择性地对某些数据库设置可见。一个登录要么能从【对象资源管理器】中看到全部数据库。要么全部库都不能被看到。

假设一个登录名被授予VIEW ANY DATABASEserver权限,那么能够在【对象资源管理器】中看到server全部数据库,或者从sys.databases 文件夹视图中查询全部的数据库。

假设登录名没有这个权限可是映射到某个数据库的用户中,那么它依然不能看到全部数据库。可是能够使用sys.databases返回数据库信息。而且使用USE 数据库命令来切换数据库。

同意选择性地可见数据库的唯一方式是让登录名作为数据库的owner:

ALTER AUTHORIZATION ON DATABASE::marketing TO [Fred];


数据库的owner有数据库内全部权限,可是一个数据库仅仅有一个owner。不能让多个登录名同一时候对一个数据库进行owner设置。

在数据库内,能够定义特定数据库对象为某些用户可见。在SSMS中。右键数据库的【安全性】节点,选择【用户】→【属性】中的【安全对象】,然后在【查找】中加入特定对象,比方表、存储过程或者架构。然后勾选【查看定义】的【授予】列:





也能够用命令实现,这里注意上图中的【脚本】,当你不记得命令时,能够点一下这个button,会自己主动生成代码:

use [AdventureWorks2012]
GO
GRANT VIEW DEFINITION ON [dbo].[AWBuildVersion] TO [test]
GO


原理:

能够用以下语句查看可被授权的元数据权限:

SELECT  parent_class_desc AS parent ,
class_desc AS class ,
permission_name AS permission
FROM    sys.fn_builtin_permissions(NULL)
WHERE   permission_name LIKE 'VIEW%'
ORDER BY CASE parent_class_desc
WHEN '' THEN 0
WHEN 'SERVER' THEN 1
WHEN 'DATABASE' THEN 2
WHEN 'SCHEMA' THEN 3
END ,
class ,
permission;


【查看定义】的权限是能够在非server范围内查看的权限。

假设须要在全部范围内查看。须要使用【VIEW ANY DEFINITION】。授予这个权限能够同意登录查看实例中的全部定义,【查看全部数据库】适合那些仅须要訪问数据库可是不须要訪问server其它对象的登录名。

在数据库中。用户能够看到自己有权限的对象。默认情况下。一个用户仅是public数据库角色的成员,是没有权限的。

使用db_datareader固定数据库角色能够同意这个用户看到全部表,授予VIEW DEFINITION给存储过程、函数或者触发器,同意你看到其底层代码。

假设你不想让别人看到,能够在创建对象时使用WITH ENCRYPTION(在兴许介绍。)

下一篇:http://blog.csdn.net/dba_huangzj/article/details/39473895
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐