Oracle Database 11g 中的访问控制列表 (ACL) 拒绝网络访问
Posted
技术标签:
【中文标题】Oracle Database 11g 中的访问控制列表 (ACL) 拒绝网络访问【英文标题】:Network access denied by access control list (ACL) in Oracle Database 11g 【发布时间】:2016-06-14 16:22:43 【问题描述】:最近我们从Oracle 10g切换到11g,现在才注意到我的邮件功能不起作用,我现在收到错误:
ORA-24247: network access denied by access control list (ACL)
所以我做了一些谷歌搜索,发现 Oracle 11g 中的一个新特性现在限制用户使用某些包,包括 utl_smtp。因为我正在寻找一个快速的解决方案,所以我没有阅读 Oracle 文档,而是寻找更简单的解决方案并遇到了本教程:
https://www.pythian.com/blog/setting-up-network-acls-in-oracle-11g-for-dummies/
我把它弄乱了一点,但因为我不知道更好,我想我添加了两个单独的配置 .xml 文件。所以我的问题的第一部分是 - 我如何删除它?
第二个问题是:
向我的用户添加一些授权后,我尝试测试它是否有效,但我很快意识到它没有:
SELECT DECODE(
DBMS_NETWORK_ACL_ADMIN.check_privilege('netacl.xml', 'TEST1', 'connect'),
1, 'GRANTED', 0, 'DENIED', NULL) privilege
FROM dual;
返回:
PRIVILE
-------
DENIED
为什么?(已排序)
问题的第三部分 - 阅读后被拒绝,我尝试修复它:
BEGIN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('netacl.xml' ,'TEST1', TRUE, 'connect');
END;
但这给了我一个错误:
Ora19279 - XQuery dynamic type mismatch.....(more text meaning nothing to me).
为什么?(我想通了,当您将相同的权限授予相同的用户第二次时会发生错误)
更新
我遵循了下面 kevinsky 的建议答案,并且在此过程中学到了很多东西,但是我仍然遇到问题。我仍然得到 ORA-24247: network access denied by access control list (ACL).因为我按照建议做了所有其他事情,我开始认为问题可能是我添加的第一个配置文件,但现在无法删除,因为我不记得它的名称。如果有人可以帮助我,我将不胜感激。
结果(我尝试了一些不同的东西):
select * from dba_network_acls;
返回
* | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myservername.com | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myDBName | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
mailServerDomainName | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
mailserver.myDomain.local | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
【问题讨论】:
“更多文字”可能对其他人意味着什么。您一开始就显示了两个 ACL 名称,也许您没有始终如一地做事? TEST1 是您创建的用户吗?如果没有看到您输入的所有命令,就像您输入的一样,很难判断您哪里出错了。 其实我觉得文档还是挺不错的。 DROP_ACL 删除 ACL。 @Alex Poole 所有代码都是从教程中执行的,我在帖子中添加了它的 URL。 TEST1 不是真实用户 我在执行这些命令时使用了自己的用户名。 @OldProgrammer 是的,我在这里找到了如何删除oracle-base.com/articles/11g/…,但问题是你首先需要知道你调用的文件是什么。 那么该教程似乎只引用了netacl.xml,但您的问题也有test_acl_file.xml。所以不清楚你做了什么。 The docs give examples 包括查询 dba_network_acls 以查看定义的内容。 【参考方案1】:我进行了这次升级,这需要几个小时的工作时间。对于版本 12,这一切都必须以不同的方式重做。每个过程调用都必须有一个提交。一般的想法是您创建访问,添加详细信息,授予权限。你必须知道:
您的邮件服务器名称和端口 是否需要用户名和密码才能访问(可能不需要) 将调用邮件包的用户,如果他们也拥有邮件包,则更容易/*create the access permission to connect*/
BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'utl_smtp.xml',
description => 'access to smtp email',
principal => 'YourUser',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);
COMMIT;
END;
--add the privilege to resolve names
BEGIN
DBMS_NETWORK_ACL_ADMIN.add_privilege (
acl => 'utl_smtp.xml',
principal => 'YourUser',
is_grant => TRUE,
privilege => 'resolve');
COMMIT;
END;
--assign your mailserver
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'utl_smtp.xml',
host => 'mailserver.YourDomain.local',
lower_port => 25,
upper_port => NULL);
commit;
END;
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'utl_smtp.xml',
host => 'YourDBName',
lower_port => 25,
upper_port => NULL);
COMMIT;
END;
--more housekeeping
alter system set smtp_out_server = 'mailserver.YourDomain.local:25' scope = both;
--make sure the user can access the smtp packages
GRANT EXECUTE ON UTL_TCP TO YourUser;
GRANT EXECUTE ON UTL_SMTP TO YourUser;
GRANT EXECUTE ON UTL_MAIL TO YourUser;
--check your work
select * from dba_network_acls;
--verify permissions for your user
SELECT DECODE(
DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(
'utl_smtp.xml', 'YourUser', 'resolve'),
1, 'GRANTED', 0, 'DENIED', NULL) PRIVILEGE
FROM DUAL;
--if you have created access permissions you wish to delete
--using the information from the select use this to delete what you don't want
exec DBMS_NETWORK_ACL_ADMIN.DROP_ACL ('acl_utl_smtp.xml');
--for more troubleshooting try this barebones mail procedure, run with your user. Copied from [here][1]
DECLARE
v_From VARCHAR2(80) := 'oracle@mycompany.com';
v_Recipient VARCHAR2(80) := 'test@mycompany.com';
v_Subject VARCHAR2(80) := 'test subject';
v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';
v_Mail_Conn utl_smtp.Connection;
crlf VARCHAR2(2) := chr(13)||chr(10);
BEGIN
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);
utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
utl_smtp.Mail(v_Mail_Conn, v_From);
utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
utl_smtp.Data(v_Mail_Conn,
'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
'From: ' || v_From || crlf ||
'Subject: '|| v_Subject || crlf ||
'To: ' || v_Recipient || crlf ||
crlf ||
'some message text'|| crlf || -- Message body
'more message text'|| crlf
);
utl_smtp.Quit(v_mail_conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Unable to send mail', TRUE);
END;
【讨论】:
这是一个很好的例子,不过我确实有一个问题,我注意到你创建了两次 ACL - 为什么? 糟糕,我正在为两个用户使用我的脚本,已更正、创建、添加权限并分配... 还有一个问题,有没有办法让自己重新开始并删除所有以前的设置?我很粗心,添加了两个配置文件,其中一个我不记得名字了.... @K.I 添加了这些细节,希望对您有所帮助 感谢您的帮助!但是我的问题还没有解决。我做了你说的一切,除了我用我的用户替换了“YourUser”,用“mailserver.mydomain.local”替换了“mailserver.YourDomain.local”,用“MyDBName”替换了“YourDBName”。当我从 dba_network_acls 中选择 * 时,我在表中得到两行包含我的数据库名称和主机名的信息,但是当我从我的应用程序发送电子邮件时,我仍然收到“ORA-24247:访问控制列表拒绝网络访问” (ACL)'.....以上是关于Oracle Database 11g 中的访问控制列表 (ACL) 拒绝网络访问的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - 安装 Oracle Database 11g Release 2
Oracle Database 12c 第 1 版 与Oracle Database 11g 第 2 版 有啥区别 啊!???