ORACLE ADVANCED SECURITY OCHRONA PRZED ESKALACJĄ UPRAWNIEŃ KLASY ENTERPRISE

Podobne dokumenty
Zarządzanie strukturą bazy danych Oracle11g

Zadania do wykonania na laboratorium

Administracja bazy danych Oracle 10g

startup pfile= '$HOME/admin/pfile/initDBx.ora'; create spfile from pfile= '$HOME/admin/pfile/initDBx.ora';

Instalacja Oracle Designera ( )

Przygotowanie bazy do wykonywania kopii bezpieczeństwa

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Oracle Label Security

<Insert Picture Here> Bezpieczeństwo danych w usługowym modelu funkcjonowania państwa

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Podstawy systemów UNIX Podstawy RMAN

Archiwizacja i odtwarzanie bazy danych

Tuning SQL Server dla serwerów WWW

SQL 4 Structured Query Lenguage

Bazy Danych i Usługi Sieciowe

PROCEDURA BACKUP & RECOVER Dokument opisuje procedurę backup u i odtwarzania dla bazy Oracle 11gR2

Sieciowa instalacja Sekafi 3 SQL

Szkolenie obejmuje zagadnienia związane z tworzeniem i zarządzaniem bazą danych Oracle, jej zasobami i dostępem do danych.

Bazy danych i usługi sieciowe

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Zarządzanie kontami użytkowników w i uprawnieniami

Zasady transformacji modelu DOZ do projektu tabel bazy danych

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

System. Instalacja bazy danych MySQL. Autor : Piotr Zielonka tel Piotrków Tryb., sierpień 2018r.

Odtwarzanie po awarii plików bazy danych

Pobieranie argumentów wiersza polecenia

Bazy danych. Plan wykładu. Rozproszona baza danych. Fragmetaryzacja. Cechy bazy rozproszonej. Replikacje (zalety) Wykład 15: Rozproszone bazy danych

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

CREATE USER

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Administracja bazy danych Oracle 10g

VinCent v.1.40 zmiany w programie

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Programowanie w językach

I - Microsoft Visual Studio C++

Paweł Cieśla. Dokumentacja projektu

Oracle Designer. Oracle Designer jest jednym z głównych komponentów pakietu Oracle Developer Suite. Oracle Designer wspiera :

Uprawnienia, role, synonimy

Memeo Instant Backup Podręcznik Szybkiego Startu

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

(c) Politechnika Poznańska, Instytut Informatyki

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Wykład 8. SQL praca z tabelami 5

Instytut Teleinformatyki

Instrukcja instalacji aplikacji PlanSoft.org

Oracle PL/SQL. Paweł Rajba.

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Tworzenie kopii zapasowej baz danych programu Lotus Connections 3.0 (oraz 3.0.1)

Podnoszenie poziomu bezpieczeństwa instalacji i baz danych Oracle

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

SQL SERVER 2016 IN MEMORY

Oracle PL/SQL. Paweł Rajba.

Wyjątki (exceptions)

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

SQL> startup pfile=./admin/pfile/initdbx.ora. SQL> create spfile from pfile='$home/admin/pfile/initdbx.ora' create user bolek identified by bolek;

Dokumentacja instalacyjna i konfiguracyjna Aplikacja ADR. Wersja dokumentu 1.0. Strona 1/9

Wykonywanie kopii bezpieczeństwa w bazie Oracle 11g

Oracle PL/SQL. Paweł Rajba.

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Ćwiczenie 4. Użytkownicy

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Block Change Tracking

Zadanie 2: Arytmetyka symboli

a) ile wynosiła populacja najbardziej i najmniej ludnego z województw (oraz jakie były ich nazwy)

Baza danych Oracle 11g Express Edition

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Bazy Danych i Systemy informacyjne Wykład 5. Piotr Syga

Przyczyny awarii. Struktury wykorzystywane do odtwarzania bd. Archiwizowanie plików dziennika. Archiwizowanie danych. danych

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

DBPLUS Data Replicator Subtitle dla Microsoft SQL Server. dbplus.tech

Bazy danych 10. SQL Widoki

SQL Server. Odtwarzanie baz danych.

Widok Connections po utworzeniu połączenia. Obszar roboczy

Wdrożenie modułu płatności eservice. dla systemu Magento

DATABASE SNAPSHOT GEEK DIVE. Cezary Ołtuszyk Blog: coltuszyk.wordpress.com

Typy tabel serwera MySQL

Część 4 życie programu

Nowe technologie baz danych

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Oracle Application Express

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Authenticated Encryption

Database Connectivity

Migracja do PostgreSQL za pomocą narzędzi Enterprise DB

SAM-Insights ADVANCED CENTRAL DATA COLLECTOR (ACDC) Dane licencyjne nie mierzone przez skanowanie. Nowy moduł ACDC o unikalnej funkcjonalności

Programowanie komputerowe. Zajęcia 1

Laboratorium 3. Odkrywanie reguł asocjacyjnych.

System Oracle podstawowe czynności administracyjne

Bezpieczeństwo systemów informatycznych

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Programowanie w Ruby

Zarządzanie wolną przestrzenią w bloku. Rozszerzenia

Ćwiczenia 2 IBM DB2 Data Studio

Transkrypt:

BEZPIECZEŃSTWO BAZ DANYCH (CZ. 2) ORACLE ADVANCED SECURITY OCHRONA PRZED ESKALACJĄ UPRAWNIEŃ KLASY ENTERPRISE W poprzednim artykule ( IT Professional 7/2015) opisane zostały techniki zabezpieczania przed eskalacją uprawnień poprzez użycie narzędzia Database Vault, za pomocą którego stworzyliśmy REALM, który nie pozwalał na dostęp do danych nawet użytkownikowi z rolą SYSDBA. W kolejnym artykule z cyklu przyglądamy się możliwościom szyfrowania całych przestrzeni tabel za pomocą opcji Oracle Advanced Security. Kamil Stawiarski O racle Database Vault jest narzędziem zapewniającym zaawansowaną ochronę wrażliwych danych aplikacji przed nieautoryzowanym działaniem osób postronnych, wynikającym z eskalacji uprawnień lub pozyskania dostępu za pomocą metod socjotechnicznych do konta bazodanowego z wysokimi uprawnieniami (np. do roli SYSDBA). Z punktu widzenia aplikacji implementacja tego mechanizmu jest w większości przypadków transparentnym rozwiązaniem, pozwalającym na budowanie chronionych obszarów (tzw. REALM), bez konieczności czasochłonnego i kosztownego modyfikowania kodu źródłowego systemu. > PODSTAWOWE CECHY DATABASE VAULT Database Vault zapewnia blokadę dostępu do wrażliwych danych poprzez interfejs bazodanowy nawet w przypadku nieuprawnionego dostępu do systemu operacyjnego. Dzięki temu ochrania on również przed skutkami potencjalnych błędów, jakie mogą zostać popełnione przez początkujących administratorów. Opisywane rozwiązanie wbudowane jest w binaria bazy danych w wersji Enterprise Edition, a jego wdrożenie jest stosunkowo proste, niezależnie od wykorzystywanej wersji bazy danych czy systemu operacyjnego. Cechą charakterystyczną mechanizmu jest fakt, że nawet użytkownik z rolą SYSDBA nie ma możliwości bezpośredniego dostępu do obiektów, chronionych REALM-em: [oracle@rico ~]$ sqlplus sys@hrdb as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Tue Aug 11 13:44:52 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0-64bit Production With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics, Oracle Database Vault and Real Application Testing options SQL> select * from hr.employees; select * from hr.employees ERROR at line 1: ORA-01031: insufficient privileges SQL> show user USER is "SYS" SQL> * Implementacja mechanizmu Database Vault automatycznie chroni nas również przed technikami eskalacji uprawnień, które zostały opisane w scenariuszu przedstawionym w jednym z poprzednich artykułów ( IT Professional 5/2015, s. 46), polegającym na użyciu mechanizmu PREPROCESSOR obiektu EXTERNAL TABLE: SQL> select * from x$_cmd; select * from x$_cmd 42

* ERROR at line 1: ORA-29913: error in executing ODCIEXTTABLEOPEN callout ORA-29400: data cartridge error KUP-04094: preprocessing cannot be performed if Database Vault is installed 4 from dba_extents e 5 where e.file_id=d.file_id 6 and e.segment_name='employees' 7* and e.owner='hr') SQL> / Jest to jednak prawdą jedynie dla użytkowników nieposiadających roli SYSDBA. Użytkownik z rolą SYSDBA nie zobaczy powyższego komunikatu i będzie mógł nawet swobodnie skompilować kawałek dowolnego kodu (napisanego np. w C++): SQL> select * from x$_cmd; TXT g++ /tmp/read_data.cpp -o /tmp/read_data > NIEAUTORYZOWANY DOSTĘP DO DANYCH Możemy łatwo zauważyć, że dalsza eskalacja uprawnień oraz pozyskanie nieautoryzowanego dostępu do zabezpieczonych danych nie są proste do realizacji, a próby nadużyć wymagają rozpoczęcia pracy już z bardzo wysokim poziomem uprawnień, zapewniającym w ten czy inny sposób możliwość wykonywania poleceń systemu operacyjnego jako użytkownik należący do odpowiednich grup autoryzacji dla binariów bazy danych Oracle. Załóżmy jednak, że atak następuje z wewnątrz przedsiębiorstwa i jeden z pracowników lub kontrahentów, mających możliwość wywołania odpowiednich poleceń OS z poziomu bądź to SSH, bądź poprzez mechanizmy bazodanowe, chce uzyskać dostęp do danych wrażliwych. Celem takiego ataku będą bezpośrednio binarne pliki danych, składające się na przestrzenie tabel, w których znajdują się faktyczne tabele. Każdy obiekt bazodanowy posiada swój unikalny identyfikator, który możemy odczytać z perspektywy DBA_OBJECTS: 1 select data_object_id 2 from dba_objects 3 where object_name='employees' 4* and owner='hr' SQL> / DATA_OBJECT_ID -------------- 91753 Możemy również sprawdzić, w jakim pliku danych, znajdującym się na systemie plików, tabela EMPLOYEES zawierająca wrażliwe dane pracowników przechowuje swoje bloki danych: 1 select file_name 2 from dba_data_files d 3 where exists (select 1 FILE_NAME /u01/app/oracle/oradata/rico/hrdb/example01.dbf Każdy plik danych jest złożony z bloków, których struktura (w uproszczeniu) składa się z nagłówka oraz faktycznych danych. Znając dokładną binarną strukturę bloku i mając podstawową wiedzę z zakresu programowania, można stworzyć kod np. w C++, który będzie w stanie dostać się bezpośrednio do bloków danych i sczytać z nich dane. Wstępna postać takiego kodu mogłaby wyglądać następująco: #include <iostream> #include <fstream> #include <cstring> using namespace std; main (int argc, char * argv[]) string filename; cout << "Enter file path: " ; cin >> filename; ifstream datafile(filename.c_str(), ios::binary); int numblocks=0; if (datafile.is_open()) int objidoffset=24; int blocksize=8192; int numofrowsoffset=54; int ktbbhictoffset=36; int objidsearch; cout << "What data_object_id: "; cin >> objidsearch; //objidsearch=91753; int i=0; while(!datafile.eof()) datafile.seekg(i*blocksize); char blocktype[1]; int blocktypei; datafile.read(blocktype,1); blocktypei=(int) blocktype[0]; if(blocktypei==6) datafile.seekg(i*blocksize+objidoffset); char objid[4]; + Wrzesień 2015 43

+ int objidi; datafile.read(objid,4); memcpy(&objidi,objid,sizeof(objidi)); if(objidi==objidsearch) char ktbbhictcount[1]; int ktbbhictcounti; datafile.seekg(i*blocksize+ktbbhictoffset); datafile.read(ktbbhictcount,1); ktbbhictcounti=(int) ktbbhictcount[0]; char numofrows[1]; int numofrowsi; datafile.seekg(i*blocksize+numofrowsoffset+24*ktbbhictcounti); datafile.read(numofrows,1); numofrowsi=(int) numofrows[0]; if (numofrowsi>0) i++; numblocks++; cout << "Block number: " << i << " \ num of rows: " << numofrowsi << endl; datafile.close(); cout << numblocks << " blocks found " << endl; Powyższy kod skanuje wskazany plik danych pod kątem bloków zawierających wiersze obiektu o wskazanym DATA_ OBJECT_ID: [oracle@rico ~]$./read_data Enter file path: /u01/app/oracle/oradata/rico/hrdb/example01.dbf What data_object_id: 91753 Block number: 206 num of rows: 98 Block number: 207 num of rows: 9 2 blocks found Nietrudno więc wyobrazić sobie rozszerzenie funkcjonalności kodu, które pozwoli na podejrzenie danych w tabeli. Wystarczy uzbroić się w wiedzę z zakresu dokładnej budowy bloku Oracle, spędzić trochę czasu na analizie binarnej zawartości bloku i odkryć metodę lokalizacji offsetów poszczególnych wierszy, binarnej budowy wiersza oraz algorytmów składowania poszczególnych typów danych. Z wiadomych przyczyn nie opublikujemy całego kodu, który na to pozwala program taki byłby bronią obosieczną, gdyż z jednej strony pozwalałby na odzyskanie danych z uszkodzonych plików, ale z drugiej byłby narzędziem pozyskiwania danych z bazy bez pozostawiania śladów w narzędziach audytowych oraz z pominięciem mechanizmów takich jak Oracle Database Vault. Jaki jest więc sposób na zabezpieczenie się przed odczytem danych bezpośrednio z pliku? Naturalnie jest to szyfrowanie plików danych. > OCHRONA ORACLE ADVANCED SECURITY Możliwość zaszyfrowania całych przestrzeni tabel pojawiła się wraz z opcją Oracle Advanced Security, którą można dokupić do bazy Enterprise Edition. Opis całego pakietu można znaleźć w dokumentacji Oracle dostępnej na stronie tinyurl.com/oas-doku. W przykładowym algorytmie skupimy się na funkcjonalności TDE (Transparent Data Encryption), a konkretnie na tablespace encryption. Ogólna zasada szyfrowania przestrzeni tabel jest prosta na poziomie bazy danych generujemy tak zwany Master, który służy do szyfrowania i deszyfrowania kluczy TDE Tablespace wykorzystywanych do szyfrowania i deszyfrowania danych w bloku należącym do tej przestrzeni tabel (patrz schemat obok). STWORZENIE PORTFELA Pierwszym krokiem dla wygenerowania zaszyfrowanej przestrzeni tabel jest stworzenie pliku, w którym będzie przechowywany Master. W pierwszym kroku musimy zdefiniować ścieżkę do pliku wallet w pliku sqlnet.ora znajdującym się w lokalizacji $ORACLE_HOME/network/admin: Z poziomu użytkownika HR możemy łatwo sprawdzić, że informacja jest prawidłowa: SQL> conn hr/hr@hrdb Connected. SQL> select dbms_rowid.rowid_block_number(rowid), count(1) 2 from employees 3 group by dbms_rowid.rowid_block_number(rowid); [root@rico ~]# mkdir -p /etc/oracle/wallet/rico [root@rico ~]# chown -R oracle:oinstall /etc/oracle/ [root@rico ~]# su - oracle [oracle@rico ~]$ cd $ORACLE_HOME/network/admin [oracle@rico admin]$ vim sqlnet.ora [oracle@rico admin]$ cat sqlnet.ora # sqlnet.ora Network Configuration File: \ /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora # Generated by Oracle configuration tools. DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) COUNT(1) ------------------------------------ ---------- NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 207 9 206 98 ENCRYPTION_WALLET_LOCATION= 44

OGÓLNA ZASADA SZYFROWANIA PRZESTRZENI TABEL SQL> show user USER is "SYS" SQL> administer key management set keystore open identified by ZyrafyWchodzaDoSzafy; Oracle Database Encrypt/ Decrypt TDE Tablespace Po wykonaniu tej operacji wallet zostanie stworzony we wskazanej lokalizacji oraz otworzony przez instancję. SQL>!ls /etc/oracle/wallet/rico TDE Master Encrypted Data Files Tablespace ewallet.p12 SQL> desc V$ENCRYPTION_WALLET Name Null? Type External Security Module (software/hardware keystore) Encrypt/ Decrypt TDE Tablespace ----------------------------------------- -------- ----------------------- WRL_TYPE VARCHAR2(20) VARCHAR2(4000) Encrypted Data Files Tablespace WALLET_TYPE WALLET_ORDER FULLY_BACKED_UP CON_ID VARCHAR2(30) VARCHAR2(20) VARCHAR2(9) VARCHAR2(9) NUMBER (SOURCE= (METHOD=FILE) SQL> select, status from V$ENCRYPTION_WALLET; (METHOD_DATA= (DIRECTORY=/etc/oracle/wallet/rico))) Następnie tworzymy plik odpowiedzialny za przechowywanie kluczy, czyli tzw. wallet: SQL> administer key management create keystore '/etc/oracle/wallet/rico' \ identified by ZyrafyWchodzaDoSzafy; ------------------------------ /etc/oracle/wallet/rico/ OPEN_NO_MASTER_KEY Plik wallet nie zawiera jeszcze żadnego klucza, na co wskazuje status OPEN_NO_MASTER_KEY. REKLAMA + Wrzesień 2015 45

+ Następnym krokiem jest więc stworzenie klucza typu MASTER: SQL> administer key management set key identified by "ZyrafyWchodzaDoSzafy" with backup; SQL> select, status from V$ENCRYPTION_WALLET; ------------------------------ /etc/oracle/wallet/rico/ OPEN ORACLE ADVANCED SECURITY A REKOMENDACJA D W 2013 roku Komisja Nadzoru Finansowego stworzyła dokument o nazwie Rekomendacja D, który dotyczył zarządzania obszarami technologii informacyjnej i bezpieczeństwa środowiska teleinformatycznego w bankach. Dokument ten składa się z 22 rekomendacji produkt Oracle Advanced Security pokrywa następujące obszary: 9.13 ochrona poufności informacji przekazywanej, 9.14 ochrona wycofywanych komponentów, 10.6 szyfrowanie poufnych danych, 15.19 zabezpieczenie kopii awaryjnych. ZASZYFROWANIE PRZESTRZENI TABEL Po wykonaniu powyższych operacji jesteśmy gotowi do stworzenia zaszyfrowanej przestrzeni tabel, do której można będzie przenieść tabele zawierające wrażliwe dane. Do wyboru mamy następujące algorytmy szyfrowania: 3DES168 AES128 AES192 AES256 Stworzenie zaszyfrowanej przestrzeni tabel jest bardzo proste: SQL> create tablespace secure_data 2 datafile '/u01/app/oracle/oradata/rico/hrdb/secure_data01.dbf' 3 size 128m 4 autoextend on next 64m 5 maxsize 1g 6 encryption using 'AES256' 7 default storage (encrypt); plików. Próba dostania się do bloku danych skończy się oglądaniem kalejdoskopu nic nieznaczących bajtów. Bez pliku wallet otworzonego przez bazę danych pliki przestrzeni tabel jako takie są bezużyteczne. Należy jednak pamiętać o pewnej cesze blok danych jest deszyfrowany w momencie wykonywania operacji odczytu przez bazę danych i jeśli zostanie zbuforowany w buffer cache, znajduje się tam już w postaci jawnej. Jeśli nasza baza danych działa w systemie operacyjnym Linux i mamy uruchomiony mechanizm AMM (Automatic Memory Management), zawartość pamięci współdzielonej (SGA) jest reprezentowana przez pliki na urządzeniu /dev/shm. W takim przypadku znowu pojawia się możliwość przechwycenia wrażliwych danych z poziomu systemu operacyjnego poprzez lokalizację odpowiednich plików pamięci i skanowanie ich wspomnianym już narzędziem napisanym w C++: [oracle@rico shm]$ ls ora_rico_346* awk 'system("strings " $0 " grep && echo " $0)' Tablespace created. Bloki wszystkich obiektów znajdujących się w tej przestrzeni tabel zostaną zaszyfrowane, a ich odczytanie będzie możliwe tylko i wyłącznie wtedy, gdy wallet będzie otworzony w przeciwnym wypadku otrzymamy komunikat: ORA-28365: wallet is not open Oczywiście utrata pliku wallet nie będzie należeć do najszczęśliwszych chwil w życiu administratora bazy danych Oracle. Dlatego zdecydowanie należy uwzględnić lokalizację tego pliku w polityce backupu. UWAGA NA AMM Obiekty znajdujące się w zaszyfrowanej przestrzeni tabel nie będą mogły być już celem ataków z poziomu systemu ora_rico_346619910_62 ora_rico_346619910_68 [oracle@rico shm]$ ~/read_data Enter file path: /dev/shm/ora_rico_346619910_62 What data_object_id: 92723 Block 877: 9 rows (3 ITL slots) Block 878: 98 rows (3 ITL slots) 2 blocks found Z tego też powodu sugerujemy rezygnację z AMM na rzecz ASMM, jeśli chcemy mieć pewność zabezpieczenia przed tego typu nadużyciem z poziomu systemu operacyjnego. Autor jest posiadaczem tytułu Oracle Certified Master, zaproszonym do programu Oracle ACE. 46