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.
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.
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.
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.
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
);
- 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;
/
SELECT * FROM DBA_NETWORK_ACLS;
SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES;
Jeśli nie ustawisz poprawnie ACL-i, możesz napotkać błędy typu:
ORA-24247: network access denied by access control list (ACL)
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.
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).