Seznamy ACL a databáze Oracle

SecurityWorld | 12.05.10

S databází Oracle 11g přišli vývojáři z Oracle s novým způsobem, jak řešit potenciální bezpečnostní problémy při práci s některými balíky. Základem řešení je Access control list.




Pokud pracujete s databázovým serverem Oracle, pravěpodobně znáte anebo jste aspoň slyšeli o balících UTL_TCP, UTL_HTTP a UTL_SMTP přes které můžete komunikovat mimo databázi. Utl_tcp umožňuje komunikaci mezi dvěma servery bez použití databázových linků. Utl_http se používá při komunikaci s web server a utl_smtp pro zasílání zpráv mezi servery. Při použití těchto balíku nepotřebujete zadávat žádná hesla a to je potencionální bezpečnostní incident, neboť můžete z jedné databáze přistupovat do druhé. Jedno z řešení se nabízí a to odejmout oprávnění execute uživateli public, ale tím pádem vývojáři přichází o možnost spouštět dané balíky.

S databází Oracle 11g přišli vývojáři z Oracle s novým způsobem, jak daný problém vyřešit. A to, že přiřadíte každému uživateli oprávnění spouštět tyto balíky, ale zároveň budete kontrolovat, jaké zdroje volají. Například balíkem utl_tcp budete moci přistupovat jen na některé IP adresy. Tento mechanismus se jmenuje Access control list, zkráceně ACL. Jestliže je tedy server na seznamu, může k němu uživatel přistoupit, v opačném případě mu to není povoleno.

Na příkladu rychle pochopíte, o čem to je. K práci s ACL se používá balík dbms_network_acl_admin a jeho metody. Pro vytvoření slouží příkaz create_acl.

SQL> begin

dbms_network_acl_admin.create_acl (

acl => 'seznam_acl.xml',

description => 'Normalni pristup',

principal => 'CONNECT',

is_grant => TRUE,

privilege => 'connect',

start_date => null,

end_date => null

);

end;

/

PL/SQL procedure successfully completed.

Tímto příkazem jste vytvořili vlastní seznam, který se jmenuje seznam_acl a je formátu XML. Daný seznam je přiřazen roli connect, ale zde může být i konkrétní uživatel.

Zkontrolujte, že je seznam opravdu vytvořený. To uděláte dotazem nad tabulkou resource_view.

SQL> select any_path from resource_view where any_path like '/sys/acls/%.xml';



ANY_PATH

-----------------------------------------------------------------...

/sys/acls/seznam_acl.xml

Seznam je vytvořený, ale nejsou v něm specifikovaná žádná oprávnění. Přidejte do seznamu nějaké oprávnění. Třeba, že se bude aplikovat na uživatel Scott a bude mít oprávnění připojit se. K tomu slouží metoda add_privilege.

SQL> begin

dbms_network_acl_admin.add_privilege (

acl => 'seznam_acl.xml',

principal => 'SCOTT',

is_grant => TRUE,

privilege => 'connect',

start_date => null,

end_date => null);

end;

/

PL/SQL procedure successfully completed.

Dobře. Teď jste přiřadili uživatele, ale musíte ještě nastavit, na které stránky bude moci přistupovat. Musíte nadefinovat hosta ke kterému povolíte přístup. K tomu slouží metoda assign_acl.

SQL> begin

dbms_network_acl_admin.assign_acl (

acl => 'seznam_acl.xml',

host => 'www.tomas-solar.com',

lower_port => 22,

upper_port => 55);

end;

/

PL/SQL procedure successfully completed.

Uživatel může přistupovat na ww stránky www.tomas-solar.com, ale pouze na porty v rozmezí 22 až 55. Jelikož http server běží na portu 80, uživatel nebude moci přistoupit ke stránkám pomocí http protokolu i když mu přiřadíte oprávnění spouštět balík utl_http.

Poznámka: Seznam aktivních ACL získáte dotazem do tabulky dba_network_acls.

select * from dba_network_acls;

Přiřaďte uživateli oprávnění execute na balík utl_http.

SQL> grant execute on utl_http to scott;

Grant succeeded.

Uživatel Scott se nemůže připojit na stránku, protože mu to ACL nedovolí.

SQL> sho user

USER is "SCOTT"

SQL> select utl_http.request('http://www.tomas-solar.com ') from dual;

select utl_http.request('http://www.tomas-solar.com ') from dual

*

ERROR at line 1:

ORA-29273: HTTP request failed

ORA-06512: at "SYS.UTL_HTTP", line 1577

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

ORA-06512: at line 1

Řešením je zvýšit rozsah dostupných portů.

SQL> begin

dbms_network_acl_admin.assign_acl (

acl => 'seznam_acl.xml',

host => 'www. tomas-solar.com ',

lower_port => 1,

upper_port => 10000);

end;

/

PL/SQL procedure successfully completed.

Když zkusíte dostupnost stránek nyní, ve by mělo být bez problémů.

SQL> sho user

USER is "SCOTT"

SQL> select utl_http.request('http://www.tomas-solar.com ') from dual;



UTL_HTTP.REQUEST('HTTP://WWW.TOMAS_SOLAR.COM')

-----------------------------------------------------------------

 

 

 

Vyzkoušeli jste si nasadit vlastní ACL a jak je vidět z příkladu, není to nic těžkého, ale efekt je veliký.

 

Tento text je úryvkem z knihy

Tomáš Solař:  Oracle Database 11g - Hotová řešení

O knize na stránkách vydavatele

Web autora

 








Komentáře