Nada que ocultar

Las contraseñas son como la ropa interior: no hay que dejar que la gente las vea, hay que cambiarlas muy a menudo y no hay que compartirlas con extraños.

Lamentablemente no es inusual que nos topemos con scripts en los que las contraseñas forman parte del código, y —desde luego— no se cambian nunca.

#!/bin/bash
sqlplus -s scott/tiger@orcl << EOF
select * from dual;
exit;
EOF

Hay quienes consideran una mejor alternativa registrar las contraseñas en archivos y leerlos de allí.

#!/bin/bash
PASS=$(cat password_seguro.txt)
sqlplus -s scott/${PASS}@orcl << EOF
select * from dual;
exit;
EOF

Y seguramente habrán más trucos ingeniosos para tratar de ocultar las contraseñas, pero coincidiremos en que tenerlos en claro sigue siendo una debilidad en la seguridad.

¿La solución? Oracle Secure External Password Store. Veamos de qué se trata.

Secure External Password Store

Oracle nos propone registrar las credenciales de conexión a la base de datos en un archivo llamado wallet, el cual está encriptado.

Una vez implementado, el código solo debe incluir la cadena de conexión a la base de datos y Oracle se encargará del resto.

Como Oracle encuentra solamente la cadena de conexión, verifica en el archivo sqlnet.ora si está habilitado el uso de wallet y de ser así toma nota de su ubicación, lo lee, y busca una entrada que coincida con la cadena de conexión, recupera el usuario y la contraseña, y listo!

Ya debes estar ansioso por saber cómo hacer esta magia, así que a continuación el paso a paso.

Crear el wallet

Para esta tarea usaremos el programa mkstore, y empezaramos por crear un directorio y en él los archivos requeridos.

Se nos va a solicitar una contraseña y reingresarla, teniendo cuidado de que sea una cadena de al menos 8 caracteres, de los cuales al menos uno debe ser un número o un símbolo.

Debemos tomar nota de esta contraseña porque sin ella no podremos dar mantenimiento al wallet.

[oracle@node1 ~]$ WALLET=/home/oracle/wallet

[oracle@node1 ~]$ mkdir ${WALLET}

[oracle@node1 ~]$ mkstore -wrl ${WALLET} -create
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.

Enter password: *********
Enter password again: *********

1

2

Registrar las credenciales

Debemos tener a mano los siguientes datos:
  • Cadena de conexión (orcl)
  • Usuario de base de datos (scott)
  • Contraseña del usuario (tiger)
Se nos pedirá la contraseña del wallet.
[oracle@node1 ~]$ mkstore -wrl ${WALLET} -createCredential orcl scott tiger
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.

Enter wallet password: *********

Asegurar el wallet

Si bien no es obligatorio, como andamos en búsqueda de mejorar la seguridad, para evitar que usuarios no autorizados puedan tener acceso al wallet, debemos cambiar algunos permisos a nivel de directorio y de archivos.

[oracle@node1 ~]$ chmod 755 ${WALLET}
[oracle@node1 ~]$ chmod 750 ${WALLET}/*
[oracle@node1 ~]$ ls -la ${WALLET}
total 12
drwxr-xr-x. 2  .
drwx------. 8  ..
-rwxr-x---. 1  cwallet.sso
-rwxr-x---. 1  cwallet.sso.lck
-rwxr-x---. 1  ewallet.p12
-rwxr-x---. 1  ewallet.p12.lck

3

4

Registrar el wallet

Para que Oracle sepa que existe el wallet, se debe editar el archivo sqlnet.ora, agregando dos parámetros: wallet_location y sqlnet.wallet_override.

En el primero indicamos el directorio en el que hemos creado el wallet, y con el segundo activamos la funcionalidad.

WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY = /home/oracle/wallet))
  )
SQLNET.WALLET_OVERRIDE = TRUE
Debemos verificar que en el archivo tnsnames.ora esté registrada la cadena de conexión a la base de datos.
ORCL =
  (DESCRIPTION =
    (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = node1)
      (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Probamos la conexión via wallet

Podemos usar sqlplus, rman, expdp, etc., para verificar que ya es posible conectarse a la base de datos sin necesidad de indicar el usuario y su contraseña.
[oracle@node1 ~]$ sqlplus /@orcl

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 8 12:16:04 2024
Version 19.23.0.0.0

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

Last Successful login time: Sun Sep 08 2024 12:15:21 -05:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

SQL> show user
USER is "SCOTT"

5

Mantenimiento del wallet

Con el tiempo tendremos registradas muchas credenciales, las cuales podemos consultar en cualquier momento.

[oracle@node1 ~]$ mkstore -wrl ${WALLET} -listCredential
Enter wallet password: **********
List credential (index: connect_string username)
1: orcl scott

Como es una buena práctica ir modificando las contraseñas, desde luego que podemos actualizar las credenciales cuando sea necesario.

[oracle@node1 ~]$ mkstore -wrl ${WALLET} -modifyCredential orcl scott TiGeR
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.

Enter wallet password: **********
Si deseamos verificar la contraseña de alguna credencial, deberemos obtener el valor de la entrada oracle.security.client.passwordNNN, donde NNN es el número de credencial tal como se muestra al listarlas.
[oracle@node1 ~]$ mkstore -wrl ${WALLET} -listCredential 
Enter wallet password: *********
List credential (index: connect_string username)
2: orcl_rman sys
1: orcl scott
Así, si deseamos saber la contraseña asociada al usuario sys para la cadena de conexión orcl_rman, tomaremos en cuenta que es la segunda en la lista, y por tanto debemos ejecutar:
[oracle@node1 ~]$ mkstore -wrl ${WALLET} -viewEntry oracle.security.client.password2
Enter wallet password: *********
oracle.security.client.password2 = change_on_install

Conclusiones

Siguiendo un procedimiento nada complicado, y si lo complementamos con el cambio gradual de contraseñas, podemos mejorar la seguridad  removiendo las credenciales de los scripts.

Si deseas ahondar sobre el uso de Oracle Secure External Password Store, date una vuelta por My Oracle Support y lee estas Notas:

340559.1Using The Secure External Password Store
1383938.1How To Configure The Secure External Password Store To Allow The Connection To RMAN Catalog?
1441745.1Using a Secure External Password Store with the JDBC Thin Driver
¿Te pareció interesante este artículo?, ¿te quedaron algunas dudas?, ¿quieres sugerirme un tema a tratar?, pues déjame tus comentarios o ¡contáctame ahora mismo!

2 Responses

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Posts Relacionados

Aprenda a identificar la fila involucrada en la ocurrencia del evento de espera "enq: TX - row lock contention"
Aprenda a resolver el error CRS-2304 GPnP profile signature verification failed al iniciar una base de datos 11.2 en un cluster 19c.
Aprenda a corregir los permisos dañados de un Oracle Home, ya sea de Oracle Grid o de Oracle Database Server

¿Necesitas Ayuda?

Completa estos datos y estaré en contacto a la brevedad.