Sicher einloggen ohne Benutzername und Passwort
von Heinz-Wilhelm Fabry, ORACLE Deutschland GmbH

Client-Server-Anwendungen und Batch Jobs, aber auch privilegierte Benutzer wie DBAs, die Werkzeuge wie z.B. SQL*Plus nutzen, loggen sich unter Angabe von Benutzername und Passwort auf Datenbanken ein. Die Steuerdateien der Batch-Jobs bergen ein gewisses Sicherheitsrisiko, denn sie enthalten häufig die benötigten Benutzernamen und Passwörter. Und auf UNIX-Systemen kann ausserdem jeder, der Zugriff auf das System hat, die im Skript enthaltenen bzw. eingegebenen Passwörter in der Prozessliste im Klartext sehen.

Der folgende Beitrag zeigt, wie sowohl Batch Jobs als auch Benutzer sich durch das Verwenden sogenannter external password files sicher und ohne Eingabe von Benutzername und Passwort bei der Datenbank anmelden.

External password files sind ein Feature der Enterprise Edition der Datenbank, sie sind also im normalen Lieferumfang der Enterprise Edition enthalten. Implementiert wird das Feature über Einträge in den Dateien sqlnet.ora und tnsnames.ora sowie über ein Wallet. Dieses Wallet ist das eigentliche external password file - eine kleine, nur wenige KB große Datei, die mit dem 3DES-Algorithmus verschlüsselt und durch ein Passwort gesichert ist. External password files funktionieren sowohl für Client-Server-Anwendungen als auch direkt auf dem Server. Das Beispiel unten implementiert sie auf dem Server.

Vorgehensweise

Mit vier einfachen Schritten richtet man das Verwenden von external password files ein

  1. Anlegen und Einrichten des Wallet
  2. Servicenamen in tnsnames.ora eintragen
  3. Verwendung des Wallet über sqlnet.ora einrichten
  4. Anpassen von Skripten / Einloggen ohne Passwort
1. Anlegen und Einrichten des Wallet

Im ersten Schritt wird das Wallet selbst in einem beliebigen Verzeichnis des Betriebssystems angelegt, auf das der Eigentümer der Oracle Software Zugriff hat. In diesem Verzeichnis darf kein anderes Oracle Wallet gespeichert sein - z.B. kein Wallet, das für die Verschlüsselung von Daten mit dem Feature transparent data encryption (TDE) der Advanced Security Option verwendet wird. Die Erklärung für diese Einschränkung ist banal: Alle von Oracle angelegten Wallets tragen den Dateinamen ewallet.p12, so dass das Anlegen eines Wallet in einem Verzeichnis mit vorhandenem Wallet dieses vorhandene Wallet überschreiben würde.

Zum Anlegen des Wallet wird das Werkzeug mkstore verwendet. Der Aufruf zum Anlegen könnte folgendermassen aussehen
mkstore -wrl $ORACLE_HOME/network -create
Es wird ein Passwort abgefragt, mit dem das Wallet vor unbefugtem Öffnen geschützt wird. Das Passwort muss aus 8 bis 30 Zeichen bestehen und mindestens ein alphanumerisches sowie ein numerisches Zeichen enthalten.

Das Wallet wird - wie oben bereits angemerkt - mit dem Namen ewallet.p12 angelegt. Ausserdem wird im selben Verzeichnis eine ebenfalls verschlüsselte Datei namens cwallet.sso angelegt. Diese Datei enthält das Passwort für das Wallet und wird von Oracle zum Zugriff auf das Wallet genutzt. Das Wallet wird durch diesen Mechanismus zu einem sogenannten auto open wallet.

Nun können die Einträge gemacht werden, die es später erlauben, sich ohne Passworteingabe bei der Datenbank anzumelden. Benötigt werden - man könnte fast sagen logischerweise
  • ein beliebiger, frei vergebbarer Servicename, der mit einem vorhandenen Servicenamen identisch sein kann
  • ein Benutzername, der in der Datenbank angelegt sein muss
  • das in der Datenbank vorhandene Passwort für den angegebenen Benutzernamen
Die Einträge erfolgen wiederum mit mkstore
mkstore -wrl $ORACLE_HOME/network -createCredential scotty scott
Im Beispiel ist also scotty der Servicename, scott der allseits bekannte Benutzername. mkstore reagiert mit einer Eingabeaufforderung nach dem Passwort von Scott. Geht man davon aus, dass dieses Passwort noch das Standardpasswort der Datenbankinstallation ist (eine schlechte Praxis, aber hilfreich für diesen Beitrag), gibt man hier also das bekannte Passwort tiger an. Um Fehleingaben abzufangen wird das Passwort ein zweites Mal abgefragt, dann folgt die Abfrage des Passwortes für den Zugriff auf das Wallet. Ist alles korrekt angegeben, wird der Eintrag im Wallet erzeugt. Ausdrücklich sei darauf hingewiesen, dass nach einer Änderung des Passwortes in der Datenbank das Passwort auch im Wallet geändert werden muss. Dies geschieht ebenfalls über mkstore. Details dazu und darüber, wie man die im Wallet vorhandenen Einträge auflistet (Passwörter werden dabei nicht angezeigt), Einträge löscht und Passwörter sowie Servicenamen ändert, liefert das Handbuch Oracle Database Security Guide).

Ein Benutzername kann auch mit mehreren Servicenamen verbunden werden. Ebenso ist es möglich, mehrere Benutzer in einem Wallet mit mehreren Servicenamen zu verbinden. Wichtig ist, dass jeder Servicename pro Wallet nur einmal vergeben wird. Man könnte sich also die Einträge im Wallet als Zeilen einer Tabelle vorstellen, die aus drei Spalten (Servicenamen, Benutzernamen, Passwörter) besteht und deren Primärschlüssel der Servicename ist. Jede Zeile bzw. jeder Servicename wird einzeln mit mkstore im Wallet angelegt.

2. Servicenamen in tnsnames.ora eintragen

Die im Wallet angegebenen Servicenamen müssen nun über Einträge in der Datei tnsnames.ora spezifiziert werden. Dazu könnte man der Einfachheit halber z.B. einen vorhandenen Eintrag duplizieren und modifizieren. Der Eintrag für den Servicenamen scotty, der im Beispielwallet oben angelegt wurde, könnte etwa so aussehen
scotty =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = vmware.de.oracle.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.vmware.de.oracle.com)
    )
  )
3. Verwendung des Wallet über sqlnet.ora einrichten

Nachdem das Wallet angelegt und mit Einträgen versehen ist sowie die Servicenamen in der Datei tnsnames.ora spezifiziert sind, muss noch bekannt gemacht werden, in welchem Verzeichnis das Wallet gespeichert ist. Ausserdem muss festgelegt werden, dass das Wallet auch tatsächlich zum Verbindungsaufbau benutzt werden soll. Das geschieht durch zwei Einträge in der Datei sqlnet.ora. Benutzt werden dazu die Parameter wallet_location und sqlnet.wallet_override. Für das Beispiel sieht der Eintrag demnach so aus
wallet_location = (SOURCE = 
                    (METHOD = FILE)
                    (METHOD_DATA =
                      (DIRECTORY = $ORACLE_HOME/network/)
                     )
                   )
sqlnet.wallet_override = TRUE
Damit sind alle Komponenten für die Verwendung von external password files eingerichtet. Hier noch einmal alles zur Zusammenfassung als Schaubild

Komponenten für <i>external password store</i> in der Übersicht
Zum Vergrößern auf das Bild klicken, zurück zum Artikel mit dem Back-Button des Browser

4. Anpassen von Skripten / Einloggen ohne Passwort

Nun müssen nur noch die Skripte der Batch Jobs modifiziert werden. Dazu wird jeweils das connect BENUTZERNAME/PASSWORT ersetzt durch connect /@servicename, um im Beispiel zu bleiben also durch connect /@scotty. Der Aufruf von SQL*Plus auf der Kommandozeile erfolgt entsprechend, wie man an der folgenden Darstellung erkennen kann

Aufruf von SQL*Plus mit <i>external password store</i>
Zum Vergrößern auf das Bild klicken, zurück zum Artikel mit dem Back-Button des Browser

Zum Abschluss sei darauf hingewiesen, dass es sich natürlich empfiehlt, die beteiligten Dateien vor dem Zugriff durch Unbefugte zu sichern - unter UNIX z.B. durch eine restriktive Vergabe der Lese- und Schreibberechtigungen.

Zurück zur Community-Seite