Die meisten Webanwendungen erfordern heutzutage zumindest eine grundlegende Sicherheitsstrategie. Zum Beispiel Websites, die passwortgeschützte Inhalte anbieten, Websites mit nur einem Administrator-Backend, Blogs und persönliche Zeitschriften, E-Commerce-Websites, Unternehmensintranets und so weiter.
Der gängigste Entwurfsansatz zum Erstellen dieser Art von Webanwendungen besteht darin, Sicherheitsrichtlinien in die Geschäftslogik der Webanwendung zu integrieren, wobei die Anwendung bestimmt, ob ein Benutzer die Berechtigung hat, auf bestimmte Daten in der Datenbank zuzugreifen. In diesem Szenario besteht die Aufgabe der Datenbank lediglich darin, Daten zu speichern und sie auf Anfrage bereitzustellen. Mit anderen Worten: Wenn eine Webanwendung der Datenbank befiehlt, bestimmte Informationen bereitzustellen, führt die Datenbank den Befehl direkt aus, ohne die Berechtigungen des Benutzers zu überprüfen.
In diesem Artikel erfahren Sie, wie Sie die integrierten Sicherheitsfunktionen von Oracle nutzen, um Anwendungssicherheitsregeln auf Datenbankebene durchzusetzen und so die Gesamtsicherheit Ihrer Anwendung zu verbessern. Als Nebeneffekt verbessert die Sicherung des Datenzugriffs direkt in der Datenbank nicht nur die Anwendungssicherheit, sondern trägt auch zur Reduzierung der Komplexität bei.
Wie sieht es mitdem Bedarf an datenbankseitiger Sicherheit
aus, um den Datenzugriff von Webanwendungen zu kontrollieren? In den meisten Fällen gibt es kein Problem; dies ist eine gute Lösung, insbesondere wenn die betreffenden Daten nicht geschäftskritisch oder streng geheim sind. Diese Methode wird in vielen Büchern und Online-Ressourcen verwendet. Tatsächlich wird in einem beliebten PHP/MySQL-Buch ausdrücklich davon abgeraten, mehr als ein Datenbankbenutzerkonto pro Anwendung zu erstellen, da „zusätzliche Benutzer oder komplexe Berechtigungen möglicherweise mehr Überprüfungen erfordern, bevor Informationen ausgeführt werden, und die Ausführungsgeschwindigkeit von MySQL verlangsamt.“ Das stimmt; es gibt jedoch einige Dinge, die Sie bedenken sollten, bevor Sie den Gedanken aufgeben, Sicherheit in Ihre Datenbanklogik zu integrieren. Schauen wir uns das folgende Beispiel an.
Nehmen wir an, Sie erstellen ein Content-Management-System (CMS). Zur Speicherung der auf der Website veröffentlichten Inhalte wird eine Datenbank genutzt. Die meisten Daten sind öffentlich, sodass anonyme Webbenutzer sie lesen können; nur Redakteure dürfen die Daten ändern. Verwenden Sie ein einziges Datenbankkonto, um auf Datensätze in der Datenbank zuzugreifen und diese zu ändern, und steuern Sie die Sicherheit mit PHP-Code, indem Sie den Zugriff auf Seiten, die nur Administratoren vorbehalten sind, mit einem Passwort schützen.
Wenn die öffentliche Seite einer Webanwendung unter einem Angriff wie einer SQL-Injection auf ein öffentliches Suchformular (d. h. ein Formular, das nicht streng genug codiert ist) leidet, kann der Eindringling möglicherweise beliebige SQL-Anweisungen auf Datenbankobjekten ausführen, die das betreffen öffentliches Konto hat Zugriff auf. In diesem Fall stellt die Ausführung der SELECT-Anweisung natürlich kein großes Problem dar, da die Daten öffentlich sind. Da öffentliche und administrative Rechte jedoch dasselbe Datenbankkonto verwenden, kann der Eindringling auch UPDATE- und DELETE-Anweisungen ausführen oder sogar Tabellen aus der Datenbank löschen.
Wie können wir das verhindern? Die einfachste Methode besteht darin, die Berechtigungen des öffentlichen Datenbankkontos zum Ändern von Daten vollständig einzuschränken. Werfen wir einen Blick darauf, wie Oracle dieses Problem löst.
Grundlegender Überblick über die Oracle-Sicherheit
Oracle Database bietet Webentwicklern viele Möglichkeiten, den Zugriff auf Daten zu steuern, von der Verwaltung des Zugriffs auf bestimmte Datenbankobjekte wie Tabellen, Ansichten und Prozeduren bis hin zur Steuerung des Zugriffs auf Daten in einzelnen Zeilen oder Spalten. Offensichtlich würde eine Diskussion aller Sicherheitsfunktionen oder -optionen, die Oracle bietet, den Rahmen dieses Artikels sprengen. Hier gehen wir nicht zu sehr ins Detail, sondern nur auf die grundlegendsten Aspekte der Oracle-Datenzugriffssicherheit:
· Authentifizierung und Benutzerkonten · Berechtigungen · Rollenauthentifizierung
und Benutzerkonten. Wie bei anderen Datenbanken muss jeder Benutzer (Datenbankkonto), der Zugriff auf Oracle anfordert, authentifiziert werden. Die Validierung kann durch eine Datenbank, ein Betriebssystem oder einen Netzwerkdienst erfolgen. Neben der Basisauthentifizierung (Passwortauthentifizierung) unterstützt Oracle auch starke Authentifizierungsmechanismen wie Kerberos, CyberSafe, RADIUS usw.
Rolle. Eine Oracle-Rolle ist ein benannter Satz von Berechtigungen. Obwohl Sie Benutzerkontoberechtigungen direkt erteilen können, kann die Verwendung von Rollen die Benutzerverwaltung erheblich vereinfachen, insbesondere wenn Sie eine große Anzahl von Benutzern verwalten müssen. Es ist sehr effizient, kleine, überschaubare Rollen zu erstellen und Benutzern dann je nach Sicherheitsstufe eine oder mehrere Rollen zuzuweisen. Ganz zu schweigen davon, wie einfach es ist, Berechtigungen zu ändern – ändern Sie einfach die Rolle, mit der die Rolle verknüpft ist, anstatt jedes Benutzerkonto zu ändern.
Um die anfängliche Arbeit beim Erstellen neuer Benutzer zu vereinfachen, verfügt Oracle über drei vordefinierte Rollen:
· CONNECT-Rolle – Mit dieser Rolle können Benutzer eine Verbindung zur Datenbank herstellen und grundlegende Vorgänge ausführen, z. B. das Erstellen eigener Tabellen. Standardmäßig kann diese Rolle nicht auf die Tabellen anderer Benutzer zugreifen.
·RESOURCE-Rolle – Die RESOURCE-Rolle ähnelt der CONNECT-Rolle, ermöglicht Benutzern jedoch mehr Systemberechtigungen, z. B. das Erstellen von Triggern oder gespeicherten Prozeduren.
·DBA-Rolle – ermöglicht dem Benutzer alle Systemberechtigungen.
Verwendete Autorisierungen und Berechtigungen
In diesem Abschnitt besprechen wir, wie Sie die Autorisierungen und Berechtigungen von Oracle nutzen können, um die Sicherheit des einfachen CMS-Beispiels zu verbessern, das am Anfang dieses Artikels besprochen wurde. Es wird davon ausgegangen, dass der den Benutzern der Anwendung bereitgestellte Inhalt in der Tabelle WEB_CONTENT gespeichert ist.
Erstellen Sie zunächst die Tabelle. Starten Sie Oracle Database Special Edition und melden Sie sich als Systemadministrator an. Geben Sie den Beispiel-HR-Benutzer frei, wenn er noch nicht freigegeben wurde. Befolgen Sie die Anweisungen im „Erste Schritte“-Handbuch, das der Installation der Special Edition beiliegt. Beachten Sie, dass HR-Benutzern standardmäßig die Rolle RESSOURCE zugewiesen ist. Geben Sie dem Benutzer hier die DBA-Rolle, damit das Konto zur Verwaltung der Datenbankaspekte der CMS-Anwendung verwendet werden kann. Selbstverständlich wird das HR-Benutzerkonto nicht für den Online-Zugriff, sondern nur für die Datenbankverwaltung genutzt.
Sie können jetzt eine neue Tabelle erstellen, indem Sie den Objektbrowser verwenden oder das Fenster „SQL-Befehle“ ausführen. Hier ist der Code zum Erstellen der Tabelle:
CREATE TABLE WEB_CONTENT (
page_id NUMMER PRIMÄRSCHLÜSSEL,
page_content VARCHAR2(255)
);
Da die Tabelle mit dem HR-Benutzerkonto erstellt wurde, ist die Tabelle Eigentum des HR-Kontos und befindet sich im HR-Schema, und andere Benutzer können nicht auf die Tabelle zugreifen, bis ihnen ausdrücklich die Berechtigung zum Zugriff auf die Tabelle erteilt wird. Wenn Sie es nicht glauben, können Sie einen neuen Benutzer erstellen und versuchen, mit diesem Benutzer auf die Tabelle WEB_CONTENT zuzugreifen.
Erstellen Sie nun zwei neue Benutzer, CMS_USER und CMS_EDITOR. Schließlich erhält CMS_USER schreibgeschützte Berechtigungen für die Tabelle WEB_CONTENT, und dieser Benutzer wird als Datenbankkonto verwendet, das Inhalte als anonymer Webbenutzer bereitstellt. Das CMS_EDITOR-Konto verfügt über mehr Berechtigungen für die Tabelle und wird als CMS-Editorkonto verwendet (das Konto, das zum Ändern und Verwalten der Daten in der Tabelle benötigt wird).
Neue Benutzer können über die grafische Benutzeroberfläche von XE oder durch Ausführen des folgenden Befehls erstellt werden:
CREATE USER cms_user IDENTIFIED BY cms_user;
ERSTELLEN SIE BENUTZER cms_editor IDENTIFIZIERT VON cms_editor;
(Der Einfachheit halber entspricht das Passwort hier dem Benutzernamen.)
Damit sich beide Konten in der Datenbank anmelden können, müssen wir ihnen die CONNECT-Rolle zuweisen. Aktivieren Sie dazu das Kontrollkästchen „CONNECT“ unter „Benutzerinformationen“ im Abschnitt „Administration/Datenbankbenutzer“ der XE-Grafikoberfläche oder führen Sie den folgenden Befehl aus:
GRANT CONNECT to cms_user;
GRANT CONNECT to cms_editor;
Wenn Sie nun versuchen, sich als Benutzer CMS_USER oder CMS_EDITOR anzumelden und Daten aus der Tabelle WEB_CONTENT zu lesen (wählen Sie * aus hr.web_content;), wird der folgende Fehler angezeigt:
ORA-00942: Tabelle oder Ansicht
existiertnicht.
Um auf die Daten zuzugreifen oder nur die Tabelle anzuzeigen, müssen Sie den Konten CMS_USER und CMS_EDITOR schreibgeschützte Berechtigungen für die Tabelle WEB_CONTENT erteilen:
GRANT SELECT on hr.web_content to cms_user;
GRANT SELECT für hr.web_content an cms_editor;
Der obige Code ermöglicht es diesen beiden Konten, SELECT-Anweisungen für die Tabelle WEB_CONTENT auszuführen. Wenn Sie versuchen, andere Anweisungen auszuführen, wird ein Fehler auftreten. Wenn Sie beispielsweise eine Zeile einfügen:
INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world');
wird die Fehlermeldung
ORA-01031 erzeugt: Unzureichende Berechtigungen,
um CMS_EDITOR das Ändern des Inhalts dieser Tabelle zu ermöglichen. Die folgenden Berechtigungen müssen erteilt werden:
GRANT INSERT,UPDATE,DELETE für hr.web_content an cms_editor.
Von nun an kann das CMS_EDITOR-Konto INSERT-, UPDATE- und DELETE-Anweisungen für die Tabelle WEB_CONTENT ausführen.
Sehen Sie, wie einfach es ist! Es ist ersichtlich, dass die Verwaltung von Berechtigungen über Rollen eine effektivere Methode ist. Wenn die verwendete Oracle-Datenbank nicht XE ist, können Sie die folgenden Vorgänge ausführen:
Erstellen Sie eine Rolle:
CREATE ROLE Reader;
CREATE ROLE Writer;
Rollenberechtigungen gewähren:
GRANT SELECT ON web_content TO Reader;
GRANT INSERT,UPDATE,DELETE ON web_content TO Writer;
Benutzerrolle vergeben:
GRANT Reader TO cms_user;
GRANT reader TO cms_editor (sie müssen auch lesen)
GRANTwriter TO cms_editor;
Beachten Sie, dass sich diese Änderungen auf alle Benutzerkonten mit dieser Rolle auswirken, wenn Sie die Definition der READER-Rolle ändern. Wenn Berechtigungen direkt an Benutzer vergeben werden, muss jedes Benutzerkonto einzeln aktualisiert werden.
Nachdem Sie die oben genannten Schritte ausgeführt haben, können Sie Ihre PHP-Anwendung so konfigurieren, dass sie das CMS_USER-Konto für alle von anonymen Webbenutzern angeforderten Datenbankverbindungen und das CMS_EDITOR-Konto für Verbindungen verwendet, die von passwortgeschützten Verwaltungsseiten initiiert werden. Selbst wenn nun ein öffentliches Webformular kompromittiert wird, sind die Auswirkungen auf die Datenbank minimal, da das CMS_USER-Konto nur über Leseberechtigungen verfügt.
Fazit
In diesem Artikel haben wir nur kurz einige der grundlegendsten Funktionen der Oracle-Datenzugriffssicherheit vorgestellt. Darüber hinaus verfügt Oracle über viele weitere Funktionen, die die Sicherheit Ihrer Webanwendungen auf die nächste Stufe heben – einschließlich Virtual Private Database (VPD) und Tag-Sicherheit.