How to create ACL in Oracle

ওরাকল ডাটাবেজে অনেক গুল PL/SQL API আছে যার সাহায্যে আমরা বাইরের নেটওয়ার্কে এক্সেস করি, যেমন UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, APEX_MAIL etc. আগের ভার্সন গুলোতে  নেটওয়ার্ক এক্সেস নিয়ন্ত্রণ করা হত স্পেসিফিক প্যাকেজ granted or not. কিন্তু Oracle 11g এর পর থেকে এটি Access Control List (ACL) এর সাহায্যে নিয়ন্ত্রণ করা হয়।

ওয়েব সার্ভিস বা API নিয়ে কাজ করেছেন কিন্তু ORA-24247: network access denied by access control list (ACL) এই error দেখেননি এরকম লোক খুঁজে পাওয়া দুষ্কর। মূলত আপনি যখন এমন নেটওয়ার্কে এক্সেস করতে চাচ্ছেন যেটা আপনার ACL-এ করা add নাই, তখন এই এররটা দেখাই।

Create ACL:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl          => 'test_acl_file.xml', 
    description  => 'A test of the ACL functionality',
    principal    => 'HR', -- selected user name
    is_grant     => TRUE, 
    privilege    => 'connect',
    start_date   => SYSTIMESTAMP,
    end_date     => NULL);
END;

Add network to ACL: এসিএল ক্রিয়েট করা হলে এখন আপনার প্রয়োজনীয় নেটওয়ার্ক এতে এসাইন করতে হবে। এর জন্য assign_acl ব্যাবহার করা হয়।

BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl         => 'test_acl_file.xml',
    host        => '192.168.2.3', 
    lower_port  => 80,
    upper_port  => NULL); 

--you can use wildcard to specify host
  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl         => 'test_acl_file.xml',
    host        => '10.1.10.*', 
    lower_port  => NULL,
    upper_port  => NULL);
END;

Remove network from ACL: কোন নেটওয়ার্ক এসিএল থেকে রিমুভ করতে unassign_acl ব্যাবহার করা হয়।

BEGIN
  DBMS_NETWORK_ACL_ADMIN.unassign_acl (
    acl         => 'test_acl_file.xml',
    host        => '192.168.2.3', 
    lower_port  => 80,
    upper_port  => NULL); 
END;

Grant access to another user: তৈরিকৃত এসিএল অনেক সময় অন্য ডাটাবেজ ইউজারকে এক্সেস দিতে হতে পারে যাতে ওই নেটওয়ার্ক-এ এক্সেস করতে পারে। এর জন্য add_privilege ব্যাবহার করা হয়।

BEGIN
  DBMS_NETWORK_ACL_ADMIN.add_privilege ( 
    acl         => 'test_acl_file.xml', 
    principal   => 'TEST2',
    is_grant    => FALSE, 
    privilege   => 'connect', 
    position    => NULL, 
    start_date  => NULL,
    end_date    => NULL);
END;

Remove access from user: ইউজার থেকে এক্সেস ফিরিয়ে নিতে delete_privilege ব্যাবহার করা হয়।

BEGIN
  DBMS_NETWORK_ACL_ADMIN.delete_privilege ( 
    acl         => 'test_acl_file.xml', 
    principal   => 'TEST2',
    is_grant    => FALSE, 
    privilege   => 'connect');
END;

Drop ACL: এসিএল মুছে ফেলার জন্য drop_acl ব্যাবহার করা হয়।

BEGIN
  DBMS_NETWORK_ACL_ADMIN.drop_acl ( 
    acl         => 'test_acl_file.xml');
END;

View ACL: এসিএল এর সেটিংস সম্পর্কিত সমস্ত ডাটা DBA_NETWORK_ACLS, DBA_NETWORK_ACL_PRIVILEGES এবং USER_NETWORK_ACL_PRIVILEGES ভিউ থেকে পাওয়া যাবে।

Update: Oracle 12c এর পর থেকে ACL তৈরি করার নিয়মে কিছুটা পরিবর্তন করেছে। নিচের উদাহরণটি লক্ষ্য করুন –

BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'APEX_200100',
principal_type => xs_acl.ptype_db));
END;
/

উপরের উদাহরণে APEX_200100 ইউজারকে যেকোনো হোস্ট-এ কানেক্ট করার পারমিশন দেওয়া হয়েছে।

Published by

Ali Asgor

Graduate in GES, OCP holder, Self-motivated app developer, Programming lover, Lazy person...

3 thoughts on “How to create ACL in Oracle”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.