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.

  1. 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;
/
  1. 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).

⚠️ **GitHub.com Fallback** ⚠️