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

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

原文出处: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

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