Datenbank-Profile und Passwort Expiration

13.
Oktober
2020
Veröffentlicht von: Ferhat Atabey

Wenn wieder einmal ein zentraler produktiver Datenbank-Account gesperrt wurde und es nicht an fehlerhaften Login-Versuchen lag, ist gerne auch mal das Datenbank-Profil des Benutzers schuld.

Gerade für produktive Applikations-Accounts, oft auch technische DB-Benutzer genannt, bedeuten abgelaufene Passwörter oder erzwungene Passwortänderungen oftmals viel Aufwand und ungeplanten Stress für die Verantwortlichen auf Seiten der Applikation, aber auch der Datenbank. In vielen Fällen wurde hier vom DBA einfach vergessen, diesem Benutzer ein anderes Datenbank-Profil, als das DEFAULT-Profil, zuzuweisen.

Es ist nämlich eine (unpraktische) Eigenheit des standardmäßigen DEFAULT-Profils, dass Kennwörter nach 180 Tagen ablaufen.

Gut also, dass man in einer Oracle Datenbank auch die Lebensdauer von Passwörtern steuern kann. Datenbank-Profile können aber auch noch mehr.

Was ist ein Datenbank-Profil?

Mit Hilfe von Benutzerprofilen können zwei Bereiche gesteuert werden. So gibt es zum einen eine Sammlung von Parametern, die die Lebensdauer, die Ablaufzeit sowie die Wiederverwendbarkeit von Kennwörtern und das Sperren von Accounts nach Eingabe falscher Passwörter regelt. Zum anderen – in der Praxis jedoch seltener eingesetzt – kann das Benutzerprofil Limitierungen für bestimmte Systemressourcen enthalten. Diese begrenzen zum Beispiel die maximal erlaubte Verbindungszeit einer Session, den Verbrauch an CPU oder die Anzahl an Blöcken, die innerhalb einer Session maximal gelesen werden dürfen.

Profile werden den einzelnen Benutzern einer Datenbank zugewiesen und gelten dann für dieses Benutzerkonto. Benutzerkonten können nur über ein einziges Profil verfügen. Das Zuweisen eines neuen Profils zu einem Benutzerkonto ersetzt alle früheren Profileinstellungen.

Oracle liefert ein DEFAULT-Profil mit, welches jedem Benutzer zugewiesen wird, der nicht explizit ein anderes Profil zugeordnet bekommt. Ein sehr wichtiger und gerne vergessener Aspekt des DEFAULT-Profils ist, dass das Kennwort eines Benutzers damit nach 180 Tagen abläuft.

Schon aus diesem Grund empfiehlt es sich, eigene Profile anzulegen und den Benutzern explizit zuzuweisen. Hierauf wird weiter unten noch eingegangen.
 

Parameter/Ressourcen, die über Profile gesteuert werden können

Mit folgender Abfrage können die Parameter (Spalte RESOURCE_NAME) ermittelt werden, die sich über Profile steuern lassen:

SQL> set lines 120 pages 200
SQL> col profile for a20
SQL> col limit for a15

SQL> SELECT * FROM DBA_PROFILES ORDER BY 1,3,2;

PROFILE              RESOURCE_NAME             RESOURCE LIMIT           COM INH IMP
-------------------- ------------------------- -------- --------------- --- --- ---
DEFAULT              COMPOSITE_LIMIT           KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              CONNECT_TIME              KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              CPU_PER_CALL              KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              CPU_PER_SESSION           KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              IDLE_TIME                 KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              LOGICAL_READS_PER_CALL    KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              LOGICAL_READS_PER_SESSION KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              PRIVATE_SGA               KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              SESSIONS_PER_USER         KERNEL   UNLIMITED       NO  NO  NO
DEFAULT              FAILED_LOGIN_ATTEMPTS     PASSWORD 10              NO  NO  NO
DEFAULT              INACTIVE_ACCOUNT_TIME     PASSWORD UNLIMITED       NO  NO  NO
DEFAULT              PASSWORD_GRACE_TIME       PASSWORD 7               NO  NO  NO
DEFAULT              PASSWORD_LIFE_TIME        PASSWORD 180             NO  NO  NO
DEFAULT              PASSWORD_LOCK_TIME        PASSWORD 1               NO  NO  NO
DEFAULT              PASSWORD_REUSE_MAX        PASSWORD UNLIMITED       NO  NO  NO
DEFAULT              PASSWORD_REUSE_TIME       PASSWORD UNLIMITED       NO  NO  NO
DEFAULT              PASSWORD_VERIFY_FUNCTION  PASSWORD NULL            NO  NO  NO
ORA_STIG_PROFILE     COMPOSITE_LIMIT           KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     CONNECT_TIME              KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     CPU_PER_CALL              KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     CPU_PER_SESSION           KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     IDLE_TIME                 KERNEL   15              NO  NO  NO
ORA_STIG_PROFILE     LOGICAL_READS_PER_CALL    KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     LOGICAL_READS_PER_SESSION KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     PRIVATE_SGA               KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     SESSIONS_PER_USER         KERNEL   DEFAULT         NO  NO  NO
ORA_STIG_PROFILE     FAILED_LOGIN_ATTEMPTS     PASSWORD 3               NO  NO  NO
ORA_STIG_PROFILE     INACTIVE_ACCOUNT_TIME     PASSWORD 35              NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_GRACE_TIME       PASSWORD 5               NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_LIFE_TIME        PASSWORD 60              NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_LOCK_TIME        PASSWORD UNLIMITED       NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_REUSE_MAX        PASSWORD 10              NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_REUSE_TIME       PASSWORD 365             NO  NO  NO
ORA_STIG_PROFILE     PASSWORD_VERIFY_FUNCTION  PASSWORD ORA12C_STIG_VER NO  NO  NO
                                                        IFY_FUNCTION

Im Folgenden gehen wir auf die Parameter vom Ressource-Typ „PASSWORD“ ein, denn diese werden in der Praxis am häufigsten genutzt. Für eine genaue Übersicht der KERNEL-Parameter sei hier auf die Oracle Dokumentation verwiesen.

PASSWORT_LIFE_TIME

Die PASSWORD_LIFE_TIME ist die Zeit in Tagen, die ein Passwort gültig ist. Bei einem Login nach dieser Zeit erhält der Benutzer folgende Fehlermeldung angezeigt:

ORA-28001: the password has expired

Der Benutzer erhält anschließend aber sofort die Möglichkeit, das Passwort zu ändern.
Der Account-Status des Benutzerkontos in der Datenbank ist in diesem Fall EXPIRED.

PASSWORD_GRACE_TIME
Gibt die Anzahl der Tage an, die einem Benutzer bleiben, um sein Kennwort zu ändern bevor es endgültig abläuft. Bei einem Login während dieser Zeit erhält der Benutzer folgende Warnung angezeigt:

ORA-28002: the password will expire within n days

Der Account-Status des Benutzerkontos in der Datenbank ist in diesem Fall EXPIRED(GRACE).

FAILED_LOGIN_ATTEMPTS

Über FAILED_LOGIN_ATTEMPTS wird gesteuert, wie oft ein falsches Passwort hintereinander eingegeben werden kann, bevor der Account gelockt wird. Wird zwischen den Versuchen das Passwort richtig eingegeben, geht die Zählung wieder bei null los.

Der Account-Status des Benutzerkontos in der Datenbank ist nach Überschreiten der Anzahl an ungültigen Login-Versuche LOCKED.

PASSWORD_LOCK_TIME

Wird eine PASSWORD_LOCK_TIME mitgegeben, wird der Account jedoch nur übergangsweise für die entsprechende Anzahl an Tagen gelockt. Nach Ende dieser Zeit wird der Account automatisch wieder entsperrt. Ohne diesen Parameter muss der Benutzer-Account händisch entsperrt werden. Der Account-Status des Benutzerkontos in der Datenbank ist während dieser Phase LOCKED (TIMED).

PASSWORD_VERIFY_FUNCTION:

Die PASSWORD_VERIFY_FUNCTION stellt sicher, dass die Benutzerkennwörter die erforderliche Komplexität besitzen. Oracle liefert selbst Funktionen hierfür mit, u. a. die ora12c_verify_function. Diese Funktion kann mit dem Script $ORACLE_HOME/rdbms/admin/utlpwdmg.sql installiert werden.

Alternativ können auch eigene Passwortfunktionen - am einfachsten basierend auf dieser Oracle Funktion - erstellt werden.

PASSWORD_REUSE_TIME

Begrenzt die Anzahl an Tagen, bevor ein Kennwort nach dessen Ablauf wiederverwendet werden kann. Der Wert UNLIMITED führt hier zu keinen Einschränkungen.

PASSWORD_REUSE_MAX

Gibt an, wie oft ein Kennwort geändert werden muss, bevor es erneut verwendet werden kann. Der Wert UNLIMITED führt hier zu keinen Einschränkungen.
 

Erstellung von Profilen

Mit folgendem Befehl wird ein Profil ohne große Einschränkungen erstellt - wird nur empfohlen für Applikations-Benutzer:

CREATE PROFILE APP_PROFILE LIMIT
  PASSWORD_LIFE_TIME UNLIMITED
  PASSWORD_GRACE_TIME UNLIMITED
  FAILED_LOGIN_ATTEMPTS UNLIMITED
  PASSWORD_LOCK_TIME 1
  PASSWORD_VERIFY_FUNCTION f_ora_pwd_verify_app;

Alle hierbei nicht explizit angegebenen Parameter werden vom DEFAULT-Profil übernommen.

Für Applikations-Benutzer wird ein Profil mit der Passwortgültigkeit UNLIMITED erstellt, so dass das Passwort nicht mehr ablaufen kann. Die Komplexität des Passwords wird über die Funktion SYS. f_ora_pwd_verify_app gesteuert.

Mit folgendem Befehl wird ein Profil für normale Benutzer erstellt:

CREATE PROFILE USER_PROFILE LIMIT
  PASSWORD_LIFE_TIME 90
  PASSWORD_GRACE_TIME 7
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1
  PASSWORD_VERIFY_FUNCTION f_ora_pwd_verify_user;

Für normale Benutzer wird ein Profil mit einer Passwortgültigkeit zwischen 30 und 180 Tagen erstellt, hier 90 Tage. Der Account wird für einen Tag gesperrt, falls es zu mehr als 5 fehlerhaften Login-Versuchen kommt. Die Komplexität des Passwords wird über die Funktion SYS. f_ora_pwd_verify_app gesteuert.
 

Zuweisung von Profilen

Die Zuweisung eines Profils zu einem Benutzer erfolgt mit CREATE USER oder ALTER USER.

SQL> CREATE USER MUNIQSOFT_APP … PROFILE APP_PROFILE;

oder

SQL> ALTER USER MUNIQSOFT_USER PROFILE USER_PROFILE;


Das Profil eines Benutzers anzeigen

So ermitteln sie, welcher Benutzer aktuell welches Profil besitzt:

SQL> col username for a20
SQL> col account_status for a20
SQL> col profile for a20
SQL> SELECT username, account_status, expiry_date, profile FROM dba_users where username like 'MUNIQSOFT%';

USERNAME             ACCOUNT_STATUS       EXPIRY_D PROFILE
-------------------- -------------------- -------- --------------------
MUNIQSOFT_APP        OPEN                          APP_PROFILE
MUNIQSOFT_USER       OPEN                 24.12.20 USER_PROFILE


Ändern von Profilen

Das Ändern von Profilen erfolgt mittels ALTER PROFILE:

SQL> ALTER PROFILE APP_PROFILE LIMIT PASSWORD_LIFE_TIME 1;

Alle nicht genannten Parameter behalten ihren aktuellen Wert bei.


Löschen eines Profiles

Das Löschen von Profilen erfolgt mittels DROP PROFILE, und kann nur mittels CASCADE gelöscht werden, sollte es aktuell noch Benutzern zugewiesen sein:

SQL> DROP PROFILE APP_PROFILE;

ORA-02382: Profil APP_PROFILE hat zugewiesene Benutzer, kann nicht ohne CASCADE gelöscht werden

Dann eben so:

SQL> DROP PROFILE APP_PROFILE CASCADE;

Profile APP_PROFILE gelöscht.

Besser als mit der Option CASCADE ist es natürlich, den Benutzern vor dem Löschen des alten Profils explizit ein neues zuzuweisen.

Alle Benutzer, die das gelöschte Profil zugewiesen hatten, erhalten nun automatisch das DEFAULT-Profil.

SQL> SELECT username, account_status, expiry_date, profile FROM dba_users where username like 'MUNIQSOFT%';

USERNAME             ACCOUNT_STATUS       EXPIRY_D PROFILE
-------------------- -------------------- -------- --------------------
MUNIQSOFT_APP        OPEN                          DEFAULT
MUNIQSOFT_USER       OPEN                 24.12.20 USER_PROFILE


Steuerung von System-Ressourcen über Profile

Soll die Verwendung von System-Ressourcen ebenfalls über die Profile limitiert werden, muss zusätzlich der INIT-Parameter RESOUCRE_LIMIT auf TRUE gesetzt werden:

SQL> SHOW PARAMETER RESOURCE_LIMIT;

NAME                TYPE            VALUE
------------------- --------------- ------------
resource_limit      boolean         FALSE

SQL> ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;
SQL> SHOW PARAMETER RESOURCE_LIMIT;

NAME                TYPE            VALUE
------------------- --------------- ------------
resource_limit      boolean         TRUE

Für die Steuerung von Account/Passwortlaufzeiten oder ähnliches ist dieser Schritt nicht notwendig.


Best Practices bei der Implementierung von Profilen

In Unternehmen werden überwiegend die Passwortrichtlinien mit Profilen gesteuert. Die Limitierung von Systemressourcen kommt zunehmend vor, spielt aber nach unseren Erfahurngen eine nicht ganz so große Rolle.

Es ist Best Practice, mindestens drei Arten von Profilen einzurichten. Diese sind:

Profil für technische User/Applikationsuser:

  • komplexe Passwörter
  • lange, wenn nicht gar unbegrenzte Passwortgültigkeit.
    Achtung: natürlich muss bei den Laufzeiten für die Passwörter IMMER zwischen Security und Aufwand abgewogen werden.
  • Kein Sperren des Accounts nach fehlerhaften Login-Versuchen, um die Verfügbarkeit der Anwendungen nicht zu beeinträchtigen. Hier sollte aber unbedingt ein Monitoring und Alerting erfolgen, um eventuelle Hackerangriffe zu entdecken.
  • Unbegrenzte Session-Laufzeiten

Profil für Datenbankadministratoren und weitere Admins:

  • komplexe Passwörter
  • kürzere Passwortgültigkeit (zum Beispiel 30 Tage)
  • unbegrenzte Session-Laufzeiten/CPU-Verbrauch
  • Locken des Accounts nach 5 fehlerhaften Login-Versuchen

Profil für die normalen Benutzer (personalisierte Accounts):

  • nicht ganz so komplexe Passwortregeln wie für die Datenbankadministratoren
  • kürzere Passwortgültigkeit (zum Beispiel 30 - 180 Tage)
  • Abbrechen von (inaktiven) Sessions nach einer bestimmten Zeit, Limitierung von CPU-/Lesevorgängen


Wichtig ist auch noch der folgende Punkt:

Die beiden Profilparameter password_reuse_max und password_reuse_time erlauben mit dem Default UNLIMITED die erneute Verwendung desselben Passworts zu jeder Zeit. Zur Sicherheit empfehlen wir einen oder beide Parameter ungleich UNLIMITED zu setzen.

Sollten Sie Fragen hierzu haben, wenden Sie sich gern an uns.

 

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.