1. Start
  2. Unternehmen
  3. Blog
  4. Schema Nutzer oder persönliche Benutzer

Schema Nutzer oder persönliche Benutzer

Einleitung

In einer Oracle Datenbank werden Schemas und Benutzer praktisch synonym verwendet. Ein Benutzer kann sich an einer Datenbank anmelden und entsprechend der erhaltenen Berechtigungen Aktionen durchführen. Ein Schema ist eine Sammlung von zusammengehörigen Datenbankobjekten wie Tabellen, Views oder PL/SQL-Teile. Im Grunde wird ein Benutzer zu einem Schema, sobald er Objekte besitzt, es gibt keine weitere Unterscheidung. Der Besitzer eines Datenbankobjekts darf mit seinen eigenen Objekten uneingeschränkt arbeiten, er verfügt praktisch über administrative Berechtigungen für all seine Objekte. Lediglich der Zugriff auf fremde Objekte, also Objekte in anderen Schemas bzw. Objekte, die einem anderen Benutzer gehören, kann über die Vergabe oder den Entzug von Berechtigungen gesteuert werden.

Das Problem

Dieses Konzept führt dazu, dass Änderungen am Datenmodell bzw. an Datenbankobjekten als der Besitzer der Objekte durchgeführt werden. Anders ausgedrückt, man meldet sich als der Besitzer der Objekte an der Datenbank an. Arbeiten also mehrere Personen an einem Projekt, so ist jeder im Besitz der Zugangsdaten für diesen Datenbankbenutzer. Außerdem ist man dann relativ anonym in der Datenbank. Herauszufinden, welche Person als Schema Eigner (Besitzer der Objekte) angemeldet ist, kann sich recht aufwändig gestalten.

Natürlich könnte man für jede Person, die Änderungen am Datenmodell durchführen soll, einen separaten Datenbankbenutzer erstellen und diesen mit Berechtigungen auf die Objekte im Schema ausstatten. Allerdings kann man dann immer noch keine neuen Objekte in fremden Schemas erstellen. Das geht nur, wenn man über das ensprechende ANY Privilege, wie z.B. CREATE ANY TABLE, verfügt. Solche mächtigen Berechtigungen sollten aber unbedingt vermieden werden. Was kann man also tun?

Die Lösung

Um das Schema, in dem man arbeitet, und die Authentifizierung, also die Anmeldung an der Datenbank, zu trennen, hat Oracle das Konzept der Proxy User etabliert. Als Proxy User kann man sich an fremden Datenbankschemas anmelden, sofern man über das entsprechende Recht verfügt. Ist das der Fall, kann arbeiten, als wäre man direkt am Datenbankschema angemeldet. 

Im Beispiel wird ein Schemaeigner sowie ein persönlicher Datenbankbenutzer erstellt. Dabei wird das neue 18c Feature der passwortlosen Accounts für den Schemaeigner zum Einsatz gebracht. Es genügt aber auch, den Account des Schemaeigners zu sperren.

 

SYS @ ORCL19:PDB1:>create user app_owner no authentication default tablespace users quota unlimited on users;


User APP_OWNER created.

SYS @ ORCL19:PDB1:>grant create session, create table, create view to app_owner;

Grant succeeded.

SYS @ ORCL19:PDB1:>create user marco identified by "S3cr3T" ;

User MARCO created.

SYS @ ORCL19:PDB1:>grant create session to marco;

Grant succeeded.

 

Der Schemaeigner hat also Berechtigungen zum Anlegen von Tabellen und Views während der persönliche Benutzer sich lediglich anmelden darf. Wie kann sich der persönliche Benutzer nun am anderen Schema anmelden? Dazu wird der persönliche Benutzer zum Proxy User für den Schemaeigner gemacht.

 

SYS @ ORCL19:PDB1:>alter user app_owner grant connect through marco;

User APP_OWNER altered.

 

  Wenn man sich nun einfach nur wie gewohnt mit dem persönlichen Nutzer anmeldet, dann kann man erst einmal nicht viel tun.

 

SYS @ ORCL19:PDB1:>conn marco/"S3cr3T"@vm160:1521/PDB1.support.robotron.de
Connected.

MARCO @ ORCL19:PDB1:>create table emp(id number, emp_name varchar2(100));

Error starting at line : 1 in command -
create table emp(id number, emp_name varchar2(100))
Error report -
ORA-01031: insufficient privileges

 

Aber man wilj auch gar keine Objekte im eigenen Schema anlegen sondern im Applikationsschema. Dazu muss man die Verbindung zur Datenbank anders aufbauen, um als Proxy User agieren zu können.

 

SYS @ ORCL19:PDB1:>conn marco[app_owner]/"S3cr3T"@vm160:1521/PDB1.support.robotron.de
Connected.
APP_OWNER @ ORCL19:PDB1:>show user
USER is "APP_OWNER"

APP_OWNER @ ORCL19:PDB1:>create table emp(id number, emp_name varchar2(100));

Table EMP created.

APP_OWNER @ ORCL19:PDB1:>create table dept(id number, depname varchar2(30));

Table created.

 

Wie man sieht, bewegt man sich nach der Anmeldung so, als hätte man sich direkt am Schema angemeldet. Und man sieht auch, dass man nun offenbar auch über die Berechtigungen des Schemaeigners verfügt, denn man kann Tabellen erstellen. 

Auditierung

Wie kommt man nun an die Information, wer wann im Schema etwas verändert hat bzw. angemeldet war? Dazu kommt eine Audit Policy zum Einsatz, die alle Anmeldungen protokolliert. Oracle bringt zwar bereits eine Policy mit, diese protokolliert aber lediglich die fehlgeschlagenen Anmeldungen.

 

SYS @ ORCL19:PDB1:>create audit policy ap_logons actions logon, logoff;

Audit POLICY created.

SYS @ ORCL19:PDB1:>audit policy ap_logons;

Audit succeeded.

 

Zum Testen versucht man entsprechende Verbindungen zur Datenbank aufzubauen, einmal direkt als Schemaeigner, einmal mit dem persönlichen Benutzer und einmal als Proxy User.

 

SYS @ ORCL19:PDB1:>conn app_owner/"S3cr3T"@vm160:1521/PDB1.support.robotron.de
  USER          = app_owner
  URL           = jdbc:oracle:oci8:@vm160:1521/PDB1.support.robotron.de
  Error Message = ORA-01017: invalid username/password; logon denied
  USER          = app_owner
  URL           = jdbc:oracle:thin:@vm160:1521/PDB1.support.robotron.de
  Error Message = ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

SYS @ ORCL19:PDB1:>conn marco/"S3cr3T"@vm160:1521/PDB1.support.robotron.de
Connected.

MARCO @ ORCL19:PDB1:>conn marco[app_owner]/"S3cr3T"@vm160:1521/PDB1.support.robotron.de
Connected.

 

Im Audit Trail der Datenbank spiegeln sich diese Versuche dann wie folgt wider:

 

SYS @ ORCL19:PDB1:>select  EVENT_TIMESTAMP, USERHOST, DBUSERNAME, DBPROXY_USERNAME, CLIENT_PROGRAM_NAME, ACTION_NAME, RETURN_CODE, CLIENT_IDENTIFIER, UNIFIED_AUDIT_POLICIES from unified_audit_trail
  2* where EVENT_TIMESTAMP>trunc(current_timestamp) order by 1;

               EVENT_TIMESTAMP                     USERHOST    DBUSERNAME    DBPROXY_USERNAME                           CLIENT_PROGRAM_NAME             ACTION_NAME    RETURN_CODE    CLIENT_IDENTIFIER           UNIFIED_AUDIT_POLICIES
______________________________ ____________________________ _____________ ___________________ _____________________________________________ _______________________ ______________ ____________________ ________________________________
17.05.24 11:16:35,640086000    vm160.support.robotron.de    APP_OWNER                         java@vm160.support.robotron.de (TNS V1-V3)    LOGON                             1017                      ORA_LOGON_FAILURES, AP_LOGONS
17.05.24 11:16:37,090726000    vm160.support.robotron.de    APP_OWNER                         SQLcl                                         LOGON                             1017                      ORA_LOGON_FAILURES, AP_LOGONS
17.05.24 11:16:54,933830000    vm160.support.robotron.de    MARCO                             java@vm160.support.robotron.de (TNS V1-V3)    LOGON                                0                      AP_LOGONS
17.05.24 11:17:00,898739000    vm160.support.robotron.de    MARCO                             java@vm160.support.robotron.de (TNS V1-V3)    PROXY AUTHENTICATION                 0                      AP_LOGONS
17.05.24 11:17:00,906957000    vm160.support.robotron.de    APP_OWNER     MARCO               java@vm160.support.robotron.de (TNS V1-V3)    LOGON                                0                      AP_LOGONS
17.05.24 11:17:00,923093000    vm160.support.robotron.de    MARCO                             java@vm160.support.robotron.de (TNS V1-V3)    LOGOFF                               0                      AP_LOGONS
17.05.24 11:17:09,595957000    vm160.support.robotron.de    APP_OWNER     MARCO               java@vm160.support.robotron.de (TNS V1-V3)    LOGOFF                               0                      AP_LOGONS

 

Man sieht den ersten fehlgeschlagenen Anmeldeversuch als Schemaeigner mit dem Fehlercode 1017. Danach folgt die erfolgreiche Anmeldung mit dem persönlichen Benutzer. Die letzten vier Zeilen stellen die Anmeldung als Proxy User dar. Man sieht, dass zuerst die Anmeldung mit dem persönlichen Account erfolgt, gefolgt vom Wechsel in das Anwendungsschema per PROXY AUTHENTICATION. Die Abmeldung besteht dann ebenfalls wieder aus zwei Schritten.

Fazit

Proxy User sind eine gute und einfache Möglichkeit, Anwendungsschemas und Benutzeraccounts voneinander zu trennen und damit mehr Sicherheit und Nachvollziehbarkeit zu erreichen. Die Sicherheit kann man weiter erhöhen, in dem man das Recht zum Anmelden als Proxy User nur vergibt, wenn es erforderlich ist und anschließend wieder entzieht.

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich