<Insert Picture Here> Bratislava Bezpečnosť v databáze Oracle Aleš Novák Technology Sales Consultant
The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle.
Agenda Oracle a bezpečnost SQL Injection Audit
Komplexní bezpečnost Identity Management User Provisioning & správa rolí Identity and Access Governance Správa přístupů Adresářové služby Databázová bezpečnost Šifrování a maskování Kontrola privilegovaných uživatelů Více faktorová autentizace Audit, monitorování aktivit Zabezpečení konfigurací Bezpečná infrastruktura CPU, ASICs Operační systémy Virtualizace a hypervisory Ukládání dat, sítě
Oracle Database hloubková obrana Šifrování a maskování Advanced Security Secure Backup Data Masking Správa přístupů Database Vault Label Security Šifrování a maskování Správa přístupů Monitorování Správa uživatelů a rolí Monitorování Database Firewall Configuration Management Audit Vault Total Recall 5
Bezpečnost databázových aplikací Zabránit neautorizovanému přístup Znát identitu koncového uživatele Zajistit prokazatelnost operací...v prostředí vícevrstvých aplikací Střední vrstva Oracle DB
SQL Injection Útok na aplikaci kdy uživatelem vložená data jsou databází interpretována jako SQL příkaz či jeho část. Útočník může spuštěním neočekávaného dotazu získat neoprávněný přístup k datům nebo je pozměnit. Konkrétní techniky se různí, základní problém zůstává: Externí vstup (od uživatelů) je bez korektní validace zapojen do textu SQL příkazu a databází proveden Dynamické dotazy (SQL jako text) Libovolné vývojové prostředí i databáze
SQL Injection základní příklad User interface A' AND 2=1 UNION select... Aplikace sql="select email FROM employees WHERE last_name='" + vstup + "'"; stmt.execute(sql); Dotaz v databázi SELECT first_name,last_name,salary email FROM employees! WHERE last_name= XXXX last_name='a' last_name= Krch AND or and 2=1=1 dept=7 UNION - select and dept=7 to_char(salary) as email from
Obrana před SQL Injection Nespojovat vstup uživatelů do textu SQL Používat vázané proměnné Používat statické SQL v PL/SQL Kontrola a filtrování vstupů (je-li nutné sestavovat SQL dynamicky) Preventivní omezení dopadu případného útoku Minimalizovat přidělená práva pro spojení Mechanismy detailního řízení přístupu v databázi
Vázané proměnné Místo: sql = "select * from dba_users " + "where user_name='" + jmeno + "'"; stmt.execute(sql); Raději použijte: sql = "select * from dba_users " + "where user_name=?"; safestmt=conn.preparestatement(sql); safestmt.setstring(1,jmeno); safestmt.execute(); Výhody: Bezpečnost nehrozí SQL Injection Výkon nemění se text SQL použije se nacachovaný exekuční plán 10
Použití vázaných proměnných Příklad QBE - uživatel hledá záznamy podle hodnot, které zadal do 1-3 políček v aplikaci: FIRST_NAME nevyplnil LAST_NAME Krch CITY Praha Řešení 1 Dynamicky sestavit a spustit celý dotaz: SELECT * FROM employees WHERE last_name = 'Krch' and city = 'Praha' Řešení 2 Dynamicky sestavit dotaz s vázanými proměnnými: SELECT * FROM employees WHERE last_name = :1 and city = :2 Spustím dotaz a nastavím hodnoty vázaných proměnných: :1 = Krch :2 = Praha Nehrozí SQL Injection
Když nelze použít vázané proměnné... Kontrola a ošetření vstupů Omezení vstupu na povolené hodnoty Existující objekt, validní SQL jméno Kontrola uvozovek/apostrofů Pozor na Oracle identifikátory: Objekt x Objekt delete from scott.emp; může být validní název tabulky V data dictionary uvozovky nejsou Podle způsobu použití a způsobu ověření je třeba rozhodnout Konvertovat písmena na velká? Doplnit/zrušit uvozovky? Zrušit úvodní/závěrečné mezery?
DBMS_ASSERT První pomoc při kontrole vstupních dat Vrací původní/upravený text nebo Exception ENQUOTE_LITERAL - Obsahuje parametr literál? Zkontroluje, že jsou zdvojené vnitřní apostrofy, ev. Doplní apostrof na začátek a konec. abc =>'abc' 'abc'=>'abc' ab''c=>'ab''c' ab'c => Exception ENQUOTE_NAME Obsahuje parametr validní uvozovky? Zkontroluje, že jsou zdvojené vnitřní uvozovky, ev. doplní uvozovky na začátek a konec. abc =>"abc" "abc"=>"abc" ab""c=> "ab""c" ab"c => Exception SCHEMA_NAME sql_stmt := Jde 'UPDATE o existující employees schéma? SET salary = salary + :1 WHERE ' DBMS_ASSERT.ENQUOTE_NAME(v_column,FALSE) ' = :2'; SIMPLE_SQL_NAME, QUALIFIED_SQL_NAME Splňuje syntaxi jména objektu? SQL_OBJECT_NAME Jde o existující objekt?
Oracle Database Firewall První linie obrany Povolit Zaznamenat Upozornit Applications Nahradit Zablokovat Upozornění Hotové výkazy Výkazy na míru Politiky Monitoruje aktivitu uživatelů Zabraňuje neautorizovanému přístupu, SQL injections, eskalaci práv či rolí Rychlá obrana před novými typy útoků Flexibilní úroveň vynucování pravidel v SQL na základě whitelistů a blacklistů Škálovatelná architektura zajišťuje výsoký výkon ve všech režimech nasazení Zabudované i vlastní výkazy pro SOX, PCI a další
Prevence Nevěřte databázovému klientu! Kontrolní body na všech vrstvách Minimalizujte práva aktivního spojení Použijte jiné schéma pro objekty a jiné pro přístup Nepřidělujte zbytečně silná práva a role Řiďte aktivaci rolí pro spojení Secure Application Role Řiďte detailně přístup k datům přímo v databázi Střední vrstva Oracle DB 15
Zná vaše databáze koncového uživatele? <Insert Picture Here>
17 Identifikace ve třívrstvých aplikacích Connection Pool Účet aplikace A Účet aplikace A Účet aplikace A 1. Uživatelé se přihlašují ke střední vrstvě 2. Střední vrstva se připojuje (anonymně) k účtu aplikace 3. Databáze nezná skutečného uživatele nemůže řídit přístup, auditovat,...
18 Udržení identity Client Identification, Proxy Authentication Podporované při připojení přes: OCI JDBC ODP.NET Connection Pool Modrý uživatel Červený uživatel Žlutý uživatel 1. Uživatelé se přihlašují ke střední vrstvě 2. Střední vrstva předává informace o uživateli 3. Databáze řídí přístup, provádí audit,...
Snadné použití... Client Identifier Connection conn=ds.getconnection(); String[] metrics = new String[ OracleConnection.END_TO_END_STATE_INDEX_MAX]; metrics[oracleconnection.end_to_end_clientid_index] = endusername; ((OracleConnection) conn).setendtoendmetrics(metrics,(short)0);... Běžná práce se spojením metrics[oracleconnection.end_to_end_clientid_index] = null; ((OracleConnection) conn).setendtoendmetrics(metrics,(short)0); conn.close();
Snadné použití... Proxy Authentication Connection conn=ds.getconnection(); java.util.properties prop = new java.util.properties(); prop.put(oracleconnection.proxy_user_name, endusername); (OracleConnection)conn).openProxySession( OracleConnection.PROXYTYPE_USER_NAME, prop);... Běžná práce se spojením ((OracleConnection)conn).close( OracleConnection.PROXY_SESSION); conn.close();
Přínosy Prokazatelnost auditní log obsahuje jméno koncového uživatele Řízení přístupu Virtual Private Database Proxy Authentication navíc i běžné role a práva Diagnostika v$session obsahuje jméno koncového uživatele Trasování dle client_identifier... DBMS_MONITOR
Rozdíly Proxy Authentication a Client Identifier Základní funkce Client Identifier Vlastnost spojení, kterou aplikace nastavuje Proxy Authentication Aplikace vytváří novou session v rámci stávajícího procesu Seznam uživatelů Řeší aplikace DB uživatelé (nebo Enterprise Users) Ověření koncového uživatele Architektura Musí řešit aplikace Bližší běžnému sdílenému účtu Stávající uživatel DB, ev. ověření heslem Bližší Client/Server USER Technický uživatel Koncový uživatel Základní práva a role na koncového uživatele VPD, DB Vault dle koncového uživatele Ne Ano Ano Ano DBA_AUDIT_TRAIL Ano (client_id) Ano V$SESSION Ano - client_identifier Ano - username
Databázový audit SQL> ALTER SYSTEM SET audit_trail=db,extended SCOPE=SPFILE;...restart... SQL> SHOW PARAMETER AUDIT NAME TYPE VALUE ------------------------------------ ----------- ----------------------- audit_file_dest string /usr/lib/oracle/xe/app/oracle/ admin/xe/adump audit_sys_operations boolean FALSE audit_syslog_level string audit_trail string DB, EXTENDED SQL> audit select on HR.EMPLOYEES by access;... SQL> select username, client_id, sql_text from dba_audit_trail; USERNAME CLIENT_ID SQL_TEXT ------------------------- ---------------------- -------------------- HR anovak select * from employees
Závěr Bezpečnost musí být integritní součástí návrhu a vývoje aplikace SQL Injection Vyhněte se mu pomocí statických dotazů a vázaných proměnných Vstup uživatelů vkládaný do textu SQL je třeba kontrolovat Útok nemusí být přímý Zná-li databáze vaše koncové uživatele, může Zajistit audit operací Řídit přístup