Oracle用戶訪問(wèn)權(quán)限與PUBLIC角色的關(guān)系 |
發(fā)布時(shí)間: 2012/7/28 17:03:54 |
在數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)用戶,這是給第三方系統(tǒng)用的。客戶強(qiáng)調(diào),這個(gè)用戶只能訪問(wèn)到有限的表,在我們規(guī)定的范圍內(nèi)的表。 于是,我創(chuàng)建 一個(gè)用戶,如user_third ,只給了connect 角色,用grant select on table 有限授權(quán)。 為此,我寫了一文,請(qǐng)見(jiàn) 如何實(shí)現(xiàn) Oracle中用戶 B只能訪問(wèn)用戶 A的視圖 ( http://www.linuxidc.com/Linux/2012-06/62061.htm )
用戶訪問(wèn)密碼交給客戶后,又發(fā)現(xiàn)一個(gè)新問(wèn)題,它居然能訪問(wèn)其他用戶的表。 我核實(shí)了一下,發(fā)現(xiàn)它確實(shí)能訪問(wèn)別的用戶的表。如數(shù)據(jù) 庫(kù)中TT 用戶下的表。 這是怎么回事? 您從我列出的標(biāo)題中,一定猜到了吧。這事一定 public 角色有關(guān)。 在 Oracle TimeTen 創(chuàng)建時(shí),它創(chuàng)建的表會(huì)自動(dòng)將它的查詢權(quán)限授予給 public 角色。 而數(shù)據(jù)庫(kù)中任何一個(gè)用戶都默認(rèn)擁有 public 角色。 因此,問(wèn)題就在 public 角色的權(quán)限上。我們只需要查詢 public 角色授予了哪些權(quán)限,再撤銷這些權(quán)限即可。 通過(guò)執(zhí)行下列 SQL ,我們能判斷出哪些權(quán)限授予給了 public 角色。 SELECT GRANTOR,OWNER,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='PUBLIC'; 部分結(jié)果如下: GRANTOR OWNER TABLE_NAME PRIVILEGE ------------------------------ ---------------------------------------- ×× GTJA TT_03_24577_L UPDATE GTJA GTJA TT_03_24577_L SELECT GTJA GTJA TT_03_24577_L INSERT GTJA GTJA TT_03_24577_L DELETE TT 表的查詢更新刪除插入權(quán)限都授予給了public 角色。這個(gè)很恐怖,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的安全是有破壞的。 基于此,我們可以判定任何一個(gè)數(shù)據(jù)庫(kù)用戶都可以對(duì)這些表做查詢更新刪除插入操作。 怎么解決這個(gè)權(quán)限問(wèn)題,是很簡(jiǎn)單的。但一定要保證不能影響到TT 的正常使用。這是個(gè)權(quán)衡的問(wèn)題,可用性和安全兩個(gè)角度的權(quán)衡。如果TT 不正常了,就考慮將其遷移到其他庫(kù)上去,最好是獨(dú)立的僅供TT 使用的庫(kù)。 具體解決方法如下: 1 、從Oracle TimeTen 上解決,在創(chuàng)建cachegroup 時(shí),將授予公共權(quán)限的選項(xiàng)除掉。當(dāng)然這么做的前提是要保證TT 能夠正常使用。 2 、從數(shù)據(jù)庫(kù)中將這些權(quán)限從public 角色撤銷。同樣前提是TT 在這些權(quán)限撤銷后能正常工作。 撤銷方法示例如下: revoke select on TT_03_24577_L from public; 總結(jié)一下,這個(gè)實(shí)例說(shuō)明了Oracle 的權(quán)限真夠復(fù)雜的,日常管理時(shí)一定要留意一下public 角色的權(quán)限。 本文出自:億恩科技【www.riomediacenter.com】
用戶訪問(wèn)密碼交給客戶后,又發(fā)現(xiàn)一個(gè)新問(wèn)題,它居然能訪問(wèn)其他用戶的表。 我核實(shí)了一下,發(fā)現(xiàn)它確實(shí)能訪問(wèn)別的用戶的表。如數(shù)據(jù) 庫(kù)中TT 用戶下的表。 這是怎么回事? 您從我列出的標(biāo)題中,一定猜到了吧。這事一定 public 角色有關(guān)。 在 Oracle TimeTen 創(chuàng)建時(shí),它創(chuàng)建的表會(huì)自動(dòng)將它的查詢權(quán)限授予給 public 角色。 而數(shù)據(jù)庫(kù)中任何一個(gè)用戶都默認(rèn)擁有 public 角色。 因此,問(wèn)題就在 public 角色的權(quán)限上。我們只需要查詢 public 角色授予了哪些權(quán)限,再撤銷這些權(quán)限即可。 通過(guò)執(zhí)行下列 SQL ,我們能判斷出哪些權(quán)限授予給了 public 角色。 SELECT GRANTOR,OWNER,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='PUBLIC'; 部分結(jié)果如下: GRANTOR OWNER TABLE_NAME PRIVILEGE ------------------------------ ---------------------------------------- ×× GTJA TT_03_24577_L UPDATE GTJA GTJA TT_03_24577_L SELECT GTJA GTJA TT_03_24577_L INSERT GTJA GTJA TT_03_24577_L DELETE TT 表的查詢更新刪除插入權(quán)限都授予給了public 角色。這個(gè)很恐怖,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的安全是有破壞的。 基于此,我們可以判定任何一個(gè)數(shù)據(jù)庫(kù)用戶都可以對(duì)這些表做查詢更新刪除插入操作。 怎么解決這個(gè)權(quán)限問(wèn)題,是很簡(jiǎn)單的。但一定要保證不能影響到TT 的正常使用。這是個(gè)權(quán)衡的問(wèn)題,可用性和安全兩個(gè)角度的權(quán)衡。如果TT 不正常了,就考慮將其遷移到其他庫(kù)上去,最好是獨(dú)立的僅供TT 使用的庫(kù)。 具體解決方法如下: 1 、從Oracle TimeTen 上解決,在創(chuàng)建cachegroup 時(shí),將授予公共權(quán)限的選項(xiàng)除掉。當(dāng)然這么做的前提是要保證TT 能夠正常使用。 2 、從數(shù)據(jù)庫(kù)中將這些權(quán)限從public 角色撤銷。同樣前提是TT 在這些權(quán)限撤銷后能正常工作。 撤銷方法示例如下: revoke select on TT_03_24577_L from public; 總結(jié)一下,這個(gè)實(shí)例說(shuō)明了Oracle 的權(quán)限真夠復(fù)雜的,日常管理時(shí)一定要留意一下public 角色的權(quán)限。 本文出自:億恩科技【www.enidc.com】 --> 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |