03 febrero 2025

 Desarrollo de Scripts en Kotlin para Monitoreo de Oracle 19c y 23ai



Aquí te dejo ejemplos de uso de espacio, sesiones activas y locks, además de una estructura de proyecto en Kotlin para monitoreo de bases de datos Oracle.

Configuración del Proyecto en Kotlin

Si estás desarrollando un proyecto con Kotlin y Oracle, usa Gradle para gestionar las dependencias.

Estructura del Proyecto

/KotlinOracleMonitor

 ├── /src

 │   ├── Main.kt

 │   ├── Database.kt

 │   ├── SpaceMonitor.kt

 │   ├── SessionMonitor.kt

 │   ├── LockMonitor.kt

 ├── build.gradle.kts

 ├── settings.gradle.kts

 └── README.md

Dependencias en build.gradle.kts

plugins {
    kotlin("jvm") version "1.9.0"
    application
}
repositories {
    mavenCentral()
}
dependencies {
    implementation("com.oracle.database.jdbc:ojdbc8:19.8.0.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
application {
    mainClass.set("MainKt")
}

Configuración de la Conexión a Oracle

Archivo: Database.kt

import java.sql.Connection
import java.sql.DriverManager
object Database {
    private const val URL = "jdbc:oracle:thin:@//localhost:1521/ORCL"
    private const val USER = "admin"
    private const val PASSWORD = "password"
    fun getConnection(): Connection {
        return DriverManager.getConnection(URL, USER, PASSWORD)
    }
}

Monitoreo del Uso de Espacio

Archivo: SpaceMonitor.kt

fun checkTablespaceUsage() {
    val connection = Database.getConnection()
    val query = """
        SELECT tablespace_name, 
               round((used_space / total_space) * 100, 2) AS used_percentage 
        FROM (
            SELECT tablespace_name,
                   sum(bytes) / 1024 / 1024 AS used_space,
                   (SELECT sum(bytes) / 1024 / 1024 
                    FROM dba_data_files 
                    WHERE tablespace_name = t.tablespace_name) AS total_space
            FROM dba_segments t
            GROUP BY tablespace_name
        )
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("Tablespace: ${resultSet.getString("tablespace_name")}, Uso: ${resultSet.getDouble("used_percentage")}%")
    }
    connection.close()
}

Monitoreo de Sesiones Activas

Archivo: SessionMonitor.kt

fun checkActiveSessions() {
    val connection = Database.getConnection()
    val query = """
        SELECT sid, serial#, username, status, machine, osuser, program 
        FROM v$session 
        WHERE status = 'ACTIVE'
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("SID: ${resultSet.getInt("sid")}, User: ${resultSet.getString("username")}, Status: ${resultSet.getString("status")}")
    }
    connection.close()
}

Monitoreo de Locks (Bloqueos en la Base de Datos)

Archivo: LockMonitor.kt

fun checkLocks() {
    val connection = Database.getConnection()
    val query = """
        SELECT l.sid, s.serial#, s.username, l.type, l.lmode, l.request, o.object_name 
        FROM v$lock l
        JOIN v$session s ON l.sid = s.sid
        LEFT JOIN dba_objects o ON l.id1 = o.object_id
        WHERE l.lmode > 0
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("SID: ${resultSet.getInt("sid")}, Usuario: ${resultSet.getString("username")}, Objeto: ${resultSet.getString("object_name")}")
    }
    connection.close()
}

Ejecutar Monitoreo

Archivo: Main.kt

fun main() {
    println("Monitoreo de Oracle 19c / 23ai ")
    
    println("\n Uso de Tablespaces:")
    checkTablespaceUsage()
    println("\n Sesiones Activas:")
    checkActiveSessions()
    println("\n Locks en la Base de Datos:")
    checkLocks()
}

Ejecutar el Proyecto

Compilar y ejecutar

./gradlew run

O en Windows:

gradlew.bat run

Salida esperada en consola

Monitoreo de Oracle 19c / 23ai 

Uso de Tablespaces:

Tablespace: USERS, Uso: 65.2%

Tablespace: SYSTEM, Uso: 82.3%

Sesiones Activas:

SID: 123, User: SYSTEM, Status: ACTIVE

Locks en la Base de Datos:

SID: 456, Usuario: HR, Objeto: EMPLOYEES


Conclusión

Con este proyecto, un DBA puede:

 Monitorear el uso de espacio de tablespaces.

  • Ver sesiones activas en la base de datos.
  • Detectar bloqueos (locks) en tiempo real.
  • Automatizar reportes o alertas integrando con Telegram, email o Grafana.


02 febrero 2025

Ciberseguridad en Aplicaciones Web Empresariales: OWASP y la Protección de Bases de Datos Relacionales y NoSQL



En un entorno digital donde las aplicaciones web empresariales son el núcleo de las operaciones modernas, garantizar la seguridad de los datos almacenados es una prioridad absoluta. Las bases de datos, tanto relacionales como NoSQL, juegan un papel crítico en la gestión y disponibilidad de la información. 
Soluciones como Oracle Database, PostgreSQL, MariaDB, MySQL y Apache Cassandra sustentan aplicaciones que soportan desde operaciones bancarias hasta plataformas de comercio electrónico.
Sin embargo, estas tecnologías no están exentas de riesgos. Desde inyecciones SQL hasta configuraciones erróneas, las vulnerabilidades pueden comprometer la continuidad del negocio. 
Aquí es donde la metodología OWASP (Open Web Application Security Project) ofrece un marco esencial para identificar, prevenir y mitigar los principales riesgos de seguridad en aplicaciones web conectadas a bases de datos.
OWASP (Open Web Application Security Project) es una organización sin fines de lucro dedicada a mejorar la seguridad del software. Su enfoque principal es identificar y mitigar los riesgos más críticos en las aplicaciones web.
 A continuación, se resumen algunos aspectos clave orientados a aplicaciones web que interactúan con bases de datos como Oracle, PostgreSQL, MariaDB, MySQL y Cassandra:

Vulnerabilidades Comunes y Riesgos Asociados a Bases de Datos

Inyección SQL

Consiste en la manipulación de consultas SQL a través de la entrada de datos no sanitizada. Afecta bases de datos relacionales como Oracle, MySQL, PostgreSQL y MariaDB.

Medidas de mitigación:

  • Usar consultas preparadas (Prepared Statements) o procedimientos almacenados.
  • Validar y sanitizar las entradas de los usuarios.
  • Implementar un principio de privilegios mínimos en las cuentas de acceso.

Configuración Incorrecta de Seguridad

La configuración por defecto o la incorrecta implementación de medidas de seguridad puede exponer bases de datos a riesgos.

Medidas de mitigación:

  • Deshabilitar funciones innecesarias (como xp_cmdshell en SQL Server o funciones de superusuario en Cassandra).
  • Restringir el acceso a las bases de datos desde redes externas.
  • Aplicar parches y actualizaciones de seguridad regularmente.

Exposición de Datos Sensibles

La falta de cifrado en tránsito y en reposo puede exponer datos sensibles almacenados en bases de datos.

Medidas de mitigación:

  • Cifrar conexiones con TLS/SSL.
  • Cifrar datos sensibles en la base de datos utilizando herramientas como Transparent Data Encryption (TDE) para datos "rest" Oracle o características nativas en PostgreSQL.

Autenticación y Gestión de Credenciales

El uso de credenciales débiles o reutilizadas para la conexión a bases de datos es un riesgo común.

Medidas de mitigación:

  • Implementar autenticación robusta (uso de claves SSH, OAuth2 o certificados).
  • Gestionar credenciales mediante herramientas seguras como HashiCorp Vault.
  • OWASP Top 10 y Bases de Datos

Los riesgos identificados en el OWASP Top 10 (como inyección, configuración incorrecta y control de acceso roto) son directamente aplicables a sistemas que dependen de bases de datos.

Buenas prácticas generales:

Automatizar análisis de vulnerabilidades en código y dependencias con herramientas como OWASP Dependency-Check.

Implementar auditorías y monitoreo de actividades inusuales en la base de datos.

Herramientas Útiles

  • OWASP ZAP: Escaneo de seguridad para aplicaciones web, útil para identificar inyección SQL y problemas de configuración.
  • SQLMap: Para pruebas de penetración y detección de vulnerabilidades relacionadas con inyecciones SQL.
  • Database Activity Monitoring (DAM): Soluciones como Oracle Audit Vault y herramientas similares para otros sistemas de base de datos.

Recomendaciones Específicas por Base de Datos

Oracle Database

  1. Utilizar el parámetro DBMS_ASSERT para validar datos de entrada en procedimientos almacenados.
  2. Configurar Oracle Data Redaction para evitar exposiciones accidentales de datos sensibles.

PostgreSQL

  • Configurar roles y privilegios con cuidado mediante el sistema de roles.
  • Utilizar extensiones como pgcrypto para cifrado de datos sensibles.

MariaDB/MySQL

Activar sql_mode con opciones como STRICT_TRANS_TABLES para evitar errores de tipo y asegurar consultas consistentes.

Usar el cifrado nativo de tablas y conexiones TLS.

Cassandra

  • Implementar autenticación con el subsistema Authenticator y autorización granular con Role-Based Access Control (RBAC).
  • Proteger nodos con encriptación entre nodos y cifrado de datos en disco.

Este enfoque permite mantener la seguridad de aplicaciones web que interactúan con bases de datos modernas, mitigando riesgos críticos y cumpliendo con estándares de la industria.

La seguridad en aplicaciones web empresariales no puede ser tratada como una tarea secundaria, especialmente cuando se depende de bases de datos robustas como Oracle Database, PostgreSQL, MariaDB, MySQL y Apache Cassandra. 

La implementación de buenas prácticas basadas en la metodología OWASP permite no solo identificar y mitigar riesgos críticos, como la inyección SQL o la exposición de datos sensibles, sino también establecer una cultura de ciberseguridad centrada en la continuidad del negocio. 

 Al adoptar estrategias como el uso de consultas preparadas, la gestión de privilegios mínimos y la encriptación de datos en tránsito y en reposo, las organizaciones pueden reducir significativamente las vulnerabilidades. Además, al integrar herramientas de monitoreo y auditoría, y actualizar constantemente sus sistemas, no solo se protegen los activos digitales, sino que también se refuerza la confianza de los clientes y socios. La ciberseguridad, en este contexto, deja de ser una barrera y se convierte en un habilitador clave para el éxito sostenible en un entorno empresarial dinámico y conectado.