Secure External Password Store

En muchas ocasiones es necesario o aconsejable conectarte a la base de datos de manera rápida y sobre todo segura, sin que los detalles de conexión de la base de datos sean visibles. Un ejemplo, tal y como indica en su página Oracle, es cuando nos conectamos a la base de datos desde los scripts de Shell contenidos en el sistema de archivos. Si estos scripts contienen los detalles de conexión pueden ser un problema de seguridad bastante importante. Para este ejemplo u otros similares, podemos usar la autentificación propia del sistema operativo, pero a partir de Oracle 10g Release2, nos da la opción de usar un almacén de contraseñas externo seguro, guardando las credenciales de inicio de la sesión de Oracle en un wallet guardado en el lado del cliente. Para entenderlo, lo que se crea es un fichero con las credenciales para conectarnos a la base de datos guardados en el lado del cliente, que en la cadena de conexión indicará donde se encuentra este “fichero” para conectarnos. Esto permitirá al usuario conectarse siguiendo la sintaxis siguiente “/@alias”, siendo alias el nombre elegido para la conexión a la base de datos.

Configurar Secure External Password Store

En primer lugar debemos elegir donde queremos guardar el Oracle wallet, es decir es el lugar donde se almacenará el fichero de wallet con los datos de conexión que Oracle leerá para conectarnos a la base de datos con la sintáxis siguiente “/@alias”.

Nota: La localización puede ser un directorio común donde tienen acceso varios usuarios para conectarse a la base de datos

En nuestro caso, al tratarse de una prueba vamos a dejar el Oracle Wallet en el home de oracle de nuestra máquina cliente.

mkdir -p /home/oracle/wallet

Cargamos las variables de entorno del TNS_ADMIN, si no lo has hecho anteriormente, apuntando al fichero tnsnames.ora donde especificaremos la cadena de conexión a la base de datos de nuestra máquina cliente.

export TNS_ADMIN=/u01/app/oracle/21.0.0/oracle/network/admin

Añadimos la entrada siguiente en el fichero sqlnet.ora, ubicado dentro de la ruta TNS_ADMIN, en nuestro caso “/u01/app/oracle/21.0.0/oracle/network/admin/sqlnet.ora”

En este fichero debemos especificar el directorio donde se encuentra el fichero de Wallet que creamos anteriormente.

Es importante añadir la entrada SQLNET.WALLET_OVERRIDE que permite anular cualquier configuración de autentificación del sistema operativo existente.

WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
 (METHOD_DATA =
   (DIRECTORY = /home/oracle/wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0

En este punto ya podemos crear el wallet con la herramienta oracle mkstore con la opción -create. El wallet está protegido con contraseña, pero es definido con propiedad “Inicio de sesión automático” o «autologin» habilitada , de esta forma los usuarios que se conecten a la base de datos lo harán sin que se requiera una contraseña, que es en principio la meta que buscamos con la creación de “secure external password”.

[oracle@localhost bin]$ mkstore -wrl «/home/oracle/wallet» -create
Oracle Secret Store Tool Release 21.0.0.0.0 – Production
21.3.0.0.0: Versión {1}
Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
Introducir Contraseña:  
Volver a Introducir Contraseña:  
[oracle@localhost bin]$

La password introducida con anterioridad es la del fichero wallet, es conveniente recordarla y/o guardarla a buen recaudo porque  Oracle la pedirá para poder manipular la información que almacena. Oracle mkstore crea dos ficheros (cwallet.sso, ewallet.p12).

El wallet se crea con solo permisos de lectura / escritura para el usuario actual, por lo que ningún otro usuario puede leerla.

/home/oracle/wallet
[oracle@localhost wallet]$ ls -rlt
total 8
-rw——-. 1 oracle oracle   0 sep 27 19:16 ewallet.p12.lck
-rw——-. 1 oracle oracle 149 sep 27 19:16 ewallet.p12
-rw——-. 1 oracle oracle   0 sep 27 19:16 cwallet.sso.lck
-rw——-. 1 oracle oracle 194 sep 27 19:16 cwallet.sso

Una vez que se crea el wallet, se puede modificar utilizando el comando “mkstore” que se describe a continuación.

Agregue las credenciales de usuario/contraseña al wallet recientemente usando la opción -createCredential. Por decirlo de una manera sencilla, en este punto se trata de indicar las credenciales que necesitamos para conectarnos a la base de datos que serán almacenados en fichero de password.

En nuestro caso vamos a realizar una conexión, siguiendo esta entrada del tnsnames.ora con el usuario test.

TEST_EXTUSER =
     (DESCRIPTION =
     (ADDRESS =
    (PROTOCOL = TCP)
  (HOST = localhost)
  (PORT = 1521)
      )
(CONNECT_DATA = (server=dedicated) (service_name = srv_testing))
   )

La sentencia es la siguiente.  Ubicación del wallet, entrada de la conexión a BBDD, usuario y password del usuario con el que se quiere realizar la conexión.

mkstore -wrl «/home/oracle/wallet» -createCredential TEST_EXTUSER test testpassword

La salida del comando es lasiguiente, te pedirá la contraseña del wallet para crear las credenciales:

[oracle@localhost bin]$ mkstore -wrl «/home/oracle/wallet» -createCredential TEST_EXTUSER test testpassword
Oracle Secret Store Tool Release 21.0.0.0.0 – Production
21.3.0.0.0: Versión {1}
Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
Introducir Contraseña de Cartera:  

Una vez generado el wallet ya nos podemos conectar a la base de datos con la cartera generada anteriormente. Para conectarnos utilizaremos la siguiente sintáxis “/@db_alias» , donde db_alias es la referencia a la entrada de la cartera que hemos añadido y que tenemos configurada en nuestro fichero tnsnames, en  nuestro caso: /@TEST_EXTUSER

[oracle@localhost admin]$ sqlplus /@TEST_EXTUSER
SQL*Plus: Release 21.0.0.0.0 – Production on Sun Oct 2 17:48:52 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Last Successful login time: Sun Oct 02 2022 17:47:12 -04:00
Connected to:
Oracle Database 21c Standard Edition 2 Release 21.0.0.0.0 – Production
Version 21.3.0.0.0
SQL>

Una vez generado el Wallet, podemos realizar varias acciones sobre la cartera generada:

Listar las entradas actuales que tiene nuestro Wallet

    Listar las entradas que hemos creado en el wallet. Para ello añadiremos la sintásis – listCredential apuntando a la ruta del wallet sobre el que queremos ver las credenciales, Oracle nos pedirá la password del Wallet.

    oracle@localhost admin]$  mkstore -wrl «/home/oracle/wallet» -listCredential
    Oracle Secret Store Tool Release 21.0.0.0.0 – Production
    21.3.0.0.0: Versión {1}
    Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
    Introducir Contraseña de Cartera:  
    List credential (index: connect_string username)
    1: TEST_EXTUSER test
    [oracle@localhost admin]$

    Añadir una nueva conexión de usuario a un Wallet creado con anterioridad

      Si queremos añadir una nueva conexión a nuestro Wallet para conectaros a la base de datos de forma externa usando “external Password”, simplemente añade el nuevo usuario o una nueva cadena de conexión que coincida con una nueva entrada en tu tnsnames.ora. Esta será la que utilices para realizar la conexión.

      [oracle@localhost admin]$ mkstore -wrl «/home/oracle/wallet» -createCredential RAUL_EXTUSER raul testpassword
      Oracle Secret Store Tool Release 21.0.0.0.0 – Production
      21.3.0.0.0: Versión {1}
      Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
      Introducir Contraseña de Cartera:  

      Si listamos ahora las entradas del wallet podremos ver la nueva entrada que hemos añadido, siendo RAUL_EXTUSER nuestra entrada del tnsnames.ora

      [oracle@localhost admin]$  mkstore -wrl «/home/oracle/wallet» -listCredential
      Oracle Secret Store Tool Release 21.0.0.0.0 – Production
      21.3.0.0.0: Versión {1}
      Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
      Introducir Contraseña de Cartera:  
      List credential (index: connect_string username)
      2: RAUL_EXTUSER raul
      1: TEST_EXTUSER test

      Podemos probar la conexión.

      [oracle@localhost admin]$ sqlplus /@RAUL_EXTUSER
      SQL*Plus: Release 21.0.0.0.0 – Production on Sun Oct 2 18:34:07 2022
      Version 21.3.0.0.0
      Copyright (c) 1982, 2021, Oracle.  All rights reserved.
      Last Successful login time: Sun Oct 02 2022 18:26:16 -04:00
      Connected to:
      Oracle Database 21c Standard Edition 2 Release 21.0.0.0.0 – Production
      Version 21.3.0.0.0

      Modificar las credenciales de un Wallet

        Las credenciales de los wallet pueden ser modificadas, podemos cambiar la password del wallet actual simplemente con la sitaxis “modifyCredential”

        [oracle@localhost admin]$  mkstore -wrl "/home/oracle/wallet" -modifyCredential RAUL_EXTUSER raul raulnewpassword
        Oracle Secret Store Tool Release 21.0.0.0.0 - Production
        21.3.0.0.0: Versión {1}
        Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
        Introducir Contraseña de Cartera:   

          Eliminar las credenciales de un Wallet

          Las credenciales de un wallet pueden ser borradas con el siguiente comando.

          mkstore -wrl <wallet_location> -deleteCredential <db_alias>
          [oracle@localhost admin]$ mkstore -wrl "/home/oracle/wallet" -deleteCredential RAUL_EXTUSER
          Oracle Secret Store Tool Release 21.0.0.0.0 - Production
          21.3.0.0.0: Versión {1}
          Copyright (c) 2004, 2021, Oracle y/o sus subsidiarias. Todos los Derechos Reservados.
          Introducir Contraseña de Cartera:  
          [oracle@localhost admin]$  
          YouTube
          LinkedIn