Oracle ACL (Access Control List) 详细介绍
在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这个自带的包来完成。
1、首先,创建一个 ACL:
BEGIN
dbms_network_acl_admin.create_acl(acl => 'httprequestpermission.xml',
DESCRIPTION => 'Normal Access',
principal => 'CRM', --表示赋予哪个用户
is_grant => TRUE,
PRIVILEGE => 'connect',
start_date => NULL,
end_date => NULL);
END;
2、接下来,为该 ACL 增加一个权限:在本示例中,您将尝试将该 ACL 局限于用户 CRM 您还可以定义开始和结束日期。
begin
dbms_network_acl_admin.add_privilege(acl => 'httprequestpermission.xml',
principal => 'CRM', --表示赋予权限给哪个用户
is_grant => TRUE,
privilege => 'connect',
start_date => null,
end_date => null);
end;
3、分配将受该 ACL 制约的主机以及其他详细信息:
begin
dbms_network_acl_admin.assign_acl(acl => 'httprequestpermission.xml',
host => '172.31.3.10',
lower_port => 1,
upper_port => 9999);
end;
4、删除一个ACL权限:
begin
dbms_network_acl_admin.unassign_acl(acl => 'httprequestpermission.xml',
host => '172.30.1.10',
lower_port => 1,
upper_port => 9999);
end;
5、要了解 ACL 的详细信息,请查询 DBA_NETWORK_ACLS 和dba_network_acls视图:
SELECT acl,
principal,
privilege,
is_grant,
TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
FROM dba_network_acl_privileges;
select * from dba_network_acls;
6、如果要删除上面的控制列表
BEGIN
DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'httprequestpermission.xml');
END;
更多详细内容详见oracle官方文档:
https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm#BABCGEAE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通