A menudo es necesario hacer conexiones a la base de datos desde los scripts de shell contenidos en el sistema de archivos. Esto puede ser un problema de seguridad importante si estos scripts contienen los detalles de conexión de la base de datos. Una solución es usar la autenticación del sistema operativo, pero Oracle 10g Release 2 nos da la opción de usar un almacén de contraseñas externo seguro donde las credenciales de inicio de sesión de Oracle se almacenan en un wallet Oracle del lado del cliente. Esto permite que los scripts contengan conexiones utilizando la sintaxis «/@db_alias».
Configurar Secure External Password Store
Primero, decida la ubicación del Wallet Oracle y su configuración TNS local. En este ejemplo, usaré un usuario del sistema operativo llamado «myuser», por lo que mis directorios serán los siguientes.
mkdir -p /home/myuser/wallet
mkdir -p /home/myuser/tns
Use la variable de entorno TNS_ADMIN para apuntar a su configuración TNS local.
export TNS_ADMIN=/home/myuser/tns
Agregue las siguientes entradas en el archivo «/home/myuser/tns/sqlnet.ora» del cliente, con su ubicación de wallet preferida.
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /home/myuser/wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0
La entrada SQLNET.WALLET_OVERRIDE permite que este método anule cualquier configuración de autenticación del sistema operativo existente.
Cree un wallet Oracle en la ubicación especificada anteriormente utilizando la utilidad mkstore con la opción -create. El wallet está protegida con contraseña, pero se define con la propiedad «Inicio de sesión automático» habilitada para que los intentos de conexión del usuario que creó el wallet no requieran una contraseña.
$ mkstore -wrl "/home/myuser/wallet" -create
Enter password:
Enter password again:
$
La utilidad mkstore no tiene una opción para especificar una contraseña. Si necesita crear un script para la creación, puede falsificar la entrada del usuario para la contraseña y la confirmación de la siguiente manera.
$ mkstore -wrl "/home/myuser/wallet" -create
El wallet oracle se pueden copiar en diferentes máquinas, lo que puede representar un riesgo de seguridad. En 11g Release 2, puede evitar que la funcionalidad de inicio de sesión automático del wallet funcione si se copia a otra máquina creando un wallet local utilizando el comando «orapki», en lugar del comando «mkstore».
$ orapki wallet create -wallet "/home/myuser/wallet" -pwd "MyPassword1" -auto_login_local
El wallet se crea con solo permisos de lectura / escritura para el usuario actual, por lo que ningún otro usuario puede leerla.
Una vez que se crea el wallet, se puede modificar utilizando el comando «mkstore» que se describe a continuación.
Agregue las credenciales de contraseña a el wallet usando la opción -createCredential.
$ mkstore -wrl "/home/myuser/wallet" -createCredential db10g scott tiger
Enter password:
Create credential oracle.security.client.connect_string1
$
Como antes, la utilidad mkstore no tiene una opción para especificar una contraseña. Si necesita crear un script para la creación, puede falsificar la entrada de usuario para la contraseña de la siguiente manera.
$ mkstore -wrl "/home/myuser/wallet" -createCredential db10g scott tiger
Db_alias, en este caso «db10g», es el identificador utilizado en la sintaxis «/@db_alias» y debe tener una entrada coincidente en el archivo «/home/myuser/tnsnames.ora».
DB10G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DB10G.WORLD)
)
)
Las credenciales presentes en el wallet se enumeran usando la opción -listCredential.
$ mkstore -wrl "/home/myuser/wallet" -listCredential
Enter password:
List credential (index: connect_string username)
1: db10g scott
$
Con el wallet creada y las credenciales de contraseña en su lugar, conéctese a la base de datos sin especificar el nombre de usuario y la contraseña, como se muestra a continuación.
$ sqlplus /@db10g
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jul 19 08:15:09 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
SQL> show user
USER is "SCOTT"
SQL>
Eso está bien si solo se conecta como un solo usuario a cada base de datos, pero ¿qué pasa si se conecta como múltiples usuarios? Simplemente agregue una nueva entrada a el wallet usando un db_alias diferente y asegúrese de que el alias esté presente en el archivo «tnsnames.ora». Entonces, si tenemos un usuario llamado «prueba» en la base de datos «db10g», creamos una nueva entrada en el wallet.
$ mkstore -wrl "/home/myuser/wallet" -createCredential db10g_test test test
Enter password:
Create credential oracle.security.client.connect_string1
$
Realice una nueva entrada para la base de datos «db10g» en el archivo «/home/myuser/tns/tnsnames.ora» del cliente.
DB10G_TEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DB10G.WORLD)
)
)
Ahora conéctese al usuario «test» como se muestra a continuación.
$ sqlplus /@db10g_test
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jul 19 10:17:47 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
SQL> show user
USER is "TEST"
SQL>
Uso de wallet con data pump
El wallet funciona bien con data pump también.
$ expdp /@db10g_test tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
Para usar el almacén de contraseñas externo seguro de una aplicación Java, debe usar el controlador OCI, lo que a su vez significa que debe tener un cliente Oracle instalado. Para hacer la conexión, use una URL personalizada como esta.
Connection conn = DriverManager.getConnection ("jdbc:oracle:oci:/@db10g_test");
Las credenciales de contraseña de las entradas de wallet existentes se pueden modificar o eliminar utilizando los siguientes comandos.
mkstore -wrl -modifyCredential
mkstore -wrl -deleteCredential