Archive for the Administration category

Oracle – Tabellen eines Tablespaces anzeigen

Es war einmal wieder so weit:
Neulich kam eine Mail, dass der Tablespace dabei ist wegen Überfüllung die Arbeit einzustellen. Man sollte doch bitte prüfen, welche Tabellen von dem Tablespace gelöscht werden können.

Zunächst setzt dies natürlich voraus, dass man die Tabelle sys.dba_segments sehen darf.
Sofern man das darf, lässt man sich zunächst die Tabellen nach Relevanz, in diesem Falle die Größe, anzeigen und prüft mit gesundem Augenmaß, welche Tabelle gelöscht werden kann:
read more…

In: Administration, Oracle, SQLAuthor: Sven BrömerComments (0)

Sinnvolle und unsinnige Festlegungen bei Passwörtern

Spätestens beim Einrichten einer neuen Datenbank steht jeder Oracle-DBA vor der Frage, was für Passwörter er zulassen soll.

In Oracle besteht die Möglichkeit, das neue Passwort eines Benutzers durch eine selbstdefinierte Prozedur zu überprüfen, damit es nicht zu trivial ausfällt und somit nicht zu einfach erraten werden kann. Aber wie soll eine solche Prüffunktion aussehen?

Zum Glück hat Oracle bereits ein Beispiel mitgeliefert. Im Verzeichnis

“ORACLE_BASE/ORACLE_HOME/RDBMS/ADMIN”

befindet sich das Skript “UTLPWDMG.SQL”. Führt man dieses Skript mit SQL*Plus als SYSDBA aus, so werden zwei Funktionen implementiert: verify_function_11G und verify_function (für Datenbanken älter als 11G). Mit dem SQL-Befehl:

ALTER PROFILE default LIMIT
PASSWORD_VERIFY_FUNCTION verify_function_11G;

wird die Prüffunktion verify_function_11G für alle Benutzer aktiviert.
Damit müssen alle Passwörter die folgenden Kriterien erfüllen:

  • Das Passwort muss eine Länge zwischen 8 und 30 Zeichen (je einschließlich) haben
  • Das Passwort darf nicht identisch mit dem Benutzernamen sein, oder dem Benutzernamen rückwärts geschrieben, oder dem Benutzernamen plus Zahlen
  • Ebenfalls nicht zulässig als Passwort ist der Servername sowie der Servername plus Zahl zwischen 1 und 100 (je einschließlich)
  • Zu triviale Passwörter wie etwa oracle1, abcdefg1, user1234 etc. sind ebenfalls nicht erlaubt
  • Das Passwort muss minde*stens einen Buchstaben und mindestens eine Zahl enthalten
  • Das Passwort muss sich vom vorherigen Passwort um mindestens drei Zeichen unterscheiden.

Diese Festlegungen erscheinen alle sinnvoll. Dennoch empfehle ich, das Skript UTLPWDMG.SQL an einem Punkt zu ändern. Dies betrifft nicht
die Funktionen, sondern einen Befehl, der direkt nach der Definition der Funktion verify_function_11G ausgeführt wird. Er lautet:

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
[...]

Diese beiden Parameter bewirken, dass die Benutzer alle 180 Tage ein neues Passwort vergeben müssen. Der zweite setzt eine
“Gnadenfrist” (“grace time”) von sieben Tagen für die Vergabe eines neuen Passworts.

Auf den ersten Blick erscheint dies eine sinnvolle Steigerung der Passwortsicherheit zu sein. In der Praxis zeigt sich
jedoch, damit jede Menge Nachteile einhergehen, vor allem in Kombination mit den obigen Bedingungen. So werden sich die
meisten Benutzer einfach zwei Passwörter ausdenken und zwischen diesen hin- und herschalten. Außerdem gewöhnen sich
Benutzer an ihr Passwort. Wenn sie nun gezwungen werden, es zu ändern, dann geschieht es oft, dass sie am nächsten
Arbeitstag das neue Passwort vergessen haben – und dann die Administratoren um Hilfe beim Zurücksetzen des Passworts
bitten müssen. Oder sie schreiben sich das neue Passwort auf – tun also genau das, vor dem seit Jahrzehnten alle
Sicherheitsratgeber warnen. Der Hauptnachteil jedoch ist, dass auch für reine Batch-User nun eine PASSWORD_LIFE_TIME
von 180 Tagen gilt, wie Robert Marz in seinem Artikel Stolpersteine bei der Migration auf Oracle 11g (R2) ausführt. Daher empfehle
ich, entweder das Skript UTLPWDMG.SQL so abzuändern, dass der Befehl lautet:

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED
[...]

oder nach Ausführung des Skripts den Befehl

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

als SYSDBA von Hand auszuführen.

In: Administration, Oracle, PL/SQL, SQLAuthor: Volkmar KuhnleComments (0)

Oracle Routing Engine einsetzen für LKW-Routen

Seit Oracle 10g verfügt Oracle Spatial über die Routing Engine. Diese ermöglicht es, direkt in der Datenbank Routen zu berechnen und in verschiedenen Formen (Geometrien, Wegbeschreibungen) auszugeben.

In Oracle 11gR2 wurde die Routing Engine erweitert. Sie basiert jetzt auf dem Network Data Model (NDM). Dies ermöglicht es, das Routing-Netzwerk um zusätzliche Informationen und Parameter zu erweitern. Ein Anwendungsfall für diese Erweiterung ist Truck Routing.

Eine mit normalem Oracle Routing (ohne Zusatzinformationen) berechnete Route ist für PKWs benutzbar, aber nicht unbedingt für LKWs. Hierzu ein Beispiel: Wir berechnen eine Route von Hamburg nach Westerland/Sylt. Die vom Router errechnete Strecke verwendet u.a. zwischen Billund und Westerland den DB Autoreisezug. Nehmen wir nun an, wir wollen die gleiche Strecke mit einem LKW (Gewicht: 20 t, Höhe: 4,30 m) einsetzen. Für diesen LKW ist die Route nicht benutzbar, da der Autoreisezug Fahrzeuge nur bis zu einer maximalen Höhe von 4,05 m transportiert. Ergänzt man jedoch das Routing Network um Truckattribute, gibt die Routing Engine eine ca. 40 km längere Strecke zurück, die über die dänische Insel Rømø führt. Letztere ist mit Sylt verbunden durch eine Fähre, die auch 4,30 m hohe LKWs transportieren kann.

Die Truckattribute werden im Normallfall als Zusatztabelle zu den Oracle Routing Daten geliefert (Hinweis: Je nach Lizenz muss diese Tabelle ggf. zusätzlich erworben werden, für Details fragen Sie bitte den  für Sie zuständigen Oracle-Vertriebsmitarbeiter). Sind sie installiert, so können die bereits bekannten XML-Anfragen an den Router einfach erweitert werden:

<?xml version=”1.0″ standalone=”yes”?> <route_request
id=”8″ route_preference=”shortest”
road_preference=”highway” vehicle_type=”truck”
[...truck-parameter..]
return_driving_directions=”true” distance_unit=”km”
time_unit=”hour” return_route_geometry=”false” >

Die möglichen Parameter (wie etwa truck_height) sind in dieser Präsentation näher beschrieben.

In: Administration, OracleAuthor: Volkmar KuhnleComments (1)

Oracle 11g Kennwörter

Vor kurzem habe ich über meine Probleme mit den neuen Einstellungen für das Default-Profil berichtet.

Der dort gezeigte Trick – das Profil anpassen – funktioniert leider nur für Konten, deren Kennwörter noch nicht abgelaufen (expired) sind.

Der einzige mir bekannte Weg, Konten mit abgelaufenem Kennwort wieder zu aktivieren, ist das Kennwort tatsächlich zu ändern.

Also zum altbekannten Hack gegriffen:

declare
  pwdval   varchar2(30);
  stmt     varchar2(32000);
begin
  select password
    into pwdval
    from dba_users
  where username ='TESTACC';
  stmt := 'alter user TESTACC identified by values '''||pwdval||''' ';
  dbms_output.put_line(stmt);
  execute immediate stmt;
end;
/

Das scheitert leider, weil ab 11g das Feld Password in dba_users nur noch 3 Ausprägungen annimmt (‘GLOBAL’, EXTERNAL’, NULL) und nicht mehr, wie noch unter 10gR2 den Kennwort-Hash enthält.

Also dba_users durch sys.user$ und username durch name ersetzt und das Konto wieder aktiviert und dank der Profiländerung läuft es jetzt auch nicht mehr ab.

Ich war einen kurzen Moment glücklich, bis ich über ein Phänomen gestolpert bin: Auf einmal ist nur für dieses Konto die Groß- Kleinschreibung der Kennwörter wieder egal.

Wie konnte das passieren?

Also, ein Testcase muß her:

SQL> select value from v$parameter where name = 'sec_case_sensitive_logon';
VALUE
--------------------------------------------------------------------------------
TRUE

SQL> grant connect to testacc identified by TestAcc;
Grant succeeded.
SQL> connect testacc/TestAcc
Connected.
SQL> connect testacc/testacc
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> connect / as sysdba
Connected.
SQL> select name, password from user$ where name='TESTACC';

NAME                           PASSWORD
------------------------------ ------------------------------
TESTACC                        74437186882FE56E

SQL> alter user TESTACC identified by values '74437186882FE56E';

User altered.

SQL> connect testacc/testacc
Connected.

SQL> select value from v$parameter where name = 'sec_case_sensitive_logon';
VALUE
--------------------------------------------------------------------------------
TRUE

Nach den Erfahrungen von oben war das zu erwarten.

Lassen wir die Datenbank doch mal selbst berichten, wie sie das Konto anlegen würde:

SQL> drop user testacc cascade;
User dropped.
SQL> grant connect to testacc identified by TestAcc;
Grant succeeded.
SQL> connect testacc/testacc
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> connect / as sysdba
SQL>select dbms_metadata.get_ddl('USER','TESTACC') from dual
DBMS_METADATA.GET_DDL('USER','TESTACC')
--------------------------------------------------------------------------------
 CREATE USER "TESTACC" IDENTIFIED BY VALUES
'S:BD70207D2CA75B0C0A4759A8F7FF2C39CA03126C8FB6AA499A789E4A9C7E;74437186882FE56E'
      DEFAULT TABLESPACE "USERS"
      TEMPORARY TABLESPACE "TEMP"

Wow, das ist mal ein Langer Hash, der offensichtlich aus zwei Teilen besteht: der zweite, durch den Semikolon abgetrennte Hash ist der Sting aus sys.user$.password.
Nur, wo kommt der Rest her? Ein bisschen gesucht, et voilà:

SQL>select name, password, spare4 from sys.user$ where name='TESTACC'
NAME                           PASSWORD
------------------------------ ------------------------------
SPARE4
--------------------------------------------------------------------------------
TESTACC                        74437186882FE56E
S:BD70207D2CA75B0C0A4759A8F7FF2C39CA03126C8FB6AA499A789E4A9C7E

Der neue Hash versteckt sich also im Feld SPARE4 der sys.user$ – Dieses Feld ist wohl nicht mehr aufgespart ;-)

In: Administration, OracleAuthor: Robert MarzComments (0)

Stolpersteine bei der Migration auf Oracle 11g (R2)

Dass sich in Oracle 11g Sicherheitseinstellungen geändert haben, hat sich zu den meisten ja bereits herumgesprochen.

Mit Änderungen, die sofort auffallen, kann man ja bei der Migration umgehen:
als Beispiel sei hier die plötzlich relevante Groß/Kleinschreibung von Kennwörtern genannt. Dieses Verhalten kann man zum Glück ja wieder deaktivieren (gut) oder betroffene Anwendungen rechtzeitig Anpassen (besser) …

Heute morgen bekam ich aber von einem Skript, dass sich auch an die Datenbank anmeldet, eine E-Mail, mit folgendem Fehler:

ORA-28002: the password will expire within 7 days

Eine kurzer Check ergab, dass die zugehörige Datenbank vor 181 Tagen aufgebaut wurde und die Default-Profile jetzt mit einer Password Liftime von 180 und einer Password Grace Time von 7 Tagen angelgt wird.

Die Fehlermeldung besagt einfach nur, dass die 180 Tage jetzt vorbei sind und der Benutzer sich in der “grace period” befindet und doch gefälligst sein Kennwort ändern soll.

Ich wage gar nicht zu schätzen, wieviel Anwendungen da draußen existieren, die mit dieser Fehlermeldung nicht umgehen können, von den Zahllosen Batch-Jobs (wie meinem) ganz zu schweigen.

Dem Spuk kann man mit

ALTER PROFILE "DEFAULT" LIMIT
    PASSWORD_LIFE_TIME UNLIMITED;

ein Ende bereiten.

Damit ist das alte Verhalten wieder hergestellt.

In: Administration, OracleAuthor: Robert MarzComments (3)