oracle acl - ghdrako/doc_snipets GitHub Wiki
ACL-e w Oracle są mechanizmem bezpieczeństwa, który pozwala szczegółowo kontrolować, kto (czyli jaki użytkownik, rola lub schemat) ma dostęp do określonych zasobów lub operacji, np.:
- wywołań sieciowych (np. UTL_HTTP, UTL_SMTP, UTL_TCP),
 - zasobów w chmurze (np. Oracle Cloud),
 - i innych.
 
Użycie
Dostęp do sieci z bazy danych
Aby użytkownik PL/SQL mógł nawiązać połączenie sieciowe (np. HTTP, FTP) za pomocą np. UTL_HTTP, potrzebne jest nadanie odpowiednich uprawnień za pomocą ACL.
Oracle XML DB ACL
Wprowadzono je głównie w Oracle 11g i późniejszych. Umożliwiają one kontrolę dostępu do operacji sieciowych, takich jak:
BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl(
    acl         => 'utl_http.xml',
    description => 'ACL for UTL_HTTP',
    principal   => 'SCOTT',
    is_grant    => TRUE,
    privilege   => 'connect',
    start_date  => SYSTIMESTAMP,
    end_date    => NULL);
END;
/
A następnie przypisanie ACL-a do hosta lub zakresu IP:
BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl(
    acl  => 'utl_http.xml',
    host => 'example.com');
END;
/
Od Oracle 12c dostępne są też bardziej złożone ACL-e z kontrolą portów i protokołów.
Wysylanie maili
Wysyłania e-maili z Oracle Database, ACL (Access Control List) jest konieczny, jeśli korzystasz z pakietów takich jak:
UTL_SMTP(do niskopoziomowego wysyłania e-maili),UTL_MAIL(wyższy poziom, oparty na UTL_SMTP),- lub innych metod, które potrzebują połączenia sieciowego.
 
Ustawienie ACL do wysyłania e-maili
Załóżmy, że chcesz wysyłać e-maile przez serwer SMTP smtp.example.com, z portu 25, i użytkownik SCOTT ma mieć takie uprawnienie.
- Tworzenie ACL
 
BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl(
    acl         => 'mail_acl.xml',
    description => 'Allow SCOTT to send mail',
    principal   => 'SCOTT',
    is_grant    => TRUE,
    privilege   => 'connect',
    start_date  => NULL,
    end_date    => NULL
  );
END;
/
- Przypisanie ACL do hosta
 
BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl(
    acl  => 'mail_acl.xml',
    host => 'smtp.example.com'
  );
END;
/
Można też podać port, jeśli chcesz ograniczyć dostęp:
-- z portem:
DBMS_NETWORK_ACL_ADMIN.assign_acl(
  acl  => 'mail_acl.xml',
  host => 'smtp.example.com',
  lower_port => 25,
  upper_port => 25
);
Dodatkowe kroki
- Upewnij się, że pakiet UTL_MAIL jest zainstalowany:
 
@?/rdbms/admin/utlmail.sql
@?/rdbms/admin/prvtmail.plb
- Skonfiguruj SMTP_OUT_SERVER:
 
ALTER SYSTEM SET smtp_out_server='smtp.example.com' SCOPE=both;
Wysłanie maila testowego:
BEGIN
  UTL_MAIL.send(
    sender     => '[email protected]',
    recipients => '[email protected]',
    subject    => 'Test e-mail',
    message    => 'This is a test e-mail from Oracle DB.');
END;
/
Sprawdzenie aktualnych ACL-i
SELECT * FROM DBA_NETWORK_ACLS;
SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES;
Najczęstsze błędy związane z ACL
Jeśli nie ustawisz poprawnie ACL-i, możesz napotkać błędy typu:
ORA-24247: network access denied by access control list (ACL)
Oracle 12c
Od Oracle 12c wprowadzono rozszerzoną funkcjonalność Access Control Lists (ACL), która umożliwia precyzyjniejsze kontrolowanie dostępu do zasobów sieciowych – nie tylko na poziomie hosta, ale również z uwzględnieniem zakresów portów oraz protokołów komunikacyjnych (takich jak TCP czy UDP).
Dzięki temu administratorzy mogą:
- określić, z jakiego portu (lub zakresu portów) może korzystać dany użytkownik,
 - zdefiniować, do jakiego hosta lub adresu IP ten dostęp ma być przyznany,
 - wskazać, czy połączenie ma być realizowane przez protokół TCP, czy np. UDP (chociaż Oracle najczęściej pracuje z TCP),
 - skonfigurować różne ACL-e dla różnych aplikacji lub użytkowników w zależności od ich potrzeb i poziomu zaufania.
 
Przykład (Oracle 12c i nowsze):
BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl(
    acl         => 'smtp_acl.xml',
    description => 'Allow mail access for SCOTT',
    principal   => 'SCOTT',
    is_grant    => TRUE,
    privilege   => 'connect'
  );
  DBMS_NETWORK_ACL_ADMIN.assign_acl(
    acl         => 'smtp_acl.xml',
    host        => 'smtp.example.com',
    lower_port  => 587,
    upper_port  => 587,
    protocol    => 'tcp'
  );
END;
/
Dzięki tym rozszerzeniom możesz np. dopuścić wysyłanie maili przez port 587 (SMTP + TLS), ale jednocześnie zablokować port 25 (klasyczny, często blokowany przez providerów).