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