一、DBMS_NETWORK_ACL_ADMIN 子程序
DBMS_NETWORK_ACL_ADMIN软件包提供了管理网络访问控制列表 (ACL) 的界面,其子程序总结如下表。
子程序 | 描述 |
---|---|
CREATE_ACL 过程 | 使用初始权限设置创建访问控制列表 (ACL) |
ASSIGN_ACL 过程 | 将访问控制列表 (ACL) 分配给网络主机,并且可以选择特定于 TCP 端口范围 |
DROP_ACL 程序 | 删除访问控制列表 (ACL) |
ADD_PRIVILEGE 过程 | 添加权限以授予或拒绝访问控制列表 (ACL) 中的用户的网络访问权限 |
DELETE_PRIVILEGE 过程 | 删除访问控制列表 (ACL) 中的权限 |
CHECK_PRIVILEGE 函数 | 检查访问控制列表 (ACL) 中的用户是否授予或拒绝了权限 |
CHECK_PRIVILEGE_ACLID 函数 | 通过指定访问控制列表的对象 ID,检查 ACL 中的用户是否授予或拒绝了权限 |
UNASSIGN_ACL 过程 | 取消分配当前分配给网络主机的访问控制列表 (ACL) |
1. ADD_PRIVILEGE 过程
此过程添加了授予或拒绝用户网络访问的权限。如果访问控制条目 (ACE) 不存在,则会创建它。
句法:
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (acl IN VARCHAR2,principal IN VARCHAR2,is_grant IN BOOLEAN,privilege IN VARCHAR2,position IN PLS_INTEGER DEFAULT NULL,start_date IN TIMESTAMP WITH TIMESTAMP DEFAULT NULL,end_date IN TIMESTAMP WITH TIMESTAMP DEFAULT NULL );
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
principal | 被授予或拒绝权限的主体(数据库用户或角色),区分大小写。 |
is_grant | 要授予或拒绝的网络权限 - ‘connect| resolve’(区分大小写)。如果数据库用户需要连接使用UTL_HTTP,UTL_SMTP,UTL_MAIL实用程序包,那么他或她需要对外部网络主机计算机的连接权限。要使用包解析指定主机 IP 地址的主机名或指定主机名的 IP 地址,请授予数据库用户解析权限。 |
privilege | 要授予或拒绝的网络权限 |
position | ACE 的位置(从 1 开始)。如果给出了一个非NULL值,则特权将被添加到给定位置的新 ACE 中,并且不应该有另一个具有相同is_grant(授予或拒绝)的主体的 ACE 。如果给定NULL值,is_grant如果存在,则特权将添加到与主体匹配的 ACE,如果匹配的 ACE 不存在,则添加到ACL 的末尾。 |
start_date | 访问控制条目 (ACE) 的开始日期。指定后,ACE 将仅在指定日期及之后有效。如果将特权添加到现有 ACE ,则将忽略start_date 。 |
end_state | 访问控制条目 (ACE) 的结束日期。指定后,ACE 将在指定日期后到期。end_date必须大于或等于start_date。如果将权限添加到现有 ACE ,则将忽略end_date 。 |
使用说明
- 要删除权限,请使用DELETE_PRIVILEGE 过程。
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'us-oracle-com-permissions.xml',principal => 'ST_USERS',is_grant => TRUE,privilege => 'connect')
END;
2. ASSIGN_ACL 过程
此过程将访问控制列表 (ACL) 分配给主机、域或 IP 子网,以及 TCP 端口范围(如果已指定)。
句法:
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (acl IN VARCHAR2,host IN VARCHAR2,lower_port IN PLS_INTEGER DEFAULT NULL,upper_port IN PLS_INTEGER DEFAULT NULL);
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
host | 将分配 ACL 的主机。主机可以是主机的名称或 IP 地址。通配符可用于指定域或 IP 子网。主机名或域名不区分大小写。 |
lower_port | 如果不是NULL,则 作为TCP 端口范围的下限 |
upper_port | TCP 端口范围的上限。如果NULL,则假定为lower_port。 |
使用说明
1)只能将一个 ACL 分配给任意主机、域或 IP 子网,以及 TCP 端口范围(如果已指定)。当您将新的访问控制列表分配给网络目标时,Oracle 数据库会取消分配先前分配给同一目标的访问控制列表。但是,Oracle 数据库不会删除访问控制列表。您可以使用DROP_ACL 过程删除访问控制列表。要删除访问控制列表分配,请使用UNASSIGN_ACL 过程。
2)分配给域的 ACL 的优先级低于分配给子域的其他 ACL,后者的优先级低于分配给单个主机的 ACL。因此,对于给定的主机说“www.us.oracle.com”,以下域以递减的优先级列出:
- www.us.oracle.com
- *.us.oracle.com
- *.oracle.com
- *.com
- *
同样,分配给子网的 ACL 的优先级低于分配给较小子网的其他 ACL,后者的优先级低于分配给各个 IP 地址的 ACL。因此,对于给定的 IP 地址,例如“192.168.0.100”,以下子网以递减的优先级列出:
- 192.168.0.100
- 192.168.0.*
- 192.168.*
- 192.*
- *
3)端口范围仅适用于 ACL 中的“连接”权限分配。ACL 中的“解析”权限分配仅在将 ACL 分配给没有端口范围的主机时才有效。
4)对于“连接”权限分配,分配给没有端口范围的主机的 ACL 的优先级低于分配给具有端口范围的同一主机的其他 ACL。
5)指定 TCP 端口范围时,lower_port 和 upper_port 都不能为NULL并且upper_port必须大于或等于lower_port。端口范围不得与已分配的同一主机的任何其他端口范围重叠。
6)要删除分配,请使用UNASSIGN_ACL 过程。
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'us-oracle-com-permissions.xml',host => '*.us.oracle.com',lower_port => 80);
END;
3. CHECK_PRIVILEGE 函数
此函数检查 ACL 中的用户是否授予或拒绝了权限。
句法:
DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE (acl IN VARCHAR2,user IN VARCHAR2,privilege IN VARCHAR2)RETURN NUMBER;
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
user | 要检查的用户。如果用户是NULL,则假定调用者。用户名区分大小写,如在视图ALL_USERS的USERNAME列中一样。 |
privilege | 检查网络权限 |
返回值
当权限被授予时返回 1;当权限被拒绝时返回0;当特权既没有被授予也没有被拒绝时返回NULL。
例子:
SELECT DECODE(DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE('us-oracle-com-permissions.xml', 'SCOTT', 'resolve'),1, 'GRANTED', 0, 'DENIED', NULL) PRIVILEGE
FROM DUAL;
4. CHECK_PRIVILEGE_ACLID 函数
此函数通过指定访问控制列表的对象 ID,检查 ACL 中的用户是否授予或拒绝了权限。
句法:
DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID (aclid IN RAW,user IN VARCHAR2 DEFAULT NULL)privilege IN VARCHAR2,RETURN NUMBER;
参数含义:
范围 | 描述 |
---|---|
aclid | ACL的对象ID |
user | 要检查的用户。如果用户是NULL,则假定调用者。用户名区分大小写,如在视图ALL_USERS的USERNAME列中一样。 |
privilege | 检查网络权限 |
返回值
当权限被授予时返回 1;当权限被拒绝时返回0;当特权既没有被授予也没有被拒绝时返回NULL。
5. CREATE_ACL 过程
此过程使用初始权限设置创建访问控制列表 (ACL)。ACL 必须至少具有一项权限设置。除非将 ACL 分配给网络目标,否则 ACL 没有访问控制效果。
句法:
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (acl IN VARCHAR2,description IN VARCHAR2,principal IN VARCHAR2,is_grant IN BOOLEAN,privilege IN VARCHAR2,start_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL,end_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL );
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
description | ACL 中的描述属性 |
principal | 被授予或拒绝权限的主体(数据库用户或角色),区分大小写。 |
is_grant | 是否授予权限 |
privilege | 要授予或拒绝的网络权限 - ‘connect| resolve’(区分大小写)。如果数据库用户需要连接使用UTL_HTTP,UTL_SMTP,UTL_MAIL实用程序包,那么他或她需要对外部网络主机计算机的连接权限。要使用包解析指定主机 IP 地址的主机名或指定主机名的 IP 地址,请授予数据库用户解析权限。 |
start_date | 访问控制条目 (ACE) 的开始日期。指定后,ACE 将仅在指定日期及之后有效。如果将特权添加到现有 ACE ,则将忽略start_date 。 |
end_state | 访问控制条目 (ACE) 的结束日期。指定后,ACE 将在指定日期后到期。end_date必须大于或等于start_date。如果将特权添加到现有 ACE ,则将忽略end_date 。 |
使用说明
- 要删除访问控制列表,请使用DROP_ACL 过程。
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'us-oracle-com-permissions.xml',description => 'Network permissions for *.us.oracle.com',principal => 'SCOTT',is_grant => TRUE,privilege => 'connect');
END;
6. DELETE_PRIVILEGE 过程
此过程删除访问控制列表中的权限。
句法:
DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE (acl IN VARCHAR2,principal IN VARCHAR2,is_grant IN BOOLEAN DEFAULT NULL,privilege IN VARCHAR2 DEFAULT NULL);
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
principal | 将为其删除所有 ACE 的主体(数据库用户或角色) |
is_grant | 权限被授予与否(被拒绝)。如果给出空值,则删除适用于授予或拒绝的权限。 |
privilege | 要删除的网络权限。如果给定NULL值,则删除适用于所有权限。 |
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE(acl => 'us-oracle-com-permissions.xml',principal => 'ST_USERS')
END;
7. DROP_ACL 程序
此过程删除访问控制列表 (ACL)。
句法:
DBMS_NETWORK_ACL_ADMIN.DROP_ACL (acl IN VARCHAR2);
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。 |
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.DROP_ACL(acl => 'us-oracle-com-permissions.xml');
END;
8. UNASSIGN_ACL 过程
此过程取消分配当前分配给网络主机的访问控制列表 (ACL)。
句法:
DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL (acl IN VARCHAR2 DEFAULT NULL,host IN VARCHAR2 DEFAULT NULL,lower_port IN PLS_INTEGER DEFAULT NULL,upper_port IN PLS_INTEGER DEFAULT NULL);
参数含义:
范围 | 描述 |
---|---|
acl | ACL 的名称,相对路径将相对于“/sys/acls”。如果 acl 是NULL,则分配给主机的任何 ACL 都将被取消分配。 |
host | 将删除 ACL 的主机。主机可以是主机的名称或 IP 地址。通配符可用于指定域或 IP 子网。主机名或域名不区分大小写。如果主机为空,ACL 将从任何主机取消分配。如果host和acl都是NULL,则将删除所有 ACL 分配。 |
lower_port | 如果不是NULL,则 作为TCP 端口范围的下限 |
upper_port | TCP 端口范围的上限。如果NULL,则假定为lower_port。 |
例子:
BEGINDBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => '*.us.oracle.com',lower_port => 80);
END;
二、DBMS_NETWORK_ACL_ADMIN 实例演示
示例 1:将主机 www.us.oracle.com 的连接和解析权限授予 SCOTT。
BEGINDBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'www.xml',description => 'WWW ACL',principal => 'SCOTT',is_grant => true,privilege => 'connect');DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'www.xml',principal => 'SCOTT',is_grant => true,privilege => 'resolve');DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml',host => 'www.us.oracle.com');
END;
/
COMMIT;
示例 2:将 www.us.oracle.com 的解析权限授予 ADAMS。由于 www.us.oracle.com 的 ACL 已经存在,只需添加 ADAMS 的权限即可。
BEGINDBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'www.xml',principal => 'ADAMS',is_grant => true,privilege => 'resolve');
END;
/
COMMIT;
示例 3:将 ACL www.xml 分配给 www-proxy.us.oracle.com,以便 SCOTT 和 ADAMS 也可以访问 www-proxy.us.oracle.com。
BEGINDBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml',host => 'www-proxy.us.oracle.com');
END;
/
COMMIT;
示例 4:从 www.us.oracle.com 取消分配 ACL,以便不允许访问 www.us.oracle.com。
BEGINDBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'www.us.oracle.com');
END;
/
COMMIT;
例 5:
DBMS_NETWORK_ACL_UTLILITY 包中的DOMAINS 函数返回主机所属的所有域。它可以与本包中的CHECK_PRIVILEGE_ACLID 函数结合使用,以确定影响用户访问网络主机权限的权限分配。DBMS_NETWORK_ACL_UTILITY 包中的函数DOMAIN_LEVEL 函数返回每个域的级别,可用于按优先级对 ACL 分配进行排序。
例如,对于 SCOTT 连接到 www.us.oracle.com 的许可:
SELECT host, lower_port, upper_port, acl,DECODE(DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'SCOTT', 'connect'),1, 'GRANTED', 0, 'DENIED', null) privilegeFROM dba_network_aclsWHERE host IN(SELECT * FROMTABLE(DBMS_NETWORK_ACL_UTILITY.DOMAINS('www.us.oracle.com')))ORDER BY DBMS_NETWORK_ACL_UTLITITY.DOMAIN_LEVEL(host) desc, lower_port, upper_port;HOST LOWER_PORT UPPER_PORT ACL PRIVILEGE-------------------- ---------- ---------- -------------------- ---------www.us.oracle.com 80 80 /sys/acls/www.xml GRANTEDwww.us.oracle.com 3000 3999 /sys/acls/www.xml GRANTEDwww.us.oracle.com /sys/acls/www.xml GRANTED*.oracle.com /sys/acls/all.xml* /sys/acls/all.xml
例如,对于 SCOTT 对 www.us.oracle.com 进行域名解析的许可:
SELECT host, acl,DECODE(DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'SCOTT', 'resolve'),1, 'GRANTED', 0, 'DENIED', NULL) privilegeFROM dba_network_aclsWHERE host IN(SELECT * FROMTABLE(DBMS_NETWORK_ACL_UTILITY.DOMAINS('www.us.oracle.com'))) andlower_port IS NULL AND upper_port IS NULLORDER BY DBMS_NETWORK_ACL_UTILITY.DOMAIN_LEVEL(host) desc;HOST ACL PRIVILEGE-------------------- -------------------- ---------www.us.oracle.com /sys/acls/www.xml GRANTED*.oracle.com /sys/acls/all.xml* /sys/acls/all.xml
请注意,“ resolve”权限仅在没有任何端口范围的情况下分配的 ACL 中生效(当lower_port和upper_port是 时NULL)。出于这个原因,我们不在查询中包含lower_port和upper_port列。
图片来源于网络
参考文章:DBMS_NETWORK_ACL_ADMIN