在Oracle11g中,Oracle在安全方面有了很多的改進,而在網絡權限控制方面,也有一個新的概念提出來,叫做ACL(Access Control List), 這是一種細粒度的權限控制。在ACL之前,我們對於有一些程序包,例如UTL_MAIL, UTL_SMTP等這些包,你可以利用這些包連接到外部的主機,而默認情況下,這些包都是都是賦予了public角色,所以可能會導致利用這些PL/SQL程序包的惡意工具,所以Oracle提出了一個新的概念來解決這個問題,那就是ACL。
在開始展開ACL之前,首先明確一些概念。 ACL這個概念不是Oracle首先提出來的,在很多地方的權限管理都用到了ACL,甚至在操作系統上也使用了ACL。一般,我們在做權限管理時,牽扯到一個問題,就是誰要在什么對象上作什么?這個正是對應了我們ACL中的概念。Principal will have what privileges on what object.誰就是principal, 什么對象就是我們的object, 做什么就是我們的privilege。那么如果有了這種細粒度的權限控制,我們就可以定義我們哪些用戶擁有哪個遠程主機的什么權限了。有了這個概念我們就可以看看如何使用ACL了。我們主要使用的是DBMS_NETWORK_ACL_ADMIN這個自帶的包來完成。
首先我們需要先去創建一個ACL。
BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'test.xml', description => 'Just a test for ACL', principal => 'COOLMA', is_grant => true, privilege => 'connect'); END; /
我們已經創建好了一個ACL,並且加入了connect的權限,並把它賦予給了coolma用戶。然后繼續下面的步驟,
BEGIN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'test.xml', principal => 'COOLMA', is_grant => true, privilege => 'resolve'); END; /
以上是給我們現有的ACL中加入了resolve的權限給COOLMA用戶。
BEGIN DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'test.xml', host => 'www.baidu.com'); END; /
然后我們把主機www.baidu.com賦予給我們的ACL。
現在我們的用戶COOLMA就可以connect, 和resolve我們的主機www.baidu.com。你可以通過dba_network_acls數據字典來看。
COLUMN host FORMAT A30 COLUMN acl FORMAT A30 SET LINESIZE 2000 select * from dba_network_acls; HOST LOWER_PORT UPPER_PORT ACL ACLID ------------------------------ ---------- ---------- ------------------------------ -------------------------------- www.baidu.com /sys/acls/test.xml FE6427F3AEE81311E0436D01A8C07A8B
如果我們想再加一個用戶怎么辦,和加入coolma的方法一樣。
我們上述相關的ACL只對於UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, and UTL_INADDR, the DBMS_LDAP 這些程序包以及HttpUriType類型相關。希望本文能夠幫助到你。
-EOF