News
DBA-Tipp: Passworte (halbwegs) sicher weggeschlossen – der Secure External Password Store

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

Oracle adressiert mit dem Secure External Password Store das allseits präsente Problem, dass Logindaten für den Datenbankzugriff im Klartext lesbar in Scripts und  Configfiles abgelegt sind. Er erlaubt es, Logincredentials in Oracle Wallets zu speichern und somit gegen all zu leichten Zugriff von außen zu schützen.

Ein Eintrag im Secure External Password Store besteht aus drei Teilen:

  • Connectstring zur Datenbank (der gleichzeitig den Indexbegriff im Password Store darstellt)
  • Username
  • Passwort

Für die Einrichtung und Nutzung eines Secure External Password Store sind folgende Schritte erforderlich:

Anlegen des Wallets

Für das Anlegen des Password Stores verwendet man bis Verison 11.1 ausschließlich das Secret Store Tool „mkstore“:

mkstore -wrl /pfad/zum/wallet -create

Ab 11.2 wird empfohlen, den Password Store mit dem Wallet-Tool „orapki“ anzulegen. Die dort neu hinzugekommene Option -auto_login_local verhindert laut Oracle, dass ein gestohlener Password Store von einem anderen User oder auf einem anderen Computer missbräuchlich verwendet werden kann. Warum das so leider nicht stimmt, wird gegen Ende des Artikels in der Bewertung erklärt. Der entsprechende Befehl wäre:

orapki wallet create -wallet /pfad/zum/wallet -auto_login_local

Legen wir also einen Password Store an und füllen ihn mit Credentials. Der Password Store ist übrigens immer mit einem Kennwort geschützt, dass beim Erstellen des Store festgelegt wird. Man benötigt es sowohl für Schreibzugriffe als auch zum Auflisten des Inhaltes. Der Zugriff auf die Credentials für die Verbindung zu einer Datenbank erfolgt hingegen durch ein implizites Autologin.

[oracle@client(client11gR2 orcl) wallets]$ mkstore -wrl /u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps -create
Oracle Secret Store Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

Enter password:

Enter password again:

Eintragen der Credentials

Wie bereits erwähnt, besteht jeder Eintrag im  Password Store aus einenem Triple von Connectdescriptor, Username und Kennwort. Ein Password Store kann mehrere Credentials aufnehmen. Welcher dieser Einträge letztlich für die Anmeldung an der Datenbank gezogen wird, richtet sich nach dem Connectdescriptor. Der Wert, der als Connect zur Datenbank verwendet wird, ist gleichzeitig auch der Credential-Index im Password Store. Da es sich dabei um reines Stringmatching handelt, steht dem Benutzer frei, ob er für die Einträge im Password Store Net Service Names oder ausformulierte Connectstrings verwendet.

Wichtig ist nur, dass dann auch beim Connect zur Datenbank der richtige Net Service Name bzw. der bis hin zu Leerzeichen etc. exakt übereinstimmende Connectstring verwendet werden. Aufgrund der wesentlich besseren Les- und Wartbarkeit sollte natürlich dem Net Service Name gegenüber dem ausformulierten Connectstring der Vorzug gegeben werden. Müssen in ein und dem selben Password Store unterschiedliche Credentials für die selbe Datenbank abgelegt werden, muss natürlich zwangsläufig für jedes Credential ein separater Net Service Name angelegt werden, da nur über den  Net Service Name der richtige Username angesprochen werden kann.

mkstore -wrl /pfad/zum/wallet \
   -createCredential Connectdescriptor Username [Kennwort]

Wir hinterlegen z.B. den User OE mit dem Kennwort „oe“ folgendermaßen (der Net Service Name ORCL4OE wird weiter unten eingerichtet).

[oracle@client(client11gR2 orcl) wallets]$ mkstore \
    -wrl /u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps \     -createCredential ORCL4OE oe oe

Oracle Secret Store Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:

Create credential oracle.security.client.connect_string1

Das Kennwort muss nicht zwingend an der Console angegeben werden. Es wird bei Bedarf auch abgefragt und kann verborgen eingegeben werden. Ebenso kann ein Connectstring anstelle eines Net Service Names verwendet werden. Wirklich übersichtlich ist das dann aber nicht mehr.

[oracle@client(client11gR2 orcl) wallets]$ mkstore \
    -wrl /u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps \
     -createCredential '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))' foo

Oracle Secret Store Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

Your secret/Password is missing in the command line
Enter your secret/Password:

Re-enter your secret/Password:

Enter wallet password:

Create credential oracle.security.client.connect_string2

Einrichten von Net Service Names in der tnsnames.ora

Hat man Net Service Names als Credentialindex gewählt, müssen die entsprechenden Net Service Names natürlich in der tnsnames.ora des Clients konfiguriert werden.

ORCL4OE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

Aktivieren des  Secure External Password Store

Über die sqlnet.ora des Clients wird die Nutzung des Secure External Password Store nun noch mittels folgender beider Einträge aktiviert.

wallet_location =
 (SOURCE=
  (METHOD=File)
  (METHOD_DATA=/u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps
   (DIRECTORY=)
  )
 )

SQLNET.WALLET_OVERRIDE=TRUE

Wallet_location weist den Weg zum Password Store und wallet_override verhindert, dass der Client versucht, das Wallet für eine SSL-Authentisierung zu verwenden.

Damit sind alle Voraussetzungen erfüllt, um zukünftig ohne explizite Angabe eines Kennwortes eine Verbindung zur Datenbank herzustellen:

[oracle@client(client11gR2 orcl) wallets]$ sqlplus /@orcl4oe

SQL*Plus: Release 11.2.0.3.0 Production on Thu Oct 10 19:33:07 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

SQL> show user
USER is "OE"
SQL>
 

[oracle@client(client11gR2 orcl) ~]$ sqlplus /@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))'

SQL*Plus: Release 11.2.0.3.0 Production on Thu Oct 10 19:38:33 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

SQL> show user
USER is "FOO"
SQL>

Ändert sich das Passwort eines Datenbanknutzers, muss die Änderung natürlich auch entsprechend im Passwort Store erfolgen:

SQL> alter user oe identified by "oracle";

User altered.

[oracle@client(client11gR2 orcl) ~]$ mkstore \
    -wrl /u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps \     -modifyCredential ORCL4OE orcl oracle

Oracle Secret Store Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:

Modify credential
Modify 1

Den Inhalt eines Password Stores lässt man sich mit der-listCredentialOption auflisten:

[oracle@client(client11gR2 orcl) ~]$ mkstore \
    -wrl /u01/app/oracle/product/11.2.0/client_1/owm/wallets/seps \     -listCredential

Oracle Secret Store Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:

List credential (index: connect_string username)
2: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))) foo
1: ORCL4OE orcl

Bewertung

Oracle verspricht mit dem Einsatz des Secure External Password Store einen deutlichen Sicherheitsgewinn, da Passworte nun nicht mehr im Klartext abgelegt sind. Zudem soll das Deployment von Logininformationen einfacher sein. Beides ist grundsätzlich richtig. Nichts desto trotz sollte man bei aller Euphorie folgendes im Hinterkopf behalten:

  • Ein Secure External Password Store ist nicht weniger schutzwürdig als ein Script oder Configfile, das Credentials im Klartext enthält. Ein gestohlener Secure External Password Store erlaubt dem Besitzer Zugang zu Datenbanken ohne Kenntnis von Kennworten, sofern er die im Wallet hinterlegten Credential-Indexes kennt und, bei Verwendung von Net Service Names, die richtigen Connectinformationen rekonstruieren kann. Er kann jedoch die Credential-Indexes nicht durch Auflisten des Walletinhaltes herausfinden, ohne das Wallet-Kennwort zu wissen.
     
  • Die von Oracle in 11.2 in orapki implementierte -auto_login_local-Option ist, auch wenn anders behauptet, kein wirksamer Schutz gegen die missbräuchliche Benutzung gestohlener Password Stores. Zwar wird behauptet, dass ein -auto_login_local erstelltes Wallet nicht auf einem anderen Computer benutzt werden kann. Tatsächlich werden aber im Wallet nur Betriebssystem-Nutzername des Erstellers und der Hostname des Computers abgelegt, auf dem das Wallet erstellt wurde. Diese Informationen lassen sich jedoch auf einem Drittcomputer ohne nennenswerten Aufwand nachbilden.

Fazit

Der Oracle Secure External Password Store bietet eine Möglichkeit, Klartext-Credentials aus Scripts und Configfiles zu verbannen und damit ein Plus an Sicherheit zu erreichen. Ein merklicher Vorteil ist die Tatsache, dass Credentials auf diese Art nicht mehr in Anwendungscode hinterlegt werden müssen und damit z.B. außerhalb des Zugriffs von Anwendungsentwicklern bleiben können. Auch das Ausspähen von Passworten aus Filesystembackups kann so unterbunden werden. Allerdings stellen auch die Password Stores ein riskantes Angriffsziel dar und müssen ebenso gut wie Klartext-Credentials gegen Diebstahl gesichert werden. Ein Zugang zu einem Computer in einer Form, die das Auslesen von Klartext-Credentials ermöglichte, erlaubt auch den Diebstahl des Password Stores.

Gemäß MOS Doc ID 340559.1 ist der Oracle Secure Password Store kostenfrei in allen Datenbankeditionen verfügbar:
„...The feature Secure External Password Store can be used without any restriction in all product editions, you do not require a license for the Advanced Security Option (ASO). ...“