Ausgesperrt

Samstag 22:00 Uhr: Für 32 Systeme wird der monatliche Windows Patchday abgespult. Eine oder zwei Überraschungen gibt es immer. Diesmal trifft es das Portal – wäre auch Zufall, dass es ausnahmsweise ohne Fehler durchläuft. Laut Protokoll kann sich der Java Stack nicht mehr mit der Oracle Datenbank verbinden. Der User für den JDBC Zugriff ist angeblich ungültig. Wie üblich bei solchen Fehlern lief das System bis zum Stopp vor einer Stunde einwandfrei. Wenigstens etwas Herausforderung bei der ansonsten langweiligen Fließbandarbeit. 

Wenig später ist die Ursache gefunden. Für die Kollegen, die die Konfiguration verbrochen haben, gibt es jetzt im Nachgang diesen Blogbeitrag. Falsch konfiguriert, laufen Oracle Passwörter ab und die zugehörigen Accounts werden ungültig. Das scheint für den einen oder anderen 7 Jahre nach Freigabe von Oracle 11g immer noch ein Geheimnis zu sein. Liegt das Datum im Feld EXPIRY_DATE der Tabelle DBA_USERS in der Vergangenheit, ist der Account abgelaufen und kann nicht mehr genutzt werden. Ein Test ergibt:

SQL> SELECT username,profile,expiry_date FROM dba_users;
USERNAME            PROFILE           EXPIRY_DATE
------------------- ----------------- ---------------
SAPSR3DB            DEFAULT           07-MAY-16

Für technische User kann man sich schwer tun, den Sinn des Passwortablaufs zu erkennen. Insbesondere in der SAP Welt, wo in der Datenbank in der Regel keine personalisierte Benutzer verwendet werden. Bei richtiger Konfiguration wird dem SAP Benutzer einmalig ein Profil ohne Ablaufdatum zugeordnet.  Fakt ist jedenfalls, dass bei zugeordnetem DEFAULT Profil das Passwort nach ca. ½ Jahr ungültig und der Account abgelaufen ist.

SQL> SELECT * FROM dba_profiles WHERE resource_name LIKE 'PASS%LIFE%';
PROFILE          RESOURCE_NAME        RESOURCE LIMIT
---------------- -------------------- -------- ------------
DEFAULT          PASSWORD_LIFE_TIME   PASSWORD 180
SAPUPROF         PASSWORD_LIFE_TIME   PASSWORD UNLIMITED

SAP stellt genau dafür das Profil SAPUPROF bereit, bei dem das Passwort unbegrenzt gültig ist. Nach der Zuweisung des Profils per ALTER USER SAPSR3DB PROFILE SAPUPROF ändert sich das Ablaufdatum des Benutzers jedoch leider nicht. Das passiert sobald man das Passwort des Benutzers eingibt oder ändert. Getreu Murphys Gesetz lässt sich das mitten in der Nacht nicht in der Passwortdatenbank finden. Derjenige der das System eingerichtet hat, hat ganze Arbeit geleistet.

In alten Versionen konnte man den verschlüsselten Passwort Hash aus der DBA_USERS Tabelle kopieren. Oracle verstand bei der Eingabe einen Wert in Anfürhufnszeichen als verschlüsseltes Passwort. Damit war ohne viel Aufwand der Benutzer wieder entsperrt, man hatte aber noch das gleiche Passwort. Der Ordnung halber, die Kommandos für alte Oracle Versionen.

SQL> SELECT USER,password FROM dba_users;
USER           PASSWORD
-------------- ------------------------------
SAPSR3DB       2D594E86F93B17A1
 
SQL> ALTER USER sapsr3db IDENTIFIED BY '2D594E86F93B17A1';
 

Ärgerlich, wenn man solch eine Aktion nur einmal pro Jahr durchführen muss und mit aktuellen Oracle Versionen das Passwort anderweitig abgelegt wird. Mit der Einführung des Ablaufs von Passwörtern wird das Feld PASSWORD in der DBA_USERS Tabelle nicht mehr verwendet. Eine Recherche in der Dokumentation unseres CCMX Oracle Datensammlers deutet darauf hin, dass SYS.USER$ ein guter Fundort ist. Zudem hält das Web ausreichend Information über die Sachlage für mich bereit. Es gibt genaugenommen zwei Wege den Passwort Hash auszulesen. Zum einen direkt aus der Systemtabelle SYS.USER$ und den zwei Feldern PASSWORD und SPARE4. Die Tabelle liegt dem View DBA_USERS zugrunde.

SQL> SELECT password,spare4 FROM sys.USER$ WHERE name = 'SAPSR3DB';
PASSWORD           SPARE4
------------------ ----------------------------------------------
51C398DB32202E46   S:83AEA4261714B116B92A9B0CE56F9D531635EFB7

Alternativ ist die Verwendung des Pakets DBMS_METADATA.GET_DDL möglich.

SQL> SELECT dbms_metadata.get_ddl('USER','SAPSR3DB') FROM dual;
DBMS_METADATA.GET_DDL('USER','SAPSR3DB')
-------------------------------------------------------------------
CREATE USER "SAPSR3DB" IDENTIFIED BY VALUES
  'S:83AEA4261714B116B92A9B0CE56F9D531635EFB7;51C398DB32202E46'
  DEFAULT TABLESPACE "PSAPSR3DB"
  TEMPORARY TABLESPACE "PSAPTEMP"
  PROFILE "SAPUPROF"

Sehr praktisch. Nicht nur die notwendigen Felder sondern auch direkt die richtige Schreibweise zum Setzen des Passworts wird ausgegeben. SPARE4 basiert auf der SHA1 Hashfunktion. Man könnte sich also vortrefflich über die Sicherheit streiten. Aber das ist ein Thema für eine separate Recherche. Der Benutzer wird kurzerhand mit einem 

ALTER USER SAPSRDB IDENTIFIED BY VALUES
'S:83AEA4261714B116B92A9B0CE56F9D531635EFB7;51C398DB32202E46';

freigeschaltet. EXPIRY_DATE ist leer, JDBC funktioniert und damit startet die SAP Java Instanz wieder. Fazit: Ein Patchday ist immer gut für eine Erfahrung.

Autor: Bernd HabichWebsite: /index.php/prof/profile-hab