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.
Chris Pirillo
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
- Cadena de conexión (orcl)
- Usuario de base de datos (scott)
- Contraseña del usuario (tiger)
[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
ORCL =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = node1)
(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
Probamos la conexión via wallet
[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: **********
[oracle@node1 ~]$ mkstore -wrl ${WALLET} -listCredential
Enter wallet password: *********
List credential (index: connect_string username)
2: orcl_rman sys
1: orcl scott
[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.1 | Using The Secure External Password Store |
1383938.1 | How To Configure The Secure External Password Store To Allow The Connection To RMAN Catalog? |
1441745.1 | Using a Secure External Password Store with the JDBC Thin Driver |
2 Responses
Muy buen artículo Enrique, pronto cambiaré la manera de como se conectan los scripts que están programados en el crontab.
Buen articulo, voy a probarlo! Gracias!