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