Kontrollierte Benutzerzugriffe auf eine Oracle-Datenbank
Heute beschäftigte ich mich mal mit dem Logon-Trigger, weil der mir vor kurzem auch mal über den Weg lief.
Um unkontrollierte Benutzerzugriffe auf eine Oracle-Datenbank , durch bestimmte Benutzer, oder durch bestimmte Rechner, zu unterbinden, kann als wirksame Maßnahme, ein Logon-Trigger auf der Oracle-Datenbank angelegt werden. Somit kann sich der Benutzer auch nicht anmelden, falls er den User und das Passwort weiß. ;-)
Der Logon-Trigger ist ähnlich aufgebaut, wie die Insert-, Update-, Delete-Trigger, die auf einer Tabelle liegen. Allerdings zündet der Logon-Trigger, bei der Anmeldung eines Benutzers an die Datenbank. Hier kann er eine Aktion ausführen, wie zum Beispiel eine Benutzer- oder Rechnernamenüberprüfung. Hierfür liest sich die Stored Procedure des Triggers den Benutzernamen und den Rechnernamen aus der Systemumgebung aus und überprüft diesen gegen einen festen Wert oder einen Tabelleneintrag und schaut, ob die Anmeldung berechtigt ist. Falls diese berechtigt ist, wird der Zugriff auf die Datenbank freigegeben, falls nicht, wird eine Fehlermeldung angezeigt.
CREATE OR REPLACE TRIGGER SYSTEM.checkUserLogon
AFTER LOGON ON DATABASE
DECLARE
rechnername VARCHAR2(80); -- Variable für Rechnernamen
os_username VARCHAR2(80); -- Variable für Username
errormessage VARCHAR2(1000); -- Error message to be printed
userException EXCEPTION; -- Zugriffs-Exception
BEGIN
-- Holt die Informationen aus dem USERENV context
rechnername := sys_context('USERENV','TERMINAL');-- Rechner
os_username := sys_context('USERENV','OS_USER');-- User
-- Zieht nur bei Oracle-User (Schema) = 'SCOTT'
IF ( user LIKE 'SCOTT%' ) THEN
-- Zugriff für Benutzer 'fred' auf dem Rechner 'JUPITER'
IF ( os_username != 'fred' OR rechnername != 'JUPITER') THEN
RAISE userException ;
END IF;
END IF;
EXCEPTION
WHEN userException THEN
errormessage := 'Sie haben leider keine Berechtigung für ';
errormessage := errormessage || 'diese Datenbank !';
RAISE_APPLICATION_ERROR(-20002,errormessage);
WHEN OTHERS THEN
errormessage := 'FATAL ERROR - checkUserLogon - Bitte ';
errormessage := errormessage || 'kontaktieren Sie den Help';
errormessage := errormessage || 'desk' || CHR(10) || SQLERRM;
RAISE_APPLICATION_ERROR(-20003, errormessage);
END;
/
Dieses Beispiel sollte auf allen Oracle-Datenbanken ab der Version 9.0 ohne Veränderungen lauffähig sein. Getestet habe ich den Logon-Trigger auf einer Oracle 9i-RDBMS-Datenbank (Version 9.2.0.6).
Achtung:
Bei der Benutzung von Logon Triggern, muß man Vorsicht walten lassen, denn ein fehlerhafter Logon Trigger kann verhindern, dass sich noch ein Benutzer an der Datenbank anmelden kann. Glücklicherweise zünden Logon Trigger nicht für den Benutzer SYS, der dann in dieser Notsituation den Trigger wieder löschen oder anpassen kann.
Weitere Infos zu Logon-Triggern findet Ihr hier:
MuniQSoft – Oracle Logon Trigger