APEX Application Archive (Teil 2) – Anwendungen wiederherstellen

Im zweiten Teil der Beitragsreihe zur “APEX Application Archive” -Anwendung, geht es um das Wiederherstellen und das Herunterladen der archivierten APEX Anwendungen.

Im ersten Teil der Reihe habe ich Ihnen gezeigt, wie Sie eine oder mehrere Anwendungen mit Hilfe des “APEX Application Archive” in einem Archive sichern können. Die Anwendungen speichert der “APEX Application Archiver” in der Tabelle APEX$ARCHIVE_CONTENTS in einem BLOB.

Um nun eine oder mehrere Anwendungen, die Sie so gesichert haben, wiederherzustellen,  können Sie auf zweierlei Arten vorgehen.

Für beide Varianten ist der Ausgangspunkt der Menüeintrag “Archived Content”. Über diesen gelangen Sie zu einem Interaktiven Grid, welches alle archivierten Applikationen auflistet.

Abbildung 8: Anwendungsarchiv auswählen

Hier können Sie über das Setzen entsprechender Filter die benötigte Version der Anwendung auswählen.

APEX-Anwendung wiederherstellen

Als erste Möglichkeit können Sie eine archivierte Anwendung direkt aus einem Archiv heraus recovern. Dazu sind aber einige Schritte notwendig.

Suchen Sie in der Tabelle “Archived Content” die wiederherzustellen dies  Anwendung. Klicken  Sie auf den  Button “Restore”, so wird Ihnen auf der nächsten Seite des Wizzards eine Zusammenfassung der gewählten Anwendungen präsentiert.

Abbildung 9: Restore Content

Wie in Abbildung 9 dargestellt, starten Sie die Extraktion über “Restore Content”.

Jetzt wird die Exportdatei aus dem Archiv geladen und direkt in Ihrem Workspace in das sogenannte “Export Repository” importiert.

Anschließend bekommen Sie eine Checkliste angezeigt, die Ihnen die nächsten Schritte zur Installation der Anwendung erklärt.

Abbildung 10: Checkliste Installation der Anwendung

Wechseln Sie nun in die APEX-Entwicklungsumgebung und dort in den “Application Builder” des zugehörigen Workspaces. Klicken Sie auf “Utilities”.

Abbildung 11: Export Repository

Wie in Abbildung 11 dargestellt geht es weiter über den Link Export.

Abbildung 12: APEX-Anwendung installieren

Danach betätigen Sie den Link “Export Repository”.

Abbildung 13:Export Repository

Nun öffnet Sie das Export Repository. In dieser Tabelle sehen Sie die zuvor extrahieren Version Ihrer Anwendung(en). Über den Link “Install” starten Sie den Anwendungs Import-Assistenten.

Dieser stellt Ihnen verschiedene Möglichkeiten zur Verfügung. So können Sie die Anwendung parallel zu der aktuellen Anwendung installieren. Der eigentliche Ablauf ist im Abschnitt “Install Database Application” beschrieben.

APEX-Anwendung herunterladen

Bei der zweiten Variante können Sie einfach ein Archiv selektieren und die gewünschten Anwendung als APEX-Exportfile herunterladen. Diese Datei können Sie dann über die Importfunktion des Application-Builders importieren.

Dabei gehen Sie so vor.

Der Ausgangspunkt ist wieder, wie bereits in Abbildung 8 gezeigt, der Menüpunkt “Archived Content”. Dort suchen Sie sich wieder die Anwendungsversion, die Sie herunterladen möchten.

Klicken Sie hier auf “Download”.

Jetzt wird die Anwendung als Exportfile über Ihren Browser heruntergeladen. Diese Datei können Sie nun in einem beliebigen Workspace importieren.

Dazu melden Sie sich an der APEX-Entwicklungsumgebung an und öffnen dort den “Application Builder”.

Im “Application Builder” gelangen Sie über das Icon “Import” zum Import-Wizzard.

Hier können Sie die eben extrahierte Datei auswählen. Den File Type belassen Sie bei “Database Application,…”. Über Next> gelangen Sie zur nächsten Seite des Import-Assistenten.

Wie bereits erwähnt, verläuft die Installation einer Anwendung bei beiden Varianten ab diesem Punkt gleich.

Install Database Application

Im Installations-Wizzards können Sie, wie in der Abbildung 14 gezeigt, festlegen, ob Sie die Anwendung mit der ursprünglichen oder einer neuen App-ID automatisch oder manuell versehen lassen möchten. Je nach Auswahl wird die vorhandene Version der Anwendung überschrieben oder als parallele Version installiert.

Abbildung 14: Import Database Application

Über “Install Application” geht es zum nächsten Schritt. Hier müssen Sie noch die Frage beantworten, ob Sie die “Supported Objects” installieren möchten.

Bei den “Supported Objects” handelt es sich  meist um DDL-Skripte, welche bei der Installation bzw. Update oder auch Deinstallation ausgeführt werden.  Diese “Supported Objects” sind Bestandteil einer Anwendung.

Hier sollten Sie sich im Klaren darüber sein, ob diese SQL- Skripte ausgeführt werden sollen. Im Zweifelsfall können Sie sich diese Skripte über den etwas versteckten Bereich Tasks in dieser Seite anzeigen lassen. Nach dem aufklappen der Tasks klicken Sie dazu einfach auf den Link “Preview Installation Script”. In dem sich nun öffnenden Fenster sind alle Skripte einsehbar.

Jetzt müssen Sie den Wizzard nur noch bis zu Ende folgen und dabei die Installation abschließend bestätigen.

APEX Application Archive (Teil 3) – Automatisieren mit dem dbms_scheduler

Im dritten Teil der Beitragsserie wird es um die automatische Erzeugung von Anwendungsarchiven gehen. Nutzt man darüber hinaus noch die Metadaten des APEX -Repositories, so lässt sich der Vorgang auch noch etwas smarter gestalten.

Beitragsübersicht

[catlist name=”APEX Application Archive”]

 

 

 

 

 

APEX Application Archive (Teil 3) – Automatisieren mit dem dbms_scheduler

Im dritten Teil der Beitragsserie geht es um die automatische Erzeugung von APEX-Anwendungsarchiven. Nutzt man darüber hinaus noch die Metadaten des APEX-Repositories, so lässt sich der Vorgang auch noch etwas smarter gestalten.

APEX-Anwendungen  sichern via. PL/SQL

Zu Beginn geht es darum herauszufinden, welche PL/SQL Funktion benötigt wird, um eine Anwendungsarchiv zu erzeugen.

Da die Funktion bereits in der Packaged Application “APEX Application Archive” genutzt wird, können Sie sich diese einmal ansehen.

Hierzu begeben Sie sich einfach in die Verwaltung der Packaged Applications.

Öffnen Sie dort die “APEX Application Archive”  und klicken Sie auf den Button “Manage’.

Abbildung 14: Unlock Application

Folgen Sie dem Wizzards und Entsperren Sie die Anwendung.

Jetzt können Sie die Anwendung wie gewohnt über den Application Builder bearbeiten.

Öffnen Sie die Seite 9. Dort finden Sie den Prozess der für die Archivierung der Anwendungen zuständig ist.

Abbildung 15: Archive Application

Der besseren Lesbarkeit wegen, habe ich Ihnen den Quellcode einmal heraus kopiert.

DECLARE
  l_vc_arr2 APEX_APPLICATION_GLOBAL.VC_ARR2;
  l_hdr_id number;
  z integer;
BEGIN
  l_vc_arr2 := APEX_UTIL.STRING_TO_TABLE(ltrim(rtrim(:P10_APPLICATIONS_TO_ARCHIVE,':'),':'));

  l_hdr_id := apex_cloud_archive.create_header(
                  p_workspace_id = :flow_security_group_id,
                  p_version = 1,
                  p_archive_name = :P5_ARCHIVE_NAME,
                  p_comments =:P9_COMMENTS);

  FOR z IN 1..l_vc_arr2.count LOOP
    apex_cloud_archive.archive_applications(
       p_workspace_id = :flow_security_group_id,
       p_header_id = l_hdr_id,
       p_application_id = l_vc_arr2(z));
  END LOOP;
END;

Quellcode 1: Auszug aus Seite 9 der Oracle APEX Anwendung Archive Application

Wie Sie dem Listing entnehmen können, benötigen Sie die Funktion create_header und archive_applications.

Die Funktion create_header legt ein neues Archiv an. Diesem Archiv können Sie nun mit Hilfe der Prozedur archive_applications eine oder mehrere Anwendungen hinzufügen.

Abbildung 16: APEX Views – APEX_APPLICATIONS

Die Parameter, die Sie für den Aufruf der beiden Prozeduren benötigen, liefert die APEX-View APEX_APPLICATIONS.

Um beispielsweise die “Sample Database Application” mit der App-Id 507 zu sichern, können Sie folgenden PL/SQL Block ausführen.

Abbildung 17: Anwendung via. API archivieren

Ein Hinweis am Rande. Oracle schreibt auf https://apex.oracle.com/de/  (Stand 22.05.2018 ) folgendes zum Anpassen von Packaged Applications.

“[..] Application Express bietet eine Sammlung von 35 Geschäfts- und Beispielsanwendungen. Sie können diese Anwendundungen für Produktionszwecke einsetzen oder kopieren, editieren und als Grundlage für Ihre eigenen Anwendungen verwenden.[..]”

Smarte Sicherung durch Nutzung der APEX-Views

Kombiniert  man nun die APEX-View APEX_APPLICATIONS mit den Tabellen der Anwendung “Application Archive” kann man den Prozess noch etwas smarter gestalten. Über das folgende select-Statement ermitteln Sie notwendigen Parameter. Dabei wird allerdings geprüft, ob seit der letzten Archivierung überhaupt Änderungen an der zu sichernden Anwendung durchgeführt wurden.


select WORKSPACE_ID,APPLICATION_ID, APPLICATION_NAME
  from APEX_APPLICATIONS a
  where APPLICATION_ID = 507
    and not exists (
              select 'X'
               from "APEX$ARCHIVE_CONTENTS" "APEX$ARCHIVE_CONTENTS",
                    "APEX$ARCHIVE_HEADER" "APEX$ARCHIVE_HEADER"
               where "APEX$ARCHIVE_HEADER".ID="APEX$ARCHIVE_CONTENTS".HEADER_ID
                 and "APEX$ARCHIVE_HEADER".WORKSPACE_ID = a.WORKSPACE_ID
                 and "APEX$ARCHIVE_CONTENTS".APP_ID = a.APPLICATION_ID
                 and "APEX$ARCHIVE_HEADER".CREATED > a.last_updated_on)

Quellcode 2: Änderungen berücksichtigen

Jetzt können Sie diese Erkenntnisse in Form einer Prozedur in der Datenbank speichern.


create or replace procedure back_app
(p_app_id number)
is
  l_hdr_id number;
  l_workspace_id number;
  l_archive_name varchar2(200);
BEGIN

for c in (select WORKSPACE_ID, APPLICATION_NAME
           from APEX_APPLICATIONS a
          where APPLICATION_ID = p_app_id
            and not exists (
                 select 'X'
                  from "APEX$ARCHIVE_CONTENTS" "APEX$ARCHIVE_CONTENTS",
                       "APEX$ARCHIVE_HEADER" "APEX$ARCHIVE_HEADER"
                   where "APEX$ARCHIVE_HEADER".ID = "APEX$ARCHIVE_CONTENTS".HEADER_ID
                     and "APEX$ARCHIVE_HEADER".WORKSPACE_ID = a.WORKSPACE_ID
                     and "APEX$ARCHIVE_CONTENTS".APP_ID = a.APPLICATION_ID
                     and "APEX$ARCHIVE_HEADER".CREATED > a.last_updated_on))
loop
  l_workspace_id := c.WORKSPACE_ID;
  l_archive_name := c.APPLICATION_NAME;

  l_hdr_id := apex_cloud_archive.create_header(
               p_workspace_id => l_workspace_id ,
               p_version => 1,
               p_archive_name => l_archive_name || to_char(sysdate,'dd.mm.yyyy'),
               p_comments => '' );

apex_cloud_archive.archive_applications(
               p_workspace_id => l_workspace_id ,
               p_header_id => l_hdr_id,
               p_application_id => p_app_id );
end loop;

END;

Quellcode 3: Prozeduren back_app

Um nun eine Anwendung zu archivieren genügt folgender Aufruf.

BEGIN
  back_app(507);
END

Quellcode 4: Anwendung archivieren

Sicherungen Automatisieren  mit dem dbms_scheduler

Gerade im Rahmen der Entwicklung einer Anwendung ist es oft nützlich, auf ältere Versionen einer Anwendung zurückgreifen zu können. Um das Archivieren nicht immer manuell anstoßen zu müssen, können Sie die eben konzipierte Prozedur back_app über einen Scheduler ausführen. Am einfachsten geht das über das Package dbms_schedule.


BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
     job_name => 'my_backup_job1',
     job_type => 'PLSQL_BLOCK',
     job_action => 'BEGIN back_app(507); END;',
     start_date => sysdate,
     repeat_interval => 'FREQ=DAILY; BYHOUR=10,15,20;',
     end_date => sysdate + 1,
     enabled => TRUE,
     comments => 'sample app');
END;
/

Quellcode 5: Regelmäßige Sicherung

In diesem Beispiel wird die Anwendung 507 jeden Tag um 10:00, 15:00 und 20:00 immer dann gesichert, wenn die Anwendung seit der letzten Archivierung geändert wurde.

Um nun eine Anwendung wieder herzustellen, gehen Sie wie in Teil 2 dieser Reihe beschrieben vor.

Beitragsübersicht

[catlist name=”APEX Application Archive”]

 

Oracle Application Express – Quick SQL

Low Code Entwicklung von Datenmodellen mit Quick SQL, einer APEX Packaged Application.

Oracle bietet im Rahmen seiner Entwicklungsumgebung APEX sogenannte Packaged Applications. Bei diesen Anwendungen handelt es sich zum Einen um Bespielanwendungen zum Anderen aber auch um produktiv nutzbare Systeme.

Eine dieser Anwendungen ist Quick SQL.

Quick SQL einrichten

Die Installation von Quick SQL geht zügig von der Hand. In APEX angemeldet, klicken Sie auf den Menüpunkt Packed Application.

APEX Packaged Application (Mitgelieferte Anwendungen)

Nun können Sie in der sich öffnenden Übersicht die Packaged Application Quick SQL auswählen.

Quick SQL auswählen

Neben einer Kurzbeschreibung finden Sie auf der sich öffnenden Seite die Schaltfläche Installieren. Folgen Sie dem Installationsassistenten. Fertig.

Starten Sie die Anwendung das erste mal, können Sie sich mit dem bei der Installation gewählten Authentifizierungsverfahren an Quick SQL anmelden. Bei dem ersten Start, müssen Sie noch einige Parameter prüfen und bei Bedarf anpassen. Das stellt sich wie in folgender Abbildung  dar.

QuickSQL einrichten

Datenmodell mit Quick SQL entwerfen

Quick SQL gliedert sich in  zwei Bereiche. Links können Sie sehr kompakt Tabellen und ihre Relationen zueinander definieren.

Rechts wird bei jeder Änderung das zugehörige DDL (Data Definition Language) Skript erzeugt.

Benutzeroberfläche QuickSQL

Als einfaches Beispiel soll ein Datenmodell für ein Projektplanungstool dienen.

Tabellen werden einfach durch die Eingabe des Tabellennamens deklariert. Die zugehörigen Spalten rücken Sie einfach in den folgenden Zeilen ein.

Datenmodell Projektplanung

Quick SQL Eigenschaften

Schauen Sie sich das erzeugte DDL-Script näher an, so sehen Sie, dass eine ID-Spalte als künstlicher Schlüssel erzeugt wurde.  Diese Spalte wird über einen Trigger gefüllt. Auch gibt es mehrere Spalten, in denen Audit-Informationen gespeichert werden. Diese Spalten können beim Einsatz der Tabelle in einer APEX-Anwendung sogar mit den APEX-Account über einen Trigger belegt werden. Dies sind nur zwei Beispiele, die Ihnen Quick SQL bietet. Festlegen können Sie die Generierung dieser Funktionen in den Eigenschaften von Quick SQL.

Quick SQL Eigenschaften

Die Abbildung zeigt nur einen Teil der Möglichkeiten. So können Sie z.B. allen Tabellen einen Präfix voran stellen, Änderungen automatisch über einen Trigger in einer Audit-Tabelle protokollieren und noch vieles mehr erledigen lassen. Nehmen Sie sich Zeit, um diese Möglichkeiten in Gänze kennen zu lernen.

Relationen

Jedem Projekt sollen in dem gezeigten Beispiel n ToDos zugeordnet werden können. Also eine einfache 1:n Beziehung.

Um diese abhängige Tabelle zu erzeugen, geben Sie auf der Ebene der Spalten zunächst ToDos als neuen Tabellennamen ein. In den nächsten Zeilen rücken Sie die Spaltenbezeichner um eine weitere Ebene tiefer ein. Quick SQL erweitert das DDL-Script um die Tabelle ToDos und fügt eine Fremdschlüsselspalte project_id ein.  Neben der Spalte wird auch sofort ein foreign key constraint erzeugt.

Relationen erzeugen

Syntax and Examples

Nähere Informationen über die sehr umfangreichen Möglichkeiten von Quick SQL verbergen sich hinter dem Link Syntax and Examples in der Anwendung.

Fazit

Quick SQL bietet als Low Code Entwicklungstool durch die Nutzung von Konventionen eine enorme Geschwindigkeit bei der Erstellung eines Datenmodells. Auch für nicht APEX-Entwickler verdient diese Anwendung eine genauere Betrachtung.

Oracle Application Express – My Meeting Minutes

Möchten Sie Anwendungen mit Oracle Application Express entwickeln? Dann sehen Sie doch einfach mal den einführenden Artikel  von mir in in der Informatik Aktuell an.

Möchten Sie sich die Anwendung dazu ansehen, können Sie diese hier herunterladen.

[

APEX My Meeting Minutes

Diese Anwendung ist im Rahmen eines Einführungsartikels, den ich für das Online-Magazin Informatik Aktuell geschrieben habe, zum Thema “Oracle Application Express” als Anschauungsobjekt entstanden.

Nutzungsbedingungen

Bei diesem Programm handelt es sich um eine Beispielanwendung, die nur zu Anschauungszwecken und nicht für den produktiven Einsatz gedacht ist. Bitte installieren Sie diese Anwendung nur in einem Testsystem. Ihnen wird nur für diesen Zweck ein nicht ausschließliches Recht zur Nutzung der zugrundeliegenden Software eingeräumt.

Es dürfen keine Schutzvermerke, die sich in der Anwendung, Plug/Ins oder Dokumentation befinden entfernt werden.

 

 

 

 

 

 

Oracle Datenbank härten

Sehr viele Systeme im geschäftlichen Umfeld nutzt im Backend eine Datenbank. In diesem Beitrag möchte ich Ihnen einige Anregungen geben, wie Sie eine Oracle Datenbank sicher betreiben können.

In der Praxis eines Softwareentwicklers wird dessen Leistungsfähigkeit in der Regel an der Geschwindigkeit gemessen, mit der eine Anforderung umgesetzt wird. Dabei geht es meist um Funktionalität aber auch Aussehen einer Anwendung. Dem Komplex Sicherheit – ein zugegebener Maßen – lästiges und mitunter recht aufwendiges Thema wird meist eine nachgelagerte Rolle zugewiesen. Sicherheit wird immer dann aktuell, wenn es zu Problemen gekommen ist. Das müssen nicht immer spektakuläre Hacks sein, bei denen Kundendaten oder Kreditkarteninformationen entwendet werden. Bei fehlenden oder auch fehlerhaft vergebenen Berechtigungen können leicht Informationen in die falschen – wenn auch interne – Hände gelangen. Unterschätzen sie nicht den Wissensdurst der eigenen Leute.

Die erste Überlegung, die Sie zum Thema Sicherheit anstellen sollten, ist die Klassifizierung Ihrer Anwendung. Welche Verfügbarkeitsanforderungen muss das System gerecht werden? Wie brisant sind die Daten, die mit der Anwendung verwaltet werden? Ist die Anwendung für den internen Gebrauch gedacht, oder soll ein Zugriff über das Internet möglich sein? Werden personenbezogene Daten verarbeitet? Welche maximal tolerierbare Ausfallzeit können Sie in kauf nehmen? Sind gesetzliche Vorgaben und staatliche Vorschriften (Compliance) zu beachten? Welche Kosten und welcher Image-Verlust entstehen durch Kompromittierung?

Betrachten Sie immer das Gesamtsystem

Eine datenbankgestütze Anwendung benötigt mindestens einen Server, eine Datenbank und ein Frontend. Diese Komponenten werden in einer IT-Infrastruktur aus Netzwerk, Domaine, usw. betrieben.  Um ein sicheres Gesamtsystem zu erhalten, ist es notwendig alle beteiligten Komponenten zu betrachten und abzusichern.

Zu einer genaueren Risikoanalyse möchte ich Sie an dieser Stelle auf den IT-Grundschutz-Katalog des Bundesamtes für Sicherheit in der Informationstechnik aufmerksam machen. Sie finden auf der Web-Seite https://www.bsi.bund.de umfangreiche Informationen rund um das Thema Sicherheit.

  1. Je nach Sicherheitsbedürfnis des Systems müssen Sie verschiedene Maßnahmen ergreifen.

Server härten

Alle beteiligten Server eines Gesamtsystems – seien es Application Server, Web Server oder Datenbank-Server müssen gehärtet werden. Da eine Abhandlung dazu ganze Bücher füllen kann und natürlich auch von den verwendeten Systemen abhängt, beschränke ich mich hier auf eine Auflistung wichtiger Punkte und Schritte, die hier zu beachten sind.

  • Sie sollten immer eine Neuinstallation des Systems durchführen, wobei Sie ausschließlich originale Installationsmedien verwenden müssen. Widmen Sie keine bestehenden Server (Installationen) um.
  • Legen Sie sich eine Patch-Strategie fest. Automatisches Patchen ist nur bedingt zu empfehlen, da komplexere Systeme erst getestet werden müssen. Hier bieten sich auch automatische Testverfahren (z. B. Unit-Tests) an.
  • Nicht benötigte Dienste/Prozesse stellen ein unnötiges Gefahrenpotenzial dar. Betreiben Sie nur die Dienste, die auch wirklich benötigt werden. Dabei sollten Sie darauf achten, diese mit möglichst geringen Privilegien zu betreiben.
  • Verwenden Sie keine administrativen Accounts um Dienste zu betreiben. Jeder Dienst ist über einen eigenen User mit eigenem Kennwort auszuführen.
  • Löschen Sie nicht benötigten Accounts.
  • Verwenden Sie starke Passwörter, wobei Sie deren Komplexität über entsprechende Policies erzwingen sollten. Kennwörter für Benutzer sind regelmäßig zu ändern. Systemkennwörter sind entsprechend lang und komplex anzulegen. Überschreiben Sie jedes Default-Passwort. Auflistungen gängiger Accounts sind ganz einfach im Internet zu erhalten.
  • Beschränken Sie die Systemressourcen für Daten, die von außen in das System hereingetragen werden können. Dies gilt z. B. für Mails, hoch ladbare Dateien aber auch von Log-Files.
  • Prüfen Sie regelmäßig Log- und Tracefiles sowie Event-Log Einträge.
  • Verwenden Sie einen Virenscanner.
  • Lassen Sie nur die notwendige Kommunikation mit dem System zu. Sichern Sie den Zugriff über eine Firewall.
  • Begrenzen Sie administrative Zugriffe auf die benötigten Services. Lassen Sie den Zugriff nur von ausgewählten Rechnern (Admin-Konsolen) zu und begrenzen Sie den Personenkreis mit administrativen Rechten.
  • Beschränken Sie den physischen Zugriff auf dass System (Rechenzentrum abschließen).
  • Schützen sie das System mit einem BIOS-Passwort und evtl. mit einem Passwort für den Boot loader. Ändern Sie die Bootreihenfolge so, dass das System nicht von externen Medien gebootet werden kann.
  • Verwenden Sie sichere Dateisysteme und verschlüsseln Sie bei Bedarf auch die Festplatte.
  • Halten Sie die Systemdokumentation auf einem separaten System, so ersparen Sie es sich entsprechende Reader zu installieren und diese aktuell zu halten. Im Fehlerfall nützt Ihnen die beste Dokumentation nichts, wenn Sie nicht darauf zugreifen können.
  • usw. …

Härten der Datenbank

Haben Sie es zu einer sicheren Basis für die benötigten Server gebracht, können Sie sich um die Einrichtung der Datenbank kümmern. Den Grundsatz des Härtens eines Systems finden Sie auch hier wieder. Beschränken Sie sich auf das Notwendige und halten Sie das System aktuell.

Datenbankversion und Patchen

Oracle bietet für eine gewisse Zeit, Updates und Sicherheits-Patches für seine supporteten Produkte. Aber nach gewisser Zeit werden ältere Versionen aus dem Support genommen. Sicherheitslücken werden dann nicht mehr geschlossen.

Setzen Sie also für Ihre Systeme immer eine supportete möglichst aktuelle Datenbankversion ein.

Oracle veröffentlicht regelmäßig sogenannte Critical Patch Updates (CPU). Diese fixen die bis dahin bekannten Sicherheitslücken. Sie können sich auch proaktiv von Oracle per Mail über sicherheitsrelevante Themen benachrichtigen lassen. Sie sollten diese nach Prüfung auf einem Testsystem, möglichst zeitnah einspielen.

Vereinbaren Sie nach Möglichkeit mit den Nutzern Ihrer Anwendungen bestimmte Wartungsfenster, in denen Sie oder der entsprechende DBA diese Arbeiten erledigen kann.

Default-Accounts

Eine Oracle Standard-Installation bring diverse Accounts mit auf die mittels Default-Passwort zugegriffen werden kann. Recherchieren Sie mal im Internet danach, so finden Sie verschiedene Listen dieser Accounts. Es gibt diverse Scanner mit denen Sie eine Datenbank auf diese Benutzer prüfen können. Sie sollten – dem Minimalprinzip folgende – nach Möglichkeit die Accounts entfernen. Wenn das nicht möglich ist, können Sie noch den User deaktivieren oder mit einem unbekannten sicheren Passwort schützen.

Folgende Auflistung zeigt die gängigsten Benutzer und eine Handlungsempfehlung, wie mit Ihnen umzugehen ist.

Benutzer

Password

Nutzung

Löschen möglich

Passwort ändern

SYS

CHANGE_ON_INSTALL ODER INTERNAL

Oracle Data Dictionary

Nein

Ja

SYSTEM

MANAGER

Standard DBA

Nein

Ja

SYSMAN

CHANGE_ON_INSTALL

Administration aus Enterprise Manager

Nein

Ja

OUTLN

OUTLN

Administration der Tuning-Statistik

Nein

Ja

SCOTT

TIGER

Beispiele

Ja

Ja

ADAMS

WOOD

Beispiele

Ja

Ja

JONES

STEEL

Beispiele

Ja

Ja

CLARK

CLOTH

Beispiele

Ja

Ja

BLAKE

PAPER

Beispiele

Ja

Ja

HR

HR

Beispiele

Ja

Ja

OE

OE

Beispiele

Ja

Ja

SH

SH

Beispiele

Ja

Ja

DBSNMP

DBSNMP

Enterprise Manager

Nein

Ja

CTXSYS

CTXSYS

Text-Extender-Funktion

Nein

Ja

DIP

DIP

Administration der Directory Integration Platform (DIP)

Ja über

“oidprovtool”

Wenn DIP nicht mehr benötigt.

Ja über

“oidprovtool”

DMSYS

DMSYS

Data-Mining

Ja

Ja

EXFSYS

EXFSYS

Expression-Filter-Indizierung

Ja mittels catnoexf.sql

Ja

LBACSYS

LBACSYS

Label Based Access

Control owner

Ja

CSMIG

Database

Character Set Migration

Utility

Ja

Ja

Eine Übersicht der in der Datenbank vorhandenen Benutzer verschaffen Sie sich am besten über ein Admin- bzw. Datenbankentwicklungswerkzeug. Mit dem SQL-Developer können Sie sich die entsprechenden Benutzer anzeigen lassen.

Sie können Sich aber auch über den dba-View (select * from dba_users ) die entsprechenden Accounts auflisten lassen.

Seit Oracle11g können Sie in regelmäßigen Abständen über die dba-View DBA_USERS_WITH_DEFPWD prüfen, ob in Ihrer Datenbank User mit Standardpasswörten vorhanden sind.

Der SQL Developer bietet Ihnen auch die Möglichkeit benutze zu sperren, zu löschen und das Passwort zu ändern. Die folgende Abbildung zeigt, wie man den Benutzer HR sperren kann.

HR Account sperren

Über SQLPLUS lässt sich das über den Befehl ALTER USER “HR” PASSWORD EXPIRE ACCOUNT LOCK ; erledigen.

Mit dem Befehl alter user <Benutzername> identified by <Passwort>; können Sie einem Account ein neues Kennwort geben.

Der Befehl drop user username cascade; entfernt den Benutzer aus der Datenbank. Der Postfix cascade sorgt dafür, dass auch alle Objekte (Tabellen, Packages, …) welche sich im Besitz dieses Users befanden ebenfalls entfernt werden.

Berechtigungen

Haben Sie nun alle überflüssigen Accounts gesichert, so können Sie sich den Berechtigungen der verbliebenen einmal näher ansehen.

Grundsätzlich gilt – gehen Sie sparsam mit den Berechtigungen um.

Oracle unterscheidet verschiedene Arten von Rechten.

Über Systemberechtigungen wird in Oracle Datenbanken gesteuert, welcher User welche DDL-Befehle ausführen darf. Eine Übersicht der aktuell erteilten Privilegien liefert Ihnen folgendes Statement.

select * from dba_sys_privs;

Seien Sie vor allem sehr sparsam mit der Vergabe von „ANY“ Privilegien.

select * from dba_sys_privs where privilege like ‘%ANY%’

Objektberechtigungen steuern, welche DML-Befehle ein User für ein bestimmtes Datenbank-Objekt ausführen darf.

select * from dba_tab_privs; zeigt alle vergebenen Objektberechtigungen.

Noch granularer lassen sich die Zugriffe über sogenannte Spaltenberechtigungen vergeben.

select * from dba_col_privs;

Rechte warden über den Befehl GRANT <Recht> TO <Benutzer> ergeben und mit REVOKE <Recht> FROM <Benutzer> entzogen.

Rechte können auch zur Gruppen – sogenannten Rollen – zusammengefasst werden.

select * from role_sys_privs;

select * from role_tab_privs;

Diese Rollen werden dann wieder als Recht einem User zugewiesen.

Rollen wiederum können auch anderen Rollen zugeordnet werden, so das eine verschachtelte Struktur entsteht. Eine Übersicht liefert

select * from role_role_privs; .

Um nun zu ermitteln, welcher Benutzer welche Rolle(n) besitzt, führen sie folgende Anweisung aus. select * from dba_role_privs

In der Praxis spielt oft die Zeit für eine Lösung eine erhebliche Rolle, wodurch es recht häufig dazu kommt, dass einem User zu viele Rechte oft über mächtige Rollen (DBA) zugewiesen werden. Diese Rechte ermächtigen den Benutzer dann schnell mit seiner Arbeit fortfahren zu können, stellen aber ein erhebliches Risiko dar.

Überprüfen Sie regelmäßig die Berechtigungen und schränken Sie diese auf das Nötige ein.

select * from dba_role_privs where granted_role =’DBA’

Optionen und Features

Oracle bietet für seine Datenbanken ein sehr umfassendes Spektrum an Funktionen. Viele diese Möglichkeiten werden zu sogenannten Optionen zusammengefasst, die dann meist auch lizenzrechtlich zusätzlich betrachtet werden müssen. Auch wenn die Frage der Lizenzierung geklärt ist, sollten Sie sich auf die notwendigen Optionen für Ihr System beschränken. Jede Option bietet eine potenzielle Schwachstelle und muss bei Nutzung natürlich auch entsprechend in die Patch-Strategie mit einbezogen werden.

Die View V$OPTION (select * from V$OPTION) liefert Ihnen einen Überblick der Installierten Optionen und Features. Features sind Bestandteile der entsprechenden Datenbank-Version, während Optionen auch noch manuell hinzugefügt werden können. Über select * from DBA_REGISTRY können Sie alle installierten Optionen sichten.

Wenn Sie sich unsicher sind, welche Features von Ihrer Anwendung verwendet werden, können Sie sich über select * from DBA_FEATURE_USAGE_STATISTICS das entsprechende Nutzungsverhalten ansehen.

Im Verzeichnis $ORACLE_HOME/rdbms/admin finden Sie für die meisten Fälle die entsprechenden Skripte zum Deinstallieren. Hier hilft die Lektüre der entsprechenden Systembeschreibungen von Oracle.

Gesicherte Kommunikation – Oracle LISTENER

Um mit einer Oracle Datenbank über ein Netzwerk in Kontakt treten zu können, wird auf Server-Seite der sogenannte LISTENER benötigt. Der LISTENER ist ein Prozess, welcher auf einem TCP/IP Port – Default ist hier 1521 – lauscht und bei Anforderung durch den Client eine Verbindung zur Datenbank aufbaut. Die Konfiguration des LISTNERS erfolgt über die Datei listener.ora, welche Sie im Verzeichnis $ORACLE_HOME/network/admin finden.

01 […]

02 LISTENER =

03 (DESCRIPTION_LIST =

04 (DESCRIPTION =

05 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

06 (ADDRESS=(PROTOCOL=TCP)(HOST=<SERVER_NAME>)

07 (PORT= 1521))

08 )

09 )

10

11 DEFAULT_SERVICE_LISTENER = (XE)

12 […]

LISTENER.ORA ohne Anpassungen

Der LISTENER bietet also einen entsprechenden Angriffspunkt für einen Hacker. Der erste Schritt um es einem Angreifer zu erschweren, sich diesen Prozess zunutze zu machen ist es, den vorgegebenen Namen LISTENER zu ändern. Tragen Sie dazu wie in Zeile 02 des folgenden Konfigurations-Files apxlsn ein.

Darüber hinaus sollte niemals der Standard-Port 1521 verwendet werden. Hier können Sie einfach einen freien Port zwischen 1024 und 65535 wählen. In diesem Beispiel lautet der Port 2012.

Oracle Datenbanken bieten die Möglichkeit, externe Prozeduren aus Klassenbibliotheken (*.DLL) über den LISTENER zugänglich zu machen. Diese können dann per PL/SQL verwendet werden. Erhält nun ein Angreifer Zugriff auf die Datenbank, könnte er über diesem Weg direkt auf den Server zugreifen. Dies geschieht dann mit den Berechtigungen der Datenbankprozesse. Können Sie in Ihrer Anwendung auf diese Möglichkeit verzichten, so sollten Sie die Zeile 05 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) aus der Konfiguration entfernen.

01 […]

02 apxlsn =

03 (DESCRIPTION_LIST =

04 (DESCRIPTION =

05 (ADDRESS = (PROTOCOL = TCP)(HOST = <SERVER_NAME>)

06 (PORT = 2012))

07 )

08 )

09

10 DEFAULT_SERVICE_LISTENER = (XE)

11 CONNECTION_RATE_apxlsn = 5

12 LOCAL_OS_AUTHENTICATION_apxlsn = ON

13 […]

Gehärtete Version der LISTENER.ORA

In Zeile 11 wird über das setzten der connection_rate festgelegt, dass maximal 4 Verbindungen pro Sekunde zur Datenbank neu aufgebaut werden dürfen. Hiermit können Sie einem DoS (Denial of Service)–Angriff entgegenwirken.

Über die Zeile 12 wird verhindert, dass der LISTENER remote beendet werden kann. Ein DBA muss sich also mit entsprechenden Rechten direkt am Server anmelden, um dies zu bewerkstelligen. Also richten Sie entsprechende Zugangsbeschränkungen auf Seite des Betriebssystems ein.

Speichern Sie die Änderungen und führen, dass über die Kommandozeile den Befehl lsnrctl stop und anschließend lsnrctl start  aus. Hierdurch wird der vorhandene LISTENER beendet und die angepasste Version gestartet. Unter Windows finden Sie anschließend einen neuen Dienst mit dem Namen des LISTENERs.

Den aktuellen Status des LISTENERs können Sie sich mit lsnrctl stat <name> ansehen.

Um die Kommunikation zwischen dem LISTENR und der Datenbank korrekt wiederherzustellen, müssen Sie noch über SQLPLUS direkt auf dem Server folgendes Statement absetzen. SQLPLUS können Sie wie folgt starten: sqlplus system as sysdba. Führen Sie dann folgende Anweisung aus.

ALTER SYSTEM SET local_listener = ‘(address=(protocol=tcp)(host=<SERVER_NAME>)(port=2012))’ SCOPE=both;

Im nächsten Schritt geht es nun daran, den Zugriff auf den LISTENER und damit auf die Datenbank auf einen exklusiven Kreis einzuschränken.

Neben der Datei listener.ora finden Sie im Verzeichnis $ORACLE_HOME/network/admin eine weitere Konfigurationsdatei namens sqlnet.ora. Diese Datei finden Sie auch auf der Client-Seite.

01 SQLNET.AUTHENTICATION_SERVICES = (NONE)

02 SQLNET.INBOUND_CONNECT_TIMEOUT = 6

03

04 TCP.VALIDNODE_CHECKING = YES

05 TCP.INVITED_NODES = <IP_WEB_SERVER>, 192.168.178.*

06

07

08 sqlnet.encryption_server = required

09 sqlnet.encryption_types_server = AES256

10 sqlnet.encryption_client = required

11 sqlnet.encryption_types_client = AES256

12

13 sqlnet.crypto_checksum_server = required

14 sqlnet.crypto_checksum _types_server = MD5,SHA1

15 sqlnet.crypto_checksum_client = required

16 sqlnet.crypto_checksum _types_client = MD5,SHA1

Gehärtete Version der SQLNET.ORA auf dem Server

In Zeile 01 sollten Sie den Standardeintrag SQLNET.AUTHENTICATION_SERVICES = (NTS) auf NONE setzen. Sonst ist es einem User, welcher zugriff auf das Betriebssystem hat und Mitglied in der lokalen Benutzergruppe ORA_DBA ist, möglich sich über sqlplus / as sysdba ohne Angabe eine Passwortes an der Datenbank mit DBA-Rechten anmelden kann.

Durch den Eintrag in Zeile 02 wird der LISTERNER dazu gebracht, dass er maximal sechs Sekunden für den Aufbau einer Verbindung für einen Client zu Datenbank aufwenden soll. In Kombination mit dem Parameter CONNECTION_RATE_apxlsn = 5 aus der LISTENER.ORA wird dies DoS-Attacken entgegen.

Über die Zeilen 04,05 beschränken Sie den Zugriff auf die Datenbank auf die Clients, welche Sie mithilfe des Parameters TCP.INVITED_NODES festlegen können. In dem eingangs geschilderten Konstrukt, sollte es genügen den Zugriff auf den Web-Server und die internen Clients zu beschränken.

Ein weiterer Schachpunkt bei der Normalkonfiguration ist der Netzwerkverkehr. Daten und Befehle werden unverschlüsselt übertragen, sodass über einen einfachen Netzwerk-Sniffer diese leicht abgefangen werde können. Dies umfasst u.a. auch die Benutzernamen und Passwörter, welche zur Anmeldung an der Datenbank übertragen werden müssen. Abhilfe können Sie durch die Nutzung vorn verschiedenen Verschlüsselungsverfahren schaffen. Durch die Zeilen 08/09 wird auf Serverseite, dass die Kommunikation mit AES256 verschlüsselt wird. Auf Clientseite muss ebenfalls die Datei sqlnet.ora wie auch hier in Zeile 10/11 angegeben werden, da sonst keine Verbindung zustande kommen kann. Die Zeilen 10 und 11 sollten Sie auch auf dem Datenbankserver eintragen, da eine Datenbank – z. B. über Datenbanklinks – auch als Client fungiert. Oracle bietet folgende Verschlüsselungsverfahren an.

  • AES256: Advanced Encryption Standard (AES), Nachfolger von DES und 3DES, basiert auf dem Rijndael-Algorithmus.
  • AES192: Advanced Encryption Standard (AES), mit einer Blockgröße von 192 bits.
  • AES128: Advanced Encryption Standard (AES), mit einer Blockgröße von 128 bits.
  • RC4_256, RC4_128, RC4_40: Rivest Cipher 4 (RC4), Stream-Verschlüsselung, wird z. B. bei folgenden Protokollen eingesetzt HTTPS, SSH 1 und WEP bzw. WPA.
  • 3DES168, 3DES112: Triple Data Encryption Standard (TDES) , nicht mehr sicher genug
  • DES, DES40: Data Encryption Standard (DES) 56-bit Schlüssel, nicht mehr sicher genug

In Zeile 13 bis 16 wird noch ein Verfahren festgelegt, über welches die übertragenen Daten signiert werden. Hierdurch können Sie einem Man-in-the-middle-Angriff (MITM-Angriff) entgegenwirken, wobei ein potenzieller Angreifer die übertragenen Datenpakete abfangen und manipuliert weiterleiten möchte.

Jetzt müssen Sie nur noch die tnsnames.ora auf dem Server und auf allen Clients anpassen, de auf die Datenbank zugreifen sollen. Die notwendigen Modifikationen stellen sich recht moderat dar. Ändern Sie einfach den Port auf 2012 und speichern Sie die Datei in dem Verzeichnis $ORACLE_HOME/network/admin.

01 XE =

02 (DESCRIPTION =

03 (ADDRESS = (PROTOCOL = TCP)(HOST = <SERVER_NAME>)

04 (PORT = 2012))

05 (CONNECT_DATA =

06 (SERVER = DEDICATED)

07 (SERVICE_NAME = XE)

08 )

09 )

Beschränken Sie über das Betriebssystem den Zugriff auf das Verzeichnis $ORACLE_HOME und seine untergeordneten Ordner auf einen eingeschränkten Kreis von Administratoren.

Achtung! Vergessen Sie nicht den technischen User, über den die Datenbankinstanz ausgeführt wird ebenfalls zu berechtigen.

Je nach Konfiguration des SQL-Developers müssen Sie auch hier den neuen Port für den Verbindungsaufbau berücksichtigen.