ORA-28221 bei Änderung des eigenen Passwortes

Dieser Blogeintrag beschäftigt sich mit dem ORA-28221 Fehler, der beim Versuch das eigene Passwort zu ändern ausgelöst werden kann und zeigt mehrere mögliche Lösungen für dieses Problems.

Demo-Umgebung

Für die Demonstration verwende ich die folgende Demo-Umgebung.

SQL> SELECT BANNER FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE 12.1.0.1.0  Production
TNS for Linux: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

Zusätzlich wurden die folgenden Objekte in der Datenbank angelegt.

SQL> -- Password Verify Function definieren 
SQL> CREATE OR REPLACE FUNCTION DEMO_PWD_VERIFY (
   username     VARCHAR2, 
   password     VARCHAR2, 
   old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
   RETURN TRUE;
END;
/
  
SQL> -- Profil erstellen
SQL> CREATE PROFILE DEMO_PROFILE LIMIT PASSWORD_VERIFY_FUNCTION DEMO_PWD_VERIFY;
  
SQL> -- Demo Benutzer erstellen
SQL> CREATE USER DEMO_PWD IDENTIFIED BY demo PROFILE DEMO_PROFILE;
SQL> GRANT CREATE SESSION TO DEMO_PWD;

Problembeschreibung

Bei dem Versuch das eigene Passwort zu ändern, wird eine ORA-28221 Fehlermeldungen ausgelöst.

SQL> CONNECT demo_pwd/demo 
Connected.

SQL> ALTER USER demo_pwd IDENTIFIED BY demoNEU; 
ALTER USER demo_pwd IDENTIFIED BY demoNEU
*
ERROR at line 1:
ORA-28221: REPLACE not specified

Die Ursache für dieses Problem ist die Verwendung einer Password Verify Function. Mithilfe der folgenden Abfrage können Details zu dem verwendeten Benutzerprofil eingesehen werden.

SQL> -- Anmeldung als SYS 
SQL> CONNECT / AS SYSDBA
SQL> SET linesize 250 pagesize 100
SQL> COL limit FOR a30
SQL> SELECT resource_name, limit 
       FROM dba_profiles 
      WHERE profile = (SELECT profile 
                         FROM dba_users 
                        WHERE username = 'DEMO_PWD')
   ORDER BY resource_name;
  
RESOURCE_NAME                    LIMIT
-------------------------------- ------------------------------
COMPOSITE_LIMIT                  DEFAULT
CONNECT_TIME                     DEFAULT
CPU_PER_CALL                     DEFAULT
CPU_PER_SESSION                  DEFAULT
FAILED_LOGIN_ATTEMPTS            DEFAULT
IDLE_TIME                        DEFAULT
LOGICAL_READS_PER_CALL           DEFAULT
LOGICAL_READS_PER_SESSION        DEFAULT
PASSWORD_GRACE_TIME              DEFAULT
PASSWORD_LIFE_TIME               DEFAULT
PASSWORD_LOCK_TIME               DEFAULT
PASSWORD_REUSE_MAX               DEFAULT
PASSWORD_REUSE_TIME              DEFAULT
PASSWORD_VERIFY_FUNCTION         DEMO_PWD_VERIFY
PRIVATE_SGA                      DEFAULT
SESSIONS_PER_USER                DEFAULT

Lösung

Alle vorgestellten Lösungen basieren auf der oben genannten Demo-Umgebung.

REPLACE angeben

Die einfachste und auch empfohlende Lösung ist die Übergabe des alten Passwortes durch das Hinzufügen des REPLACE Zusatzes.

SQL> -- Anmeldung als DEMO_PWD Benutzer
SQL> CONNECT demo_pwd/demo

SQL> -- Änderung des Passwortes
SQL> ALTER USER demo_pwd IDENTIFIED BY demoNEU REPLACE demo;

User altered.

ALTER USER Privileg vergeben

Als zweite Lösung kann dem Benutzer das ALTER USER Privileg zugewiesen werden. Da das ALTER USER Privileg noch weitere Rechte mit einschließt, sollte diese Lösung nur in Ausnahmefällen verwendet werden.

SQL> -- Anmelden als SYS
SQL> CONNECT / AS SYSDBA

SQL> -- Grant vergeben 
SQL> GRANT ALTER USER TO demo_pwd;

Anschließend kann der Benutzer das Kennwort mit dem gewohnten Kommando ändern.

SQL> -- Anmeldung als DEMO_PWD Benutzer 
SQL> CONNECT demo_pwd/demo

SQL> -- Änderung des Passwortes
SQL> ALTER USER demo IDENTIFIED BY demoNEU;

User altered.

Neues Profil ohne Password Verify Function erstellen

Wird das ALTER USER Kommando zum Ändern des Passwortes zum Beispiel durch eine Anwendung generiert, die nicht geändert werden kann, kann als Workaround ein spezielles Profil für den betroffenen Benutzer erstellt werden. Das neue Profil darf keinePassword Verify Function gesetzt haben.

SQL> -- Anmelden als SYS
SQL> CONNECT / AS SYSDBA

SQL> -- Profil erstellen 
SQL> CREATE PROFILE DEMO_PROFILE_NEW LIMIT PASSWORD_VERIFY_FUNCTION NULL;

SQL> -- Profil dem Benutzer hinzufügen
SQL> ALTER USER demo_pwd PROFILE DEMO_PROFILE_NEW;

Anschließend kann der Benutzer das Kennwort mit dem gewohnten Kommando ändern.

SQL> -- Anmeldung als DEMO_PWD Benutzer
SQL> CONNECT demo_pwd/demo

SQL> -- Änderung des Passwortes
SQL> ALTER USER demo IDENTIFIED BY demoNEU;

User altered.

Der Nachteil dieser Lösung ist der, dass die Passwortrichtlinien nicht eingehalten werden müssen.

Referenzen

Leave a Reply

Your email address will not be published. Required fields are marked *