Bezpečnosť v databáze Oracle
Transkript
Bezpečnosť v databáze Oracle
<Insert Picture Here> Bezpečnosť v databáze Oracle Aleš Novák Technology Sales Consultant Bratislava 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 • • • • 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ě Identity Management Oracle Database hloubková obrana Šifrování a maskování • Advanced Security • Secure Backup • Data Masking Správa přístupů • Database Vault • Label Security Monitorování Šifrování a maskování Správa přístupů • Database Firewall • Configuration Management Monitorování • Audit Vault Správa uživatelů a rolí • 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' ANDor 2=1 1=1 UNION –-′ select and dept=7 last_name=′Krch′ 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 • LAST_NAME • CITY nevyplnil Krch 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 •sql_stmt SCHEMA_NAME := • Jde o existující schéma? SET salary = salary + :1 WHERE ' 'UPDATE employees • SIMPLE_SQL_NAME, QUALIFIED_SQL_NAME || DBMS_ASSERT.ENQUOTE_NAME(v_column,FALSE) || 'syntaxi = :2'; • Splňuje jména objektu? • SQL_OBJECT_NAME • Jde o existující objekt? Oracle Database Firewall První linie obrany Povolit Zaznamenat Upozornit Nahradit Applications 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 <Insert Picture Here> Zná vaše databáze koncového uživatele? 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,... 17 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, ... 18 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 Client Identifier Proxy Authentication Vlastnost spojení, kterou aplikace nastavuje Aplikace vytváří novou session v rámci stávajícího procesu Řeší aplikace DB uživatelé (nebo Enterprise Users) Musí řešit aplikace Stávající uživatel DB, ev. ověření heslem Bližší běžnému sdílenému účtu Bližší Client/Server Technický uživatel Koncový uživatel Základní práva a role na koncového uživatele Ne Ano VPD, DB Vault dle koncového uživatele Ano Ano DBA_AUDIT_TRAIL Ano (client_id) Ano Ano - client_identifier Ano - username Základní funkce Seznam uživatelů Ověření koncového uživatele Architektura USER V$SESSION 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 audit_syslog_level string audit_trail string FALSE 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