1. 程式人生 > >Chapter 2 User Authentication, Authorization, and Security(9):防止登錄名和用戶查看元數據

Chapter 2 User Authentication, Authorization, and Security(9):防止登錄名和用戶查看元數據

eight ssms ini auto 情況 con title cas mar

原文出處: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):防止登錄名和用戶查看元數據