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