讀古今文學網 > SQL入門經典 > 第六部分 使用SQL管理用戶和安全 >

第六部分 使用SQL管理用戶和安全

第18章 管理數據庫用戶

第19章 管理數據庫安全

第18章 管理數據庫用戶

本章的重點包括:

用戶的類型

用戶管理

用戶在數據庫的位置

用戶與規劃

用戶會話

修改用戶的屬性

用戶特徵

從數據庫刪除用戶

用戶使用的工具

本章介紹關係型數據庫一個最關鍵的管理功能:管理數據庫用戶。該功能可以確保指定用戶和應用對數據庫的訪問,並拒絕非指定的外部訪問。考慮到數據庫中大量敏感的商業和個人信息,本章的內容絕對是用戶需要特別留心掌握的。

18.1 數據庫的用戶管理

用戶是我們所做一切工作的原因:設計、創建、實現和維護數據庫。在數據庫設計時就考慮了用戶的需求,而實現數據庫的最終目標是把它交給用戶,讓用戶使用。

關於用戶的一個公認理解是,如果沒有用戶,數據庫就不會發生任何不好的事情。雖然這句話貌似真理,但創建數據庫就是為了保存數據,從而讓用戶在每天的工作中使用它們。

雖然用戶管理通常是數據庫管理員的份內工作,其他人有時也會參與到用戶管理過程中。用戶管理是關係型數據庫生存週期內一件非常重要的工作,它最終是通過使用SQL概念和命令來實現的。對於數據庫管理員來說,用戶管理的最終目標是在讓用戶訪問所需的數據與保持數據完整性之間尋求平衡。

注意:用戶的身份會變化

不同場合的用戶的名稱、任務、職責之間有很大差別,取決於每個組織的規模和特定的數據處理需求。一個組織的DBA可能是另一個組織裡的普通工作人員。

18.1.1 用戶的類型

數據庫用戶的類型有多種,包括:

數據輸入員;

程序員;

系統工程師;

數據庫管理員;

系統分析員;

開發人員;

測試人員;

管理者;

終端用戶。

每種用戶都有其特定的工作職責(和要求),這對他們的每日工作與職位穩定都是很重要的。另外,每種用戶在數據庫裡具有不同的權限級別和自己的位置。

18.1.2 誰管理用戶

公司的管理人員負責日常的人員管理,而數據庫管理員或其他被指定的人負責管理數據庫裡的用戶。

數據庫管理員(DBA)通常負責創建數據庫用戶賬戶、角色、權限和特徵,以及相應的刪除操作。在大型實用環境中,這可能是件非常繁重的工作,有些公司會安排一個安全員協助DBA進行用戶管理。

這個安全員主要負責一些文書工作,向DBA傳遞用戶的工作需求,讓DBA知道哪些用戶不再需要訪問數據庫了。

系統分析員或系統管理員通常負責操作系統安全,包括創建用戶和分配適當的權限。安全員可以像幫助數據庫管理員一樣幫助系統分析員。

以有序的方式分配和撤銷權限,並且記錄所做的修改,這樣可以讓管理過程輕鬆一些。另外,當系統需要進行內部或外部審核時,文檔也會提供很好的記錄信息。本章將重點介紹用戶管理系統。

18.1.3 用戶在數據庫裡的位置

用戶需要被賦予一定的角色和權限才能完成自己的工作,但用戶的權限也不能超出其工作範圍。設置用戶賬戶和安全的唯一也是全部原因就是保護數據。如果錯誤的用戶訪問了錯誤的數據,即使是在無意情況下,數據也可能被毀壞或丟失。當用戶不再需要訪問數據庫時,相應的賬戶應該盡快從數據庫裡刪除或禁止。

注意:確保進行系統的用戶管理

用戶賬戶管理對於數據庫保護和成功應用是至關重要,如果沒有實施有系統的管理,它一般會失敗的。從理論上講,用戶賬戶管理是最簡單的數據庫管理任務之一,但通常會由於政策因素與通信問題而複雜化。

全部用戶在數據庫裡都有位置,有些具有更多的責任和與眾不同的職責。數據庫用戶就像是我們身體的各個部分,以一個整體共同作用來達到某些目標。

18.1.4 不同規劃裡的用戶

數據庫對象與數據庫用戶賬戶相關聯,被稱為規劃。規劃是數據庫用戶擁有的數據庫對像集,這個用戶被稱為規劃所有人。規劃在邏輯上的組織類似於數據庫中的對象,由一個特定的所有人進行管理。例如,可以將所有的人事表組織起來成為一個名為HR的規劃,便於進行人力資源管理。普通數據庫用戶與規劃所有人之間的區別在於後者在數據庫裡擁有對象,而大多數用戶沒有自己的對象,只是被賦予數據庫賬戶來訪問規劃裡的數據。由於規劃所有人實際上擁有這些對象,所以對它們有完全的控制。

Microsoft SQL Server中進一步設置了數據庫所有人。數據庫所有人擁有數據庫中的所有對象,並且對其中存儲的數據擁有完全控制。數據庫中有一個或多個規劃。數據庫以及數據庫所有人的默認規劃,一般是 dbo。可以根據需要,對數據庫中的對象進行組織形成多個規劃,並指定規劃所有人。

注意:不同系統中用戶的創建和管理也不同

關於創建用戶的實際操作請查看具體實現的幫助文檔。在創建和管理用戶時,還要遵守公司政策和手續。下面的小節介紹了在Oracle、MySQL、Sybase和Microsoft SQL Server裡創建用戶的操作。

18.2 管理過程

在任何數據庫系統裡,一個穩定的用戶管理系統對於數據安全來說是必不可少的。用戶管理系統從新用戶的直接上級開始,他負責發起訪問請求,然後就是通過公司的批准程序。如果管理層接受了請求,就會轉到安全員或數據庫管理員來完成實際操作。一個好的通知過程是必要的,在用戶賬戶被創建、對數據庫的訪問被批准之後,管理人和用戶必須得到通知,用戶賬戶的密碼應該只交給用戶本人,而他應該在第一次登錄到數據庫後就立即修改密碼。

18.2.1 創建用戶

創建數據庫用戶需要使用數據庫裡的SQL命令,但並不存在著什麼標準命令,每個實現都有自己的方法。不同實現中的基本概念都是一樣的。另外還有一些圖形化用戶界面(GUI)工具可以進行用戶管理。

當 DBA 或指定的安全員收到用戶賬戶請求時,應該針對必要信息進行分析。這些信息應該包含公司對於創建用戶ID所必需的條件。

一些必要信息包括社會保險號碼、完整姓名、地址、電話號碼、辦公室或部分名稱、被分配的數據庫,有時還可以包括建議使用的用戶名。

下面的小節將展示在不同實現裡創建用戶的範例。

一、在Oracle裡創建用戶

下面是在Oracle數據庫裡創建用戶賬戶的步驟。

1.使用默認設置創建數據庫用戶賬戶。

2.給用戶賬戶授予適當的權限。

下面是創建用戶的語法:

如果不是在使用 Oracle,我們不必過於關注其中的選項。Tablespace(表空間)是容納數據庫對像(比如表和索引)的邏輯區域,是由DBA管理的。DEFAULT TABLESPACE指定用戶在創建對像時所在的表空間,而TEMPORARY TABLESPACE是用於排序操作(表結合、ORDER BY、GROUP BY)的表空間。QUOTA是被限制在用戶所訪問的特定表空間上的空間,而PROFILE是指派給用戶的數據庫特徵文件。

下面是給用戶賬戶授予權限的語法:

注意:CREATE USER命令也有差別

上面的語法可以向 Oracle 數據庫和其他一些主流關係型數據庫添加用戶。MySQL不支持CREATE USER命令,它使用mysqladmin工具管理用戶。在Windows計算機上創建了一個本地用戶賬戶之後,並不需要登錄,但在多用戶環境裡,每個要訪問數據庫的用戶都要創建一個賬戶。

GRANT 語句可以在同一個語句裡給一個或多個用戶授予一個或多個權限。權限也可以授予一個角色,然後再授予用戶。

在MySQL裡,GRANT命令可以把本地計算機上的用戶授權到當前數據庫裡,比如:

像下面這樣給用戶授予其他權限:

在大多數情況下,只有在多用戶環境下才需要設置MySQL的多用戶。

二、在Microsoft SQL Server裡創建用戶

在Microsoft SQL Server裡創建用戶賬戶的步驟如下所述。

1.為SQL Server創建登錄賬戶,指定密碼和默認的數據庫。

2.把用戶添加到適當的數據庫,從而創建一個數據庫賬戶。

3.給數據庫賬戶分配適當的權限。

下面是創建用戶賬戶的語法:

注意:更多的權限內容

第19章將更詳細地介紹關係型數據庫裡的權限問題。

下面是把用戶添加到數據庫的語法:

從上述內容可以看出,SQL Server將登錄賬戶和數據庫賬戶區別對待,登錄賬戶用於訪問SQL Server實例,而數據庫賬戶則可以訪問數據庫對象。創建好登錄賬戶後,在數據庫級別運行SP_ADDUSER命令後,就可以在SQL Server Management Studio的安全文件夾中看到二者的區別。這是SQL Server的一個重要特點,你可以創建一個登錄賬戶,但卻不能用這個賬戶訪問實例中的任何數據庫。

在SQL Server中創建賬戶的一個常見錯誤,就是忘記為賬戶授權訪問其默認數據庫。所以在設置賬戶的時候,務必確保為賬戶授權,至少保證其能夠訪問默認數據庫,否則在使用賬戶登錄系統的時候就會報錯。

下面是給用戶賬戶分配權限的語法:

三、在MySQL裡創建用戶

在MySQL裡創建用戶賬戶的步驟如下所述。

1.在數據庫裡創建用戶賬戶。

2.給用戶賬戶分配適當的權限。

創建用戶賬戶的語法與Oracle的很類似:

分配用戶權限的語法也與Oracle很相似:

18.2.2 創建規劃

規劃是使用CREATE SCHEMA語句創建的。

其語法如下所示:

下面是一個範例:

下面是在一個實現裡使用CREATE SCHEMA命令的實例:

這個命令裡添加了關鍵字 AUTHORIZATION,它是在 Oracle 數據庫裡執行的。從這個範例以及前面的很多範例中都可以看出,不同實現的命令語法有所不同。

能夠創建規劃的實現會為用戶分配一個默認規劃,該規劃通常與用戶的賬戶相關聯。所以,如果一個用戶的賬戶名為 BethA2,那麼他的默認規劃名通常就為 BethA2。這一點很重要,如果在創建對象的時候不指定規劃名,那麼將在用戶的默認規劃中創建對象。如果我們在BethA2賬戶中運行下面的CREATE TABLE語句,將在BethA2默認規劃中創建表:

但這裡有可能並不是用戶所希望創建表的位置。如果是在SQL Server中,我們擁有 dbo規劃的訪問權限,並且要在該規劃中創建表。這時,需要對所創建的對象進行如下限定:

在創建用戶賬戶並分配權限的時候,務必牢記上述問題。這樣可以確保在用戶的數據庫中維持一個恰當的秩序,以避免不良後果。

18.2.3 刪除規劃

使用DROP SCHEMA語句可以從數據庫裡刪除規劃,這時必須要考慮兩個選項。一個是RESTRICT,在使用這個選項時,如果規劃裡有對象,刪除操作就會發生錯誤。第二個選項是 CASCADE,如果規劃裡有對象,刪除規劃就必須指定這個選項。記住,當我們刪除規劃時,與規劃相關聯的全部數據庫對象都會被刪除。

注意:不是所有實現都支持CREATE SCHEMA命令

有些實現可能不支持CREATE SCHEMA命令,但當用戶創建對像時會隱含地創建規劃,而CREATE SCHEMA命令只不過是完成這個任務的一個單步方法而已。當用戶創建對像之後,可以向其他用戶分配訪問這些對象的權限。 MySQL不支持CREATE SCHEMA命令。在MySQL裡,規劃被看作一個數據庫,所以我們要使用CREATE DATABASE命令來創建一個規劃,然後在其中創建對象。

其語法如下所示:

注意:刪除規劃的不同方法

如果發現規劃裡缺少了某些對象,很可能是由於對像(比如表)會被像DROP TABLE 這樣的命令刪除。有些實現提供了刪除用戶的過程或命令,也可以用於刪除規劃。如果所使用的SQL實現裡沒有DROP SCHEMA命令,我們可以通過刪除擁有規劃對象的用戶來刪除規劃。

18.2.4 調整用戶

用戶管理中的一個重要組成部分是在創建用戶之後修改用戶的屬性。如果具有用戶賬戶的個人永遠不會升職、不會離開公司,或者新僱員非常少,DBA的工作就會輕鬆很多。但在現實世界裡,頻繁的人員調動和職責變化是用戶管理中的重要因素,幾乎每個人都會改變工作或職責。因此,數據庫的用戶權限必須進行相應的調整以適應用戶的需要。

下面是Oracle裡修改用戶狀態的範例:

這個語句可以改變用戶的很多屬性,但並不是所有SQL實現都提供了這樣一個簡單的命令來操作數據庫用戶。

比如 MySQL,它使用多種手段來調整用戶賬戶。舉例來說,使用如下語法重置用戶的密碼:

而使用下面的語法來改變用戶的用戶名:

有些實現還提供了GUI工具來創建、修改和刪除用戶。

注意:在數據庫和工具中不使用手工輸入命令

記住,不同實現中的語法是不一樣的。另外,大多數數據庫用戶不會手工向數據庫發出連接和斷開的命令,而是使用廠商提供的工具或第三方工具來輸入用戶名和密碼,從而連接到數據庫並初始化數據庫用戶會話。

18.2.5 用戶會話

一個用戶數據庫會話就是從登錄數據庫到退出這段時間。在一個用戶會話中,用戶可以執行允許範圍內的各種操作,比如查詢和事務。

基於創建的連接和會話,用戶可以執行任意數量的事務,直到連接中斷,這時數據庫用戶會話也結束了。

使用下面這樣的命令可以明確地連接和斷開數據庫,從而開始和結束SQL會話:

用戶會話能夠——並且經常——被 DBA 或其他對用戶行為感興趣的人監視。用戶會話是與特定用戶相關聯的。在主機的操作系統上,數據庫用戶會話實際上是一個進程。

18.2.6 禁止用戶訪問

通過幾個簡單的命令就可以從數據庫裡刪除用戶或禁止用戶的訪問,但在不同實現裡具體的命令依然是不一樣的,請查看相應的文檔來瞭解實際的語法或工具。

下面是禁止用戶訪問數據庫的一些方法:

修改用戶的密碼;

從數據庫刪除用戶賬戶;

撤銷分配給用戶的相應權限。

有些實現裡可以使用DROP命令刪除數據庫裡的用戶:

在很多實現裡,與GRANT命令執行相反操作的是REVOKE,用於取消已經分配給用戶的權限。這個命令在SQL Server、Oracle和MySQL裡的語法如下所示:

18.3 數據庫用戶使用的工具

有些人認為不必瞭解SQL就可以執行數據庫查詢,這在有些情況下是正確的。然而即使是在使用GUI工具時,瞭解SQL也絕對會對查詢操作有所幫助。GUI工具很不錯,在方便得到時也應該使用它們,但理解其幕後的工作原理對於最有效地利用這些用戶友好的工具也大有益處。

很多GUI工具幫助數據庫用戶自動生成SQL代碼,用戶只需要在一些窗口裡瀏覽、對一些提示做出響應、選擇一些選項即可。還有專門生成報告的工具,還可以為用戶創建窗口來查詢、更新、插入或刪除數據庫裡的數據。有一些工具可以把數據轉化為圖形或圖表,還有數據庫管理工具可以監視數據庫性能,有些還可以遠程連接到數據庫。數據庫廠商提供了其中一部分工具,其他的工具則來自於第三方廠商。

18.4 小結

所有的數據庫都有用戶,無論是只有一個,還是成千上萬。用戶是數據庫存在的原因。

用戶管理有3個基本要素。首先,必須能夠為特定的人和服務創建數據庫用戶賬戶。其次,必須能夠為用戶賬戶分配權限,使其能夠完成要對數據庫所做的操作。最後,必須能夠從數據庫裡刪除用戶賬戶,或是撤銷相應的權限。

本章介紹了用戶管理中最常見的任務,但沒有涉及過多的細節,因為大多數數據庫在用戶管理過程上是不同的。但由於用戶管理與SQL的關係,在此對其進行討論還是必要的。很多用於管理用戶的命令在ANSI標準沒有定義或詳細討論,但概念還是相同的。

18.5 問與答

問:向數據庫添加用戶有什麼SQL標準嗎?

答:ANSI 提供了一些命令和概念,但在創建用戶方面每種實現和每家公司都有自己的命令、工具和規則。

問:在不把用戶ID從數據庫裡徹底刪除的情況下,有沒有辦法暫時禁止用戶的訪問?

答:有。要想暫時禁止用戶的訪問,只需要改變用戶的密碼,或是撤銷允許用戶連接到數據庫的權限。之後,如果想恢復用戶賬戶的功能,只需要把修改的密碼告訴用戶,或是分配適當的權限。

問:用戶能改變自己的密碼嗎?

答:在大多數主流實現裡是可以的。在創建用戶或把用戶添加到數據庫的過程中,一般會為用戶設置一個普通的密碼,而且必須盡快由用戶修改為自己所選擇的密碼。密碼修改之後,即使DBA也不知道用戶的密碼。

18.6 實踐

下面的內容包含一些測試問題和實戰練習。這些測試問題的目的在於檢驗對學習內容的理解程度。實戰練習有助於把學習的內容應用於實踐,並且鞏固對知識的掌握。在繼續學習之前請先完成測試與練習,答案請見附錄C。

18.6.1 測驗

1.使用什麼命令創建會話?

2.在刪除包含數據庫對象的規劃時,必須要使用什麼選項?

3.MySQL裡使用什麼命令創建規劃?

4.使用什麼命令清除數據庫權限?

5.什麼命令能夠創建表、視圖和權限的組或集合?

6.在SQL Server中,登錄賬戶和數據庫賬戶有什麼區別?

18.6.2 練習

1.描述如何在learnsql數據庫裡創建一個新用戶「John」。

2.如何讓新用戶John能夠訪問表Employee_tbl?

3.描述如何設置John的權限,讓他訪問learnsql數據庫裡的全部對象。

4.描述如何撤銷John的權限,然後刪除他的賬戶。

第19章 管理數據庫安全

本章的重點包括:

數據庫安全

安全與用戶管理

數據庫系統權限

數據庫對像權限

給用戶分配權限

撤銷用戶的權限

數據庫裡的安全特徵

本章介紹使用SQL命令和相關命令在關係型數據庫裡實現和管理安全的基本知識。不同主流實現的安全命令在語法上是有區別的,但關係型數據庫的整體安全概念都遵循 ANSI 標準。關於安全操作的詳細語法和方針請查看具體實現的文檔。

19.1 什麼是數據庫安全

數據庫安全就是保護數據不受到未授權訪問。那些只能對數據庫裡部分數據進行訪問的用戶,如果要訪問其他的數據,也屬於未授權訪問。這種保護還包括防止未授權的連接和權限分配。數據庫裡存在多個用戶級別,從數據庫創建者,到負責維護數據庫的人員(比如數據庫管理員),到數據庫程序員,到終端用戶。終端用戶雖然在訪問權限上受到最大的限制,但卻是數據庫存在的原因。每個用戶對數據庫具有不同的訪問級別,應該被限制到能夠完成相應工作所需的最小權限。

那麼,用戶管理與數據庫安全有什麼區別呢?前一章介紹的用戶管理似乎涵蓋了安全問題。雖然用戶管理和數據庫安全有著必然的聯繫,但各自具有不同的目標,共同完成保護數據庫的任務。

良好規劃和維護的用戶管理與數據庫的整體安全是密切相關的。用戶被分配一定的賬戶和密碼,從而可以對數據庫進行一般的訪問。數據庫裡的用戶賬戶應該保存一些用戶信息,比如用戶的實際姓名、所在的辦公室和部門、電話號碼或分機號、可以訪問的數據庫名稱。個人用戶信息應該只能由DBA訪問。新用戶一般會由DBA或安全員授予一個初始密碼,他在首次登錄後應該立即修改這個密碼。記住,DBA不需要、也不應該知道個人的密碼,這確保了職責的分離,也讓用戶賬戶的不斷增加不會成為問題。

如果用戶不再需要一定的權限,那麼這些權限就應該被撤銷。如果用戶不再需要訪問數據庫,用戶賬戶就應該從數據庫裡刪除。

一般來說,用戶管理是創建用戶賬戶、刪除用戶賬戶、跟蹤用戶在數據庫裡行為的過程。而數據庫安全更進一步,包括了為特定數據庫訪問授予權限、從用戶撤銷權限、採取手段保護數據庫的其他部分(比如底層數據庫文件)。

注意:數據庫安全有更多的內容需要學習

由於這是一本SQL圖書而不是數據庫圖書,所以重點在於數據庫權限。但我們也要考慮到數據庫安全的其他方面,比如保護底層數據庫文件,這與數據庫權限的配置具有同等的重要性。高級數據庫安全可能相當複雜,而且在不同關係型數據庫實現裡也有所區別。如果想更詳細地瞭解數據庫安全,可以查看互聯網安全中心的網頁。

19.2 什麼是權限

權限是用於訪問數據庫本身、訪問數據庫裡的對象、操作數據庫裡的數據、在數據庫裡執行各種管理功能的許可級別。權限是通過GRANT命令分配的,用REVOKE命令撤銷。

用戶可以連接到數據庫並不意味著可以訪問數據庫裡的數據,要訪問數據庫裡的數據還需要權限。權限有兩種類型,一種是系統權限,一種是對像權限。

19.2.1 系統權限

系統權限允許用戶在數據庫裡執行管理操作,比如創建數據庫、刪除數據庫、創建用戶賬戶、刪除用戶、刪除和修改數據庫對像、修改對象的狀態、修改數據庫的狀態以及其他會對數據庫造成重要影響的操作。

系統權限在不同關係型數據庫實現裡差別很大,所以具體權限及其正確用法請查看實現的文檔。

下面是SQL Server裡一些常見系統權限:

CREATE DATABASE——允許創建新的數據庫;

CREATE PROCEDURE——允許創建新的存儲過程;

CREATE VIEW——允許創建新的視圖;

BACKUP DATABASE——允許用戶對數據庫進行備份;

CREATE TABLE——允許用戶創建新表;

CREATE TRIGGER——允許用戶在表上創建觸發器;

EXECUTE——允許用戶在特定數據庫中運行給定的存儲過程。

下面是Oracle裡一些常見系統權限:

CREATE TABLE——允許用戶在特定規劃中創建新表;

CREATE ANY TABLE——允許用戶在任意規劃中創建新表;

ALTER ANY TABLE——允許用戶在任意規劃中修改表結構;

DROP TABLE——允許用戶在特定規劃中刪除表對像;

CREATE USER——允許用戶創建其他用戶賬戶;

DROP USER——允許用戶刪除既有用戶賬戶;

ALTER USER——允許用戶修改既有用戶賬戶;

ALTER DATABASE——允許用戶修改數據庫特性;

BACKUP ANY TABLE——允許用戶備份任意規劃中任意表的數據;

SELECT ANY TABLE——允許用戶查詢任意規劃中任意表的數據。

下面是MySQL裡一些常見的全局(系統)權限:

CREATE——允許用戶創建特定對象,如數據庫、表或索引;

DROP——允許用戶刪除特定對像;

GARNT——允許用戶對特定對像分配權限;

RELOAD——允許用戶進行清除緩存操作,以便清除緩存中的日誌文件等內容;

SHUTDOWN——允許用戶關閉MySQL實例。

注意:權限的不同級別

MySQL具有全局權限和對像權限。全局權限類似於系統權限,負責用戶對全部數據庫對象的訪問。

19.2.2 對像權限

對像權限是針對對象的許可級別,意味著必須具有適當的權限才能對數據庫對像進行操作。舉例來說,為了從其他用戶的表裡選擇數據,我們必須首先得到另一個用戶的許可。對像權限由對象的所有者授予數據庫裡的其他用戶。記住,這個所有者也被稱為規劃所有者。

ANSI標準裡包含下述對像權限。

USAGE:批准使用指定的域。

SELECT:允許訪問指定的表。

INSERT(column_name):允許對數據插入到指定表的指定字段。

INSERT:允許對數據插入到指定表的全部字段。

UPDATE(column_name):允許對指定表裡的指定字段進行更新。

UPDATE:允許對指定表裡的全部字段進行更新。

REFERENCES(column_name):允許在完整性約束裡引用指定表裡的指定字段,任何完整性約束都需要這個權限。

REFERENCES:允許引用指定表裡的全部字段。

注意:自動授予的權限

對象的所有者自動被授予與對像相關的全部權限。有些SQL實現裡還可以利用GRANT OPTION命令分配這些權限,這是一個相當不錯的功能,稍後將詳細討論。

大多數SQL實現都遵循這個對象權限列表來控制對數據庫對象的訪問。

這些對像級別的權限應該用於許可和限制對規劃內的對象的訪問,可以保護一個規劃裡的對象不被能夠訪問其他規劃的用戶訪問。

不同SQL實現裡還有其他一些對像權限在此並沒有列出來。比如刪除其他用戶的對象裡的數據。關於全部可用的對象級權限,請查看具體實現的文檔。

19.2.3 誰負責授予和撤銷權限

使用GRANT和REVOKE命令的人通常是DBA,但如果存在著安全管理員,他也有這樣的權力。具體要授予和撤銷的權限來自於管理層,而且最好進行細緻的跟蹤,以確保只有被認可的用戶才能具有相應的權限。

對象的所有者負責向數據庫裡的其他用戶授予權限。即使 DBA 也不能給數據庫用戶授予不屬於他的對象的權限,雖然有方法可以繞過這種限制。

19.3 控制用戶訪問

用戶訪問主要是通過用戶賬戶和密碼進行控制的,但在大多數主流實現裡,這是不足以訪問數據庫的。創建用戶賬戶只是允許和控制數據庫訪問的第一步。

在創建了數據庫賬戶之後,數據庫管理員、安全官員或某個指定的人必須能夠向需要進行數據庫操作的用戶授予適當的系統級權限,比如創建表或選擇表。接下來,規劃所有者需要向用戶授予訪問規劃中對象的權限。

SQL 裡用兩個命令控制數據庫訪問,包括權限的授予與撤銷,分別是 GRANT 和REVOKE。

19.3.1 GRANT命令

GRANT命令用於向現有數據庫用戶賬戶授予系統級和對像級權限。

其語法如下所示:

下面就是向用戶授予一個權限:

像下面這樣給一個用戶授予多個權限:

注意到在一個語句裡向一個用戶授予多個權限時,每個權限是以逗號分隔的。

注意:注意反饋信息

注意提示信息「Grant succeeded」,它表示授權語句成功完成了。這是Oracle的反饋信息。大多數SQL都會提供某種反饋,但所使用的短語不一定相同。

像下面這樣給多個用戶授予權限:

一、GRANT OPTION

GRANT OPTION是個功能強大的GRANT選項。當對象的所有者利用GRANT OPTION把自己對象的權限授予另一個用戶時,這個用戶還可以把這個對象的權限授予其他用戶,儘管他並不是這個對象的所有者。範例如下:

二、ADMIN OPTION

使用ADMIN OPTION授予權限之後,用戶不僅擁有了權限,也具有了把這個權限授予其他用戶的能力,這一點與GRANT OPTION類似。但GRANT OPTION用於對像級權限,而ADMIN OPTION用於系統級權限。當一個用戶用ADMIN OPTION向另一個用戶授予系統權限之後,後者還可以把系統權限授予其他用戶。範例如下:

19.3.2 REVOKE命令

注意:刪除用戶的同時也刪除了權限

當一個被使用GRANT OPTION或ADMIN OPTION授予了權限的用戶被刪除之後,權限與用戶之間的關聯也被斷開了。

REVOKE命令撤銷已經分配給用戶的權限,它有兩個選項:RESTRICT和CASCADE。當使用RESTRICT選項時,只有當REVOKE命令裡指定的權限撤銷之後不會導致其他用戶產生報廢權限時,REVOKE才能順利完成。而CASCADE會撤銷權限,不會遺留其他用戶的權限。換句話說,如果某個對象的所有者使用GRANT OPTION把權限授予USER1,USER1又使用了GRANT OPTION向USER2授予權限,然後對像所有者撤銷了USER1的權限,這時如果使用CASCADE選項,那麼USER2的權限也會被撤銷。

當用戶使用GRANT OPTION向其他用戶授予權限之後,自己被從數據庫裡刪除了,或是自己的權限被撤銷了,那麼後一個用戶的權限就被稱為報廢權限。

REVOKE命令的語法如下所示:

下面是一個範例:

19.3.3 控制對單獨字段的訪問

我們不僅能夠把表作為一個整體來分配對像權限(INSERT、UPDATE和DELETE),還可以分配表裡指定字段的權限來限制用戶的訪問,如下所示:

19.3.4 數據庫賬戶PUBLIC

數據庫賬戶PUBLIC是個代表數據庫裡全體用戶的賬戶。所有用戶都屬於PUBLIC賬戶。如果某個權限被授予PUBLIC賬戶,那麼數據庫全部用戶都具有這個權限。類似地,如果一個權限從PUBLIC上撤銷,就相當於從全部數據庫用戶上撤銷了這個權限,除非這個權限明確地授予了特定用戶。範例如下:

19.3.5 權限組

有些實現可以在數據庫裡形成權限組。這些權限組是通過不同的名稱來引用的。通過使用權限組,我們可以更方便地給用戶授予和撤銷權限。舉例來說,如果某個權限組具有 10個權限,我們就可以把這個組授予一個用戶,而不必授予10個權限。

權限組在Oracle裡稱為角色。Oracle在其實現裡包含以下權限組:

COMNECT——允許用戶連接數據庫,並且對已經訪問過的任何數據庫對像進行操作。

注意:不同系統的權限組有所不同

在使用數據庫權限組方面,各個實現都有所不同。如果實現支持這個特性,我們可以利用它來減輕數據庫安全管理工作。

RESOURCE——允許用戶創建對像、刪除其所擁有的對象、為其所擁有的對象賦予權限等;

DBA——允許用戶在數據庫中對任何對像進行任何操作。

警告:對PUBLIC授予的權限可能帶來意想不到的後果

向 PUBLIC 授予權限時要特別小心。數據庫的所有用戶都會擁有 PUBLIC的權限,因此在向PUBLIC授予權限時,可能會意外地讓用戶能夠訪問本不該訪問的數據。舉例來說,如果讓PUBLIC能夠從僱員薪水表裡選擇數據,那麼所有用戶就可以訪問數據庫來瞭解公司發給每個人的工資。

CONNECT組允許用戶連接到數據庫,並且對能夠訪問的數據庫對像執行操作。

RESOURCE組允許用戶創建對像、刪除他擁有的對象、授予他擁有的對象的權限等。

DBA組允許用戶在數據庫裡執行任何操作,用戶可以訪問任何數據庫對象,執行任何操作。

把權限組授予用戶的範例如下:

SQL Server在服務器級別和數據庫級別有一些權限組。

部分數據庫權限組如下:

DB_DDLADMIN

DB_DATAREADER

DB_DATAWRITER

DB_DDLADMIN角色允許用戶使用任意合法的DDL命令,對數據庫中的任意對像進行操作。DB_DATAREADER 角色允許用戶在已經獲得權限的數據庫中,對任意表進行查詢。DB_DATAWRITER角色允許用戶對數據庫中的任意表運行任何數據控制命令,如INSERT、UPDATE或者DELETE。

19.4 通過角色控制權限

角色是數據庫裡的一個對象,具有類似權限組的特性。通過使用角色,我們不必明確地直接給用戶授予權限,從而減少安全維護工作。使用角色可以更方便地進行組權限管理。角色的權限可以被修改,而這種修改對於用戶來說是透明的。

如果某個用戶需要在一個程序裡、在指定時間內對某個表具有 SELECT 和 UPDATE 權限,我們可以暫時指派一個具有這些權限的角色,直到事務結束。

當一個角色最初被創建時,它就是數據庫裡的一個角色,沒有任何實際值。角色可以被指派給用戶或其他角色。假設在名為 APP01 的規劃裡,我們把對表 EMPLOYEE_PAY 的SELECT權限授予角色RECORDS_CLERK,那麼任何被指派了RECORDS_CLERK角色的用戶或角色就對表EMPLOYEE_PAY具有了SELECT權限。

類似地,如果APP01從RECORDS_CLERK角色撤銷了對表EMPLOYEE_PAY的SELECT權限,任何被指派了RECORD_CLERK的用戶或角色就不再對這個表有SELECT權限了。

在數據庫中分配權限的時候,需要考慮好一個用戶需要哪些權限,以及其他用戶是否需要同樣的權限。例如,會計部門的員工需要訪問與會計相關的表。在這種情況下,除非這些員工有完全不同的權限要求,否則就可以創建一個角色並為其賦予適當的權限,並將這個角色分配給這些員工。

如果現在創建了一個新的對象,並需要將相應權限賦給會計部門,就可以方便地在一個位置進行修改,而不必對每一個賬戶都重新設置。同樣,如果會計部門有了一個新成員,或者需要對其他員工賦予同樣的權限,只要賦予其相應的角色就可以了。角色是個非常優秀的工具,可以幫助DBA智能地完成工作,即使處理複雜的數據庫安全協議也並不麻煩。

19.4.1 CREATE ROLE語句

角色是由CREATE ROLE語句創建的:

向角色授予權限與向用戶授予權限是一樣的,範例如下:

19.4.2 DROP ROLE語句

這個語句用於刪除角色

範例如下:

注意:MySQL不支持角色

MySQL不支持角色。在某些SQL實現裡,不支持角色是它們的弱點之一。

19.4.3 SET ROLE語句

使用SET ROLE語句可以為用戶的SQL會話設置角色:

範例如下:

一個語句裡可以設置多個角色:

注意:SET ROLE語句並不經常使用

在某些實現裡,例如Microsoft SQL Server和Oracle,被指派給用戶的全部角色都自動成為默認角色。也就是說,只要用戶登錄到數據庫,這些角色就會被設置給用戶並發揮作用。這裡所介紹的SET ROLE語句,只是為了幫助讀者理解相應的ANSI標準。

19.5 小結

本章介紹了在SQL數據庫或關係型數據庫裡實現安全的基本知識,包括管理數據庫用戶的基本方法。在數據庫級別為用戶實現安全的第一個步驟是創建用戶,第二步是為用戶分配適當的權限,允許其訪問數據庫的特定部分。另外,ANSI 允許使用角色。權限可以被授予用戶或角色。

權限有兩種類型,分別是系統權限和對像權限。系統權限允許用戶在數據庫裡執行各種任務,比如連接到數據庫、創建表、創建用戶、改變量據庫的狀態等。對像權限允許用戶訪問數據庫裡的指定對象,比如從指定表裡選擇數據或操作數據。

SQL裡有兩個命令用於授予和撤銷用戶或角色的權限:GRANT和REVOKE。它們用於控制數據庫裡的整體管理權限。雖然在實現關係型數據庫的安全時還需要考慮其他很多因素,但與SQL語言相關的基本內容在此都已經介紹了。

19.6 問與答

問:如果用戶忘記了密碼,應該如何做才能繼續訪問數據庫呢?

答:用戶應該去找直接上級或能夠重置用戶密碼的人員。如果不存在這樣的專門人員, DBA或安全員可以重置密碼。當密碼重置之後,用戶應該盡快修改為自己的密碼。有時DBA可以設置一個選項,強制用戶在下次登錄後立即修改密碼。詳細情況請參見具體實現的文檔。

問:如果想授予某個用戶CONNECT角色,但該用戶不需要CONNECT角色的全部權限,應該怎麼辦?

答:這時不應該授予用戶CONNECT角色,而是只分配必要的權限。如果已經授予了用戶CONNECT角色,而用戶不在需要這個角色的全部權限,我們就要從用戶撤銷CONNECT角色,然後再分配特定的權限。

問:為什麼當新用戶從管理者獲得新密碼之後,立即修改密碼是非常重要的?

答:初始密碼是根據用戶ID設置的。包括DBA和管理人員在內的任何人都不應該知道個人的密碼。密碼應該始終高度保密,從而避免其他用戶假冒他人身份登錄到數據庫。

19.7 實踐

下面的內容包含一些測試問題和實戰練習。這些測試問題的目的在於檢驗對學習內容的理解程度。實戰練習有助於把學習的內容應用於實踐,並且鞏固對知識的掌握。在繼續學習之前請先完成測試與練習,答案請見附錄C。

19.7.1 測驗

1.如果用戶要把不是其所擁有的對象的權限授予另一個用戶,必須使用什麼選項?

2.當權限被授予PUBLIC之後,是數據庫的全部用戶,還是僅特定用戶獲得這些權限?

3.查看指定表裡的數據需要什麼權限。

4.SELECT是什麼類型的權限?

5.如果想撤銷用戶對某個對象的權限,以及其他使用GRANT分配這個對象權限的其他用戶的權限,應該使用什麼選項?

19.7.2 練習

1.登錄到你的數據庫實例,如果learnsql數據庫不是默認的,則轉換到learnsql數據庫。

2.在數據庫提示符下,根據你所使用的數據庫實例,輸入相應命令來列出數據庫實現中所默認的表:

3.創建如下數據庫用戶:

4.根據你所使用的數據庫實例,輸入如下命令來列出數據庫裡的全部用戶: