oracle-databaseplsqloracle11gora-24247

Network access denied by access control list (ACL) in Oracle Database 11g


Recently we have switched from Oracle 10g to 11g, and only now I noticed that my mailing function does not work, I now get an error:

ORA-24247: network access denied by access control list (ACL)

So I did a bit of googling and was able to figure out that a new feature in Oracle 11g is now restricting users from using certain packages including utl_smtp. Because I am looking for a quick solution I did not read Oracle documentation, but instead I went looking for easier solutions and came across this tutorial:

https://www.pythian.com/blog/setting-up-network-acls-in-oracle-11g-for-dummies/

I messed around with it a little bit, but because I did not know any better I think I added two seperate configuration .xml files. So first part of my question is - HOW DO I REMOVE IT?

Second question is:

After adding some grants to my user I try to test to see if it worked, but I soon realised it did not:

  SELECT DECODE(
         DBMS_NETWORK_ACL_ADMIN.check_privilege('netacl.xml', 'TEST1', 'connect'),
         1, 'GRANTED', 0, 'DENIED', NULL) privilege 
FROM dual;

Returns:

PRIVILE
-------
DENIED

WHY?(THIS HAS BEEN SORTED)

Third part of the question - after reading it was denied I try to fix it like:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('netacl.xml' ,'TEST1', TRUE, 'connect');
END;

But that gives me an error:

Ora19279 - XQuery dynamic type mismatch.....(more text meaning nothing to me).

WHY?(I FIGURED OUT, THAT ERROR HAPPENS WHEN YOU GRANT SAME PERMISSION TO SAME USER SECOND TIME)

UPDATE

I have followed the suggested answer by kevinsky below and have learned quite a bit in the process, however I still have a problem. I still get the ORA-24247: network access denied by access control list (ACL). Because I did everything else as suggested, I am starting to think that the problem could be that first configuration file which I added, but cannot remove now because I cannot remember its name. If anyone can help me I would appreciate that very much.

RESULTS OF(I was trying out a few different things so):

select * from dba_network_acls;

Returns

*                              | 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...

Solution

  • I did this upgrade and it was hours of work. It all has to be redone differently for version 12. Every procedure call must have a commit. The general idea is that you create an access,add details, grant privileges. You must know:

    /*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;