Sanftes Härten

Werbung
Sanftes Härten
Inhalt
¡  Einführung
¡  Beispiele
¡  Zusammenfassung
Einführung
Das Härten von Datenbanken ist sehr einfach.
Sie müssen nur ein paar wenige schwache Passworte
ändern, Public Privilegien entfernen, Einstellungen
ändern, Password Alterung einführen, Password
Verfication Functions verwenden, ….
… und schon laufen einige oder viele Ihrer
existierenden Datenbank nicht mehr….
Was sind die Ursachen?
Ursachen!
Anwendungen werden in der Regel ohne Kenntnis
von (speziellen) Härtungsmaßnahmen erstellt und
getestet.
Seiteneffekte können ohne genauere Analyse nicht
vorhergesagt werden.
Auditoren „übertreiben“ oft, z.B. alle ALL_% views von
PUBLIC entfernen (ALL_USERS, ALL_TABLES,
ALL_SOURCE, …)
Beispiel 1a
Oracle Password Verification Function:
Bei einem schwachen Password (z.B.
Password='ORACLE') liefert z.B. Oracle Beispielfunktion
die Fehlermeldung ORA-20006.
Beispiel 1b
Woher soll eine 3rd-party Anwendung die nicht standardisierten
Fehlercodes
¡ 
ORA-20001
¡ 
ORA-20002
¡ 
ORA-20003
¡ 
ORA-20004
¡ 
ORA-20005
¡ 
ORA-20006
¡ 
ORA-20007
¡ 
ORA-20008
¡ 
ORA-20009
¡ 
ORA-20011
kennen.
Beispiel 1c
Was soll die Anwendung machen, wenn vom Benutzer
ein schwaches Passwort eingegeben wurde?
Woher soll der Anwender wissen, dass das Passwort
abgelehnt wurde, wenn die Anwendung keine
Rückmeldung liefert?
Beispiel 2a
Der größte Teil der Oracle Datenbanken enthält (zumindest
einige) schwache Passworte (Default, PW=Username, InitialPassworte, Firmenspezifisch, Wörterbuch).
Diese schwachen Passworte sind mit Hilfe von Tools (bzw. z.T.
mit Skripten) sehr leicht zu finden. Die Korrektur dauert oft
Jahre, da niemand genau weiß, wer und wo diese
Passworte verwendet werden.
Einfaches Ändern führt nahezu garantiert zu Problemen mit
Anwendungen oder Benutzern.
Neue vs. Altsysteme
Die meisten Härtungsmaßnahmen (Privilegien
entfernen, Passworte, Profile, ...) sind nur bei neuen
Systemen „relativ“ einfach einzusetzen,
Für Altsysteme sind diese wegen schwer
vorhersagbarer Seiteneffekte oft nicht einsetzbar.
Um dieses Risiko für Altsysteme zu minimieren, sind
andere Ansätze (Mitigation/Linderung) sinnvoll.
Sanftes Härten
Folgende Grundsätze gibt
es beim sanften Härten
¡  Es sollte die bestmöglichste Lösung verwendet
werden, die ohne (große) Probleme einsetzbar ist
¡  1. Korrektur des Problems (Fix)
¡  2. Linderung (Mitigation)
¡  3. Monitoren/Auditing des Problems
¡  Oftmals gibt es 3rd-Party-Lösungen, die das
Problem lindern können (z.B. McAfee Database
Activity Monitoring)
Beispiel - Oracle Version
Beste Lösung:
Supportete Version (11.2.0.3) + Letzter Patch (Okt. 2012)
• 
Schlechteste Lösung:
Unsupportete Oracle Version
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
• 
• 
Ein Patchset korrigiert viele (+zukünftige) Sicherheitsfehler (z.B.
Authentication Problem/Stealth PW Cracking), ohne dass dies von
Oracle so beschrieben wurde.
McAfee Virtual Patching erlaubt den Schutz von Datenbanken ohne
Downtime (und bei alten Versionen)
Individuelle Workarounds (z.B. SQLNET.ALLOWED_LOGON_ VERSION)
können das Risiko minimieren
Beispiel - Oracle Version
Beispiel – Password Verification
Oracle APEX:
Bei der Installation von APEX generiert Oracle ein zufälliges Passwort.
Dieses ist aber in der Regel nicht komplex nicht.
Wenn eine Passwort Verification Function existiert, klappt die Anlage des
Benutzers nicht, und die Objekte von APEX werden in das SYS Schema
installiert.
• 
Empfehlung:
• 
• 
• 
Verschiedene Profile für verschiedene Oracle Gruppen (ORACLE,
DBA, TECHNICAL, ENDUSER)
Das Default-Profile sollten KEINE PW Verify Funktion verwenden, und
ein Passwort Alter von 1 Tag haben.
Beispiel – Password Verification
Beste Lösung:
Password Verification Function mit der Implementierung der Firmen/
Organisationsrichtlinie
• 
Schlechteste Lösung:
Keine Password Verification Function
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
• 
• 
Anstatt die eigene PW Verification Function zu verwenden wie die
Beispiel-Oracle-Funktion verwendet.
Anstatt schwache Passworte ablzulehnen, werden diese
mitdokumentiert. Ein Report gibt dann aus, wer gegen welche
Passwort Regel verstößt (zu kurz, zu wenig komplex, ...)
Viele Passworf Richtlinien sind nicht implementierbar.
Beispiel – Password Verification
• 
Andere Lösung:
DDL Trigger kann die Länge des Passwortes feststellen, indem die
Anzahl der * gezählt wird.
Beispiel – Password Verification Function
Beispiel – Public Privileges
• 
• 
• 
Gefährlichen Packages werden bei Angriffen oft als Hilfsfunktion
verwendet (z.B. utl_http, dbms_sql, ...).
Das Einschränken von Public-Privilegien reduziert das Risiko eines
erfolgreichen Angriffes.
Viele Anwendungen verwenden diese Packages jedoch, um
spezielle Funktionalitäten abzubilden (z.b. Börsenkurse abholen,
Emails versenden)
• 
Das Entfernen von Public Privilegien führt oft zu ungültigen
Packages (vorher DBA_DEPENDENCIES kontrollieren)
Beispiel – Public Privileges
Gefährliche Packages die an PUBLIC gegranted sind:
• 
• 
DBMS_ADVISOR
• 
DBMS_SQL
• 
DBMS_CRYPTO
• 
DBMS_XMLGEN
• 
DBMS_JAVA
• 
DBMS_XMLQUERY
• 
UTL_FILE
• 
UTL_INADDR
• 
UTL_TCP
• 
UTL_MAIL
• 
UTL_SMTP
• 
UTL_DBWS
• 
UTL_ORAMTS
• 
DBMS_JAVA_TEST
• 
DBMS_JOB
• 
DBMS_LDAP
• 
DBMS_LOB
• 
DBMS_OBFUSCATION_T
OOLKIT
• 
DBMS_RANDOM
• 
UTL_HTTP
• 
DBMS_SCHEDULER
• 
HTTPURITYPE
Beispiel – Public Privileges
Beste Lösung:
Alle gefährlichen Packages von Public entziehen und nach Patches kontrollieren,
ob diese noch entzogen sind (Oracle granted vor dem Patchen einige dieser
Packages wieder an Public)
• 
Schlechteste Lösung:
Nichts machen...
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
• 
• 
• 
3rd-party-Lösungen, können bei der ungewöhnlichen Verwendung von
Packages den zuständigen Mitarbeiter alarmieren
Audit Execute von gefährlichen Packages.
Schützen der Packages (ACLs für Netzwerk, Directory Objekte für dbms_lob/
utl_file)
Analyse der View gv$db_object_cache, zeigt Packages an, die gefährlich sind
Beispiel – Public Privileges
Beispiel – Schwache Passworte
Die meisten Datenbanken haben Kennungen mit schwachen
Passworten
• 
• 
Default-Passwort (OUTLN/OUTLN, PERFSTAT/PERFSTAT)
• 
Passwort=Benutzername
• 
Passwort=Permutation des Benutzernamens (ORACLE/ELCARO
• 
Initial-Passwort (WEBER/START123, SCHMIDT/WELCOME1)
• 
Firmenbegriffe (Produktname, Markenname, ...)
• 
Worte aus einem Wörterbuch (z.B. Schauspieler, Länder, Autos, ...)
• 
Zu kurze Passworte (<10 Zeichen)
Beispiel – Schwache Passworte
Für die unterschiedlichen Gruppen gibt es unterschiedliche
Lösungsansätze
• 
Oracle-Kennungen (OUTLN, DBSNMP, PERFSTAT, SCOTT, ...)
• 
• 
Demo-Benutzer löschen
• 
Nicht benötigte Oracle-Kennungen sperren (z.B. Outln, Perfstat)
Endbenutzer (ADMWEBER, SCHMIDT AKURZ1, ...)
• 
• 
Expiration der End-Anwender Kennungen mit schwachen
Passworten
Technische Benutzer (GRIPS, MYAPP, WEBUSER, ...)
• 
• 
Analysieren welcher technische Benutzer von welchen System/
Programmen verwendet wird. Ändern oder falls nicht möglich mit
Logon-Trigger/Überwachung schützen
Beispiel – Schwache Passworte
Anzeige, welche Programme mit welcher Kennung von welcher
Maschine verwendet werden:
------select
program, username, machine, count(*) as cnt
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
-------
Beispiel – Schwache Passworte
Beste Lösung:
Starke Passworte verwenden und regelmäßig ändern
• 
Schlechteste Lösung:
Aus Angst vor Problemen nichts machen
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
• 
• 
• 
Logon-Trigger, der nur Zugriffe von bestimmten IPs/Programmen
zulässt und alles andere blockt
Logon-Trigger, der nur Zugriffe von bestimmten IPs/Programmen
zulässt und ansonsten eine Nachricht verschickt (SIEM, SMS, Email, ...)
McAfee Virtual Patching erlaubt den Schutz eines Logon-Triggers,
ohne die Datenbank zu verändern
Alle Create Sessions mitauditieren
Beispiel – Weak Passwords
Beispiel – .bash_history
• 
• 
• 
Die .bash_history-Datei enthält oft Klartext-Passworte (z.B. sqlplus,
exp, ...) und Hinweise, welche Programme vom DBA verwendet
wurden.
Diese Datei gehört dem Oracle-Benutzer und kann mit Hilfe von
Funktionen wie dbms_lob, utl_file, Java, externen Tabellen, ...
gelesen werden.
Ein häufiger Angriffspunkt, um auf andere Systeme
„weiterzuspringen“, da Passworte meistens über alle Datenbanken
identisch sind.
Beispiel – .bash_history
Beste Lösung:
Keine .bash_history (und andere History-Dateien) zulassen
• 
Schlechteste Lösung:
Keine Änderung
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
.bash_history mittels eines Jobs regelmäßig bereinigen
• 
.bash_history nur für eine Session gültig lassen (darf nicht
zurückgeschrieben werden)
Beispiel – .bash_history
Beispiel – Unsicherer PL/SQL Code
• 
• 
• 
Kleinere Probleme (< 20 Findings) lassen sich meistens recht einfach
vom entsprechenden Entwickler beheben (sofern dieser noch
„greifbar“ ist)
Größere oder große Fehlermengen (z.B. 1000+) erfordern eine
strategischeres Vorgehen. So können die Fehler z.B. gewichtet und
gemäß des Gewichtes der Lücke abgearbeitet werden.
Ist eine Korrektur nicht zeitnah möglich, sollte man sich über
Workaround bzw. Monitoring/Auditing bzw. 3rd-party-Lösungen
Gedanken machen
33
Exploiting / Formula
Objecttype
OwnerPrivs
Retcode
Authid
Function/
Pack.Func
100
SYSDBA 10
Bool 0.1
Definer 1
Public
Procedure
10
DBA
Out
0.2
Invoker 0
Role
2
Else
1
User
1.5
Trigger
5
9
Resource 5
Nothing
3
Grants
5
Nothing 1
Formula:
Exploitability := objecttype * ownerPrivs * retcode * authid * grants
Sample: SYS has a vulnerable function granted to public which returns an integer
Exploitability := 100 * 10 * 1 * 1 * 5 = 5000
Sample: SYS has a vulnerable function with invokers rights granted to public which returns an integer
Exploitability := 100 * 10 * 1 * 0 * 5 = 0
Beispiel – Unsicherer PL/SQL Code
Beste Lösung:
Nur sicheren PL/SQL Code zulassen
• 
Schlechteste Lösung:
Keine Absicherung des PL/SQL-Codes
• 
Auch hier gibt es verschiedene Möglichkeiten:
• 
• 
• 
• 
Nur den kritischsten Code (Owner hat DBA-Rechte, Funktion an
Public gegranted).
McAfee Database Activity Monitoring erlaubt die Erkennung von
typischen SQL Injection Angriffen (Privilegieneskalation)
Entfernen von typischen SQL Injection Hilfsfunktionen wie
dbms_sql oder dbms_xmlquery
Beispiel dbms_xmlquery
http://soonerorlater.hu/index.khtml?article_id=517
Beispiel – unsecure PL/SQL Code
Beispiel – ALTER USER
• 
• 
• 
Viele Anwendungen fordern zu viele Privilegien.
Oftmals wird, wenn wegen des Benutzermanagements Passworte
zu ändern sind, DBA-Rechte verlangt.
Dabei werden eigentlich nur ALTER USER (und vielleicht CREATE/
DROP USER) benötigt.
• 
Diese Kennungen können jedoch auch die Passworte von SystemKennungen wie SYS/SYSTEM ändern.
Beispiel – ALTER USER
Beste Lösung:
Selbst geschriebene Prozedur, die nur Änderungen an bestimmten
Kennungen zulässt.
• 
Schlechteste Lösung:
grant DBA to username
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
Ein Before-DDL-Trigger, der das Event „ALTER USER“ überwacht
und nur Änderungen an bestimmten Benutzern (z.B. nicht SYSTEM)
zulässt (Achtung!!! „Grant connect to scott identified by
pwd“ nicht vergessen).
• 
Die Zugriffe können überwacht werden(intern/3rd-party)
Beispiel – User braucht ALTER USER
Beispiel – TNS Listener
• 
• 
• 
TNS Poisoning ist aktuell das schwerwiegenste Problem, das in
Oracle Datenbanken existiert.
Ein Angreifer ohne Authentifizierung kann beliebige Datenbanken
(seit Oracle 9) übernehmen, eigene Befehle absetzen, ...)
Seit Anfang Oktober gibt es entsprechende Metasploit/
Meterpreter-Module, die lediglich die Eingabe von IP/Port und SID
erwarten.
• 
Danach kann man alles mit der Datenbank machen (OS Befehle
ausführen, Alle Oracle-Passworte im Klartext mitprotokollieren, ...)
Beispiel – TNS Listener
Beste Lösung:
Verwendung von Listener IP Restriction und Implementierung der
Oracle Workaround (DocID: ID 1453883.1 )
• 
Schlechteste Lösung:
Nichts tun
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
Dynamic Registration deaktivieren
• 
IP Restriction verwenden
• 
Monitoring des Events „Register Listener“ im Listener.log
• 
Monitoring von „Remote Listenern“ mittlels lsnrctl status
Beispiel – TNS Listener
Design-Vorgabe
• 
System muss in der Lage sein, Angriffe von außen zu
erkennen
• 
System muss darauf entsprechend reagieren können
• 
Mechanismus muss schnell (im Fehlerfall) deaktiviert
werden können
Beispiel – Execute OS via Java
Beste Lösung:
Kein Java verwenden, da die von Java gestarteten Prozesse im
Oracle Kontext ausgeführt werden. Stattdessen dbms_scheduler
verwenden (läuft als Benutzer nobody anstatt Oracle)
• 
Schlechteste Lösung:
JAVASYSPRIV an den Benutzer granten
• 
Dazwischen gibt es einige Abstufungen:
• 
• 
Anstatt dem Benutzer zu erlauben, beliebige Befehle auszuführen,
kann dies in Java feingranular verteilt werden.
• 
Die Zugriffe können überwacht werden(intern/3rd-party)
Beispiel – Execute OS via Java
Zusammenfassung
• 
• 
• 
• 
• 
In fast allen Fällen existieren unterschiedliche
Möglichkeiten, die Datenbank zu härten.
Die beste Möglichkeit ist oftmals nicht einsetzbar.
Oracle biete viele Möglichkeiten (VPD, Trigger,
Auditing, ...), die für eine Linderung sorgen
3rd-party-Produkte erlauben es oft, Probleme
schneller/einfacher als mit Bordmitteln zu lösen
Wenn eine Lösung nicht möglich ist, kann man
immer noch den Zugriff überwachen
Fragen & Antworten?
Danke
¡  Kontakt:
Red-Database-Security GmbH
Bliesstr. 16
D-.66538 Neunkirchen
Germany
Herunterladen