Ir al contenido

Herramientas y automatización para Oracle TNS

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

El workflow Oracle TNS separa listener, SERVICE_NAME, SID, container y principal. ODAT acelera varias comprobaciones, pero SQL*Plus y las vistas Oracle confirman el contexto efectivo.

Pregunta Herramienta Límite
¿alcanzo el listener? tnsping no autentica en la base
¿qué anuncia TNS? oracle-tns-version versión de listener, no parche completo
¿qué servicio acepta la conexión? SQL*Plus requiere connect descriptor válido
¿qué capacidades tiene la cuenta? SQL y ODAT depende de privilegios y versión

tnsping usa un alias de tnsnames.ora o un descriptor Easy Connect:

Comprobar resolución y listener
tnsping '//FQDN:1521/SERVICE_NAME'

La respuesta solo confirma que el descriptor llega a un listener. En sqlplus, -L evita volver a solicitar credenciales después de un fallo y -S reduce banners y prompts. Son opciones adecuadas para una ejecución automatizada, pero -S también oculta contexto útil durante el diagnóstico:

Abrir una sesión Oracle
sqlplus -L 'USERNAME@//FQDN:1521/SERVICE_NAME'

Omite la contraseña para que el cliente la solicite. Guarda V$VERSION, SYS_CONTEXT y container tras conectar.

Oracle Net toma los timeouts desde sqlnet.ora. SQLNET.OUTBOUND_CONNECT_TIMEOUT limita el establecimiento de la conexión Oracle Net. Debe configurarse en un directorio de cliente controlado, por ejemplo mediante TNS_ADMIN, para no alterar el comportamiento global:

sqlnet.ora
SQLNET.OUTBOUND_CONNECT_TIMEOUT=10

Para una recolección no interactiva, SET MARKUP CSV ON produce CSV y SPOOL abre el archivo de salida. WHENEVER SQLERROR EXIT SQL.SQLCODE devuelve un error al proceso llamante. Separa las consultas en un archivo para no mezclar el prompt de contraseña con la entrada estándar:

collect-context.sql
WHENEVER SQLERROR EXIT SQL.SQLCODE
SET MARKUP CSV ON
SPOOL evidence/oracle-context.csv
SELECT banner FROM v$version;
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') AS session_user,
SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service_name
FROM dual;
SPOOL OFF
EXIT

Después, abre SQL*Plus sin incluir el secreto. -L evita el bucle de reprompt y -S reduce el ruido. @collect-context.sql ejecuta el archivo una vez autenticada la sesión:

Conservar contexto Oracle como CSV
sqlplus -L -S 'USERNAME@//FQDN:1521/SERVICE_NAME' @collect-context.sql

La señal esperada es un archivo cerrado por SPOOL OFF y un código de salida cero. Un archivo vacío con error en stderr no demuestra ausencia de filas. Conserva ambos canales.

ODAT agrupa descubrimiento de SID/service names, autenticación y módulos postautenticación. Empieza por el inventario general con el puerto fijado:

Inventariar capacidades con ODAT
odat all -s TARGET_IP -p 1521

all ejecuta varias comprobaciones y no es apropiado como primera acción en un entorno sensible. Inspecciona odat --help, selecciona el módulo que responda a la pregunta y fija threads, credenciales y listas. Confirma cada servicio con SQL*Plus.

Los módulos de archivos, Java, scheduler o ejecución cambian el estado o invocan funciones con impacto. Solo pasan a una rama posterior cuando los privilegios consultados justifican la prueba y existe cleanup.

oracle-tns-version consulta el listener. oracle-sid-brute prueba una lista de SID y oracle-brute intenta credenciales:

Identificar el listener
nmap -sV -p 1521 --script oracle-tns-version TARGET_IP

No confundas SID descubierto con SERVICE_NAME. Los servicios pueden apuntar a instancias, PDB o manejadores diferentes. Revisa el catálogo instalado con nmap --script-help 'oracle-*' y evita el glob como ejecución.

Conserva los códigos ORA- y TNS-. ORA-12514 suele indicar que el listener no conoce el servicio pedido. ORA-12505 apunta al SID del descriptor. ORA-01017 corresponde a credenciales. Un listener puede ocultar STATUS y aceptar conexiones válidas. Repite con el mismo descriptor antes de cambiar de herramienta.