有關數據庫的權限 存儲在數據庫中的數據對於一個商務活動來說是非常重要的。不僅要通過備份和制作日志來保證數據的不丟失,還要通過設置不同的訪問權限來防止來自用戶的善意的或惡意的破壞。一個公司不可能總是使用一個完全獨立的數據庫系統來保存雇員的工資信息。工資信息可能是與是保存在通常的數據庫中,這樣你就不需要兩台機器和兩個數據庫服務軟件包。即使你在一台服務中使用了兩個完全獨立的數據庫,針對每個用戶確定其訪問數據庫、數據表以及數據字段的權限還是很必要的。 而目前眾多的數據庫管理系統總是更習慣於將用戶權限的管理完全交給Application來完成。而真正操作數據庫的往往是諸如DBA這樣的擁有超級權限的數據庫用戶。我不能說這樣的系統就一定會出安全性問題,但是至少這種做法會帶來有關安全性的隱患。對於數據庫用戶權限的設置,絕大多數成熟的數據庫都提供了一種大同小異的做法。我們這裡以Informix為例,僅僅是因為我在使用Informix時發現網上對於Informix的用戶權限設置缺少詳實的資料。希望這份文檔能對Informix的應用者有所幫助(盡管現在Informix的市場占有率是出奇的低。)
有關我們的系統 我們使用的數據庫數據服務器上的操作系統是SCO UNIX 5.05,數據庫選用Informix 7.3。由於選用操作系統和數據庫的不同,以下的操作可能會用細微的差別。
創建新用戶 在我們使用的平台上,Informix的數據庫用戶對應於UNIX的系統用戶,因此創建新用戶的過程也就是創建UNIX系統用戶的過程,我們可以用root登錄後使用如下命令創建三個新的用戶: #useradd mydba #useradd myuser1 #useradd myuser2 然後使用passwd給這三個用戶設置相應的口令,我們可以看到由於我們的useradd命令沒有采用完整的格式,因此這三個用戶並不能真正用來登錄到我們的UNIX主機,而只能作為數據庫用戶來使用。
數據庫級別的用戶權限 對於所有的有權使用(這裡的有權使用可能意味著該用戶只能浏覽該數據庫中某一數據表的某一字段)該數據庫的數據庫用戶都必須賦予其數據庫級別的用戶權限。在Informix中,數據庫級別的用戶權限有三種,按權限的大小依次是connect、resource和DBA。 Connect 這是級別最低的一種數據庫級別的用戶權限。擁有該權限的用戶可以執行select、insert、update和delete語句,針對數據表執行存儲過程,創建數據表的視圖,創建臨時表(這樣的臨時表可以有索引,也可以沒有索引)。 Resource 擁有該權限的用戶除擁有connect的全部權限以外,他還可以創建新的表,並可以對它自己所創建的表執行alter和drop操作,並可以對這些表創建索引。 DBA 數據庫的建立者和擁有者被自動賦予這種權限。擁有該權限的用戶除擁有resource的全部權限以外,他還可以對其他用戶賦予或解除connect、resource和DBA權限,可以對其它用戶創建的表的視圖執行drop和alter操作。甚至他還可以對數據庫執行drop、start、stop和recover操作。 新數據庫的建立並為各用戶賦予相應的數據庫級別的權限 使用有權登錄到UNIX主機的用戶創建一個新的數據庫(create database databasename命令)。如上所述,現在該用戶將對新創建的databasename數據庫擁有DBA的權限。連接到這個庫後,采用GRANT命令可以對其它用戶賦予相應的數據庫級別的權限。(事實上這是一個真正意義上的超級用戶,換言之也是最危險的用戶,在我們下面賦予了mydba以該表的DBA權限以後,我們將不再使用這個用戶)。 賦予用戶相應的數據庫級別的權限的格式是: GRANT 權限 TO 用戶名[,用戶名] 於是,我們可以使用下面的三個命令給我們新創建的用戶賦予相應的數據庫級別的權限。 GRANT DBA TO mydba;/*賦予mydba以DBA的權限*/ GRANT CONNECT TO myuser1,myuser2;/*賦予myuser1,myuser2以CONNECT的權限*/ 在這裡,我們有必要介紹一個特殊的用戶public,如果使用GRANT ... TO PUBLIC,這將意味著賦予所有用戶某種權限,當然,這種做法也許並不可取。
用戶數據庫級別權限的解除 解除用戶相應的數據庫級別的權限的格式是: REVOKE 權限 FROM 用戶名[,用戶名] 對於擁有DBA、RESOURCE權限的用戶,解除其相應的DBA、RESOURCE權限將自動將其降格為CONNECT權限。 而對於只擁有CONNECT權限的用戶,解除其CONNECT權限實際上也就意味著刪除該數據庫用戶。 示例: REVOKE DBA FROM mydba;/*將mydba降格為CONNECT權限*/ REVOKE CONNECT FROM myuser1;/*解除myuser1對該數據庫的訪問權限*/
表級別和字段級別的權限 當一個用戶訪問數據庫時,DBA可以限制其對指定表和表中指定字段的訪問。任何resource級別或DBA級別的用戶都可以創建表。表的擁有者或任何DBA級別的用戶都可以對其它用戶賦予或解除針對該數據表的表級別和字段級別的權限。這樣的權限共有八種:insert、delete、select、update、references、index、alter和all。 Insert 該權限表示用戶可以向表中增添新的數據。 Delete 該權限表示用戶可以刪除表中的數據。 Select 該權限可以擴展到指定字段,表示用戶可以查詢表中的記錄或指定字段。 Update 該權限可以擴展到指定字段,表示用戶可以修改表中的記錄或指定字段。 References 該權限可以擴展到指定字段,表示用戶可以針對表中的記錄或指定字段制定參考性約束條件。參考性約束條件用來執行諸如多級刪除和字段之間關聯的工作。賦予該權限的用戶應該首先至少是resource級別的用戶。 Index 該權限表示用戶可以建立或刪除與表有關的索引。賦予該權限的用戶應該首先至少是resource級別的用戶。一個connect級別的用戶即使被賦予該權限也不能建立索引。該權限不能擴展到指定字段,這是因為索引是建立在表的所有行的基礎上的。 Alter 該權限表示用戶可以改變表的結構。所謂改變表的結構是指增加、刪除和改變字段或改變字段的數據類型。該權限只能針對數據表。一般來說,只有對於具備數據庫系統知識並知道如何保護數據庫系統的人,我們才會賦予此項權限。 All 該權限包含上面的所有七種權限。
創建新表 使用mydba登錄到數據庫,並使用如下語句創建一個新的數據表: CREATE TABLE customer_table ( customer_id char(2) not null, balance decimal(16, 2) not null, primary key(customer_id)); 在創建新表後,系統將對public賦予該表All的權限。也就是說所有可以訪問該數據庫的用戶都可以對該表執行select、insert、update和delete語句,這顯然不是我們想要看到的。 用戶表級別和字段級別權限的解除 解除用戶相應的數據庫級別的權限的格式是: REVOKE 權限[,權限] [(字段名[,字段名])] ON 表名 FROM 用戶名[,用戶名] 我們首先需要解除public在該表上的All權限: REVOKE ALL ON customer_table FROM PUBLIC;
其它示例: REVOKE INSERT ON customer_table FROM PUBLIC;/*解除所有用戶對該表的INSERT權限*/ REVOKE SELECT ON customer_table FROM myuser1;/*解除myuser1對該表的SELECT權限*/ REVOKE UPDATE (customer_id, balance) ON customer_table FROM myuser1;/*解除myuser1對該表中customer_id, balance字段的UPDATE權限*/
用戶表級別和字段級別權限的賦予 賦予用戶相應的數據庫級別的權限的格式是: GRANT 權限[,權限] [(字段名[,字段名])] ON 表名 TO 用戶名[,用戶名] 我們賦予myuser1以更改該表中balance字段的權限: GRANT UPDATE (balance) ON customer_table TO myuser1; 賦予myuser2以浏覽該表的權限: GRANT SELECT ON customer_table TO myuser2;
多種權限的同時賦予和解除 從上面的REVOKE和GRANT的格式,我們可看到,其實我們可以使用一條命令同時針對某一用戶賦予或解除多種表級別或字段級別的權限。例如: GRANT INSERT, DELETE, UPDATE ON customer_table TO PUBLIC;/*同時賦予所有用戶對該表的INSERT、DELETE和UPDATE權限*/ GRANT SELECT, UPDATE (balance) ON customer_table TO myuser2;/*同時賦予myuser2對該表中balance字段的SELECT和UPDATE權限*/ REVOKE INDEX, ALTER ON customer_table FROM myuser1;/*同時解除myuser1對該表的INDEX和ALTER權限*/ 你也可以在一條語句中同時針對某一用戶賦予或解除表級別和字段級別的權限,這時字段級別的權限使用指定的字段,而表級別的權限使用指定的數據表。例如: GRANT INSERT, DELETE, SELECT, UPDATE (balance) ON customer_table TO myuser2; /*同時賦予myuser2對該表的INSERT、DELETE權限以及對字段balance的SELECT和UPDATE權限*/ REVOKE INDEX, SELECT, ALTER (balance) ON customer_table FROM myuser1; /*同時賦予myuser1對該表的INDEX、ALTER權