Configurar MySQL/MariaDB en Kali
Configurar MySQL/MariaDB en Kali
Entiendo que estás buscando configurar o entender el paquete mysql-defaults en Kali Linux, probablemente porque te has topado con alguna configuración en inglés o necesitas ajustar el entorno de base de datos.
En Kali Linux (basado en Debian), el paquete mysql-defaults no es una base de datos en sí, sino un conjunto de archivos de configuración que apuntan a la implementación predeterminada de MySQL, que en la actualidad suele ser MariaDB.
Aquí tienes una guía rápida para manejar esto en español:
1. ¿Qué es mysql-defaults?
Es un paquete de metadatos. Su función principal es asegurar que, cuando instales MySQL, el sistema sepa qué archivos de configuración (my.cnf) usar y dónde encontrarlos. En Kali, esto generalmente redirige a /etc/mysql/mariadb.conf.d/.
2. Instalación y Configuración Básica
Si aún no tienes instalado el servidor, puedes hacerlo con:
sudo apt update
sudo apt install default-mysql-server
3. Cambiar el idioma de los mensajes de error
Si lo que buscas es que los errores de la base de datos aparezcan en español, debes editar el archivo de configuración principal:
Abre el archivo de configuración:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfBusca la sección
[mysqld]y añade o modifica la siguiente línea:lc-messages-dir = /usr/share/mysqllc-messages = es_ESGuarda (Ctrl+O) y sal (Ctrl+X).
Reinicia el servicio:
sudo systemctl restart mariadb
4. Comandos útiles en español
| Acción | Comando |
| Iniciar servicio | sudo systemctl start mariadb |
| Estado del servicio | sudo systemctl status mariadb |
| Entrar a la consola | sudo mysql -u root -p |
| Asegurar instalación | sudo mysql_secure_installation |
Nota de seguridad: Kali Linux está diseñado para pruebas de penetración. Si usas MariaDB/MySQL para un proyecto permanente, asegúrate de correr el comando
mysql_secure_installationpara eliminar usuarios anónimos y deshabilitar el login remoto de root.
Automatizar estas tareas te ahorrará mucho tiempo, especialmente si estás configurando laboratorios de pruebas en Kali.
Aquí tienes un script básico en Bash que hace el trabajo pesado por ti. Este script crea una base de datos, un usuario específico y le otorga todos los permisos necesarios.
Script de Automatización (crear_db.sh)
#!/bin/bash
# Configuración de variables
DB_NAME="mi_laboratorio"
DB_USER="pentester"
DB_PASS="PasswordSegura123!"
echo "--- Iniciando configuración de Base de Datos ---"
# Ejecutar comandos de MySQL
sudo mysql -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME};"
sudo mysql -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';"
sudo mysql -e "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
echo "-----------------------------------------------"
echo "Éxito: Base de datos '${DB_NAME}' creada."
echo "Usuario: ${DB_USER}"
echo "-----------------------------------------------"
Cómo usarlo:
Crea el archivo:
nano crear_db.sh(pega el código de arriba).Dale permisos de ejecución:
chmod +x crear_db.shEjecútalo:
./crear_db.sh
Estructura de permisos en MySQL
Para entender qué acabamos de hacer con el script, aquí tienes una representación de cómo se jerarquizan los permisos:
Global: Permisos en todo el servidor.
Database: Permisos solo en
mi_laboratorio.Table/Column: Control granular (poco común en laboratorios rápidos).
¿Qué sigue?
Si prefieres algo más avanzado, puedo mostrarte cómo conectar este entorno con un script de Python usando mysql-connector-python para insertar datos automáticamente desde un archivo de texto o un diccionario.
Entendido, vamos a darle un toque más profesional y robusto al script de Bash. Para que sea realmente útil en un entorno de Kali, es buena idea añadir interactividad (para no dejar contraseñas en texto plano en el código) y verificación de errores.
Aquí tienes una versión mejorada que incluye:
Entrada dinámica: Te pregunta el nombre y la clave en el momento.
Validación de privilegios: Revisa si eres
rootantes de intentar ejecutar nada.Limpieza visual: Borra la pantalla y usa colores para que los mensajes de éxito o error sean claros.
Script Avanzado (setup_db.sh)
#!/bin/bash
# Colores para la terminal
VERDE='\033[0;32m'
ROJO='\033[0;31m'
NC='\033[0m' # Sin color
# 1. Verificar si el usuario es root
if [ "$EUID" -ne 0 ]; then
echo -e "${ROJO}Error: Por favor, ejecuta este script con sudo.${NC}"
exit 1
fi
echo -e "${VERDE}--- Configuración de Base de Datos Interactiva ---${NC}"
# 2. Solicitar datos al usuario
read -p "Nombre de la base de datos: " DB_NAME
read -p "Nombre del nuevo usuario: " DB_USER
read -s -p "Contraseña para el usuario: " DB_PASS
echo -e "\n"
# 3. Ejecutar comandos en MariaDB/MySQL
echo "Configurando..."
mysql -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\`;"
mysql -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';"
mysql -e "GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_USER}'@'localhost';"
mysql -e "FLUSH PRIVILEGES;"
# 4. Confirmación final
if [ $? -eq 0 ]; then
echo -e "${VERDE}✔ Éxito: Todo se ha configurado correctamente.${NC}"
echo -e "Base de datos: ${DB_NAME}"
echo -e "Usuario: ${DB_USER}"
else
echo -e "${ROJO}✘ Error: Hubo un problema al ejecutar los comandos de SQL.${NC}"
fi
¿Qué cambió y por qué es mejor?
Comillas invertidas (`): En el comando
CREATE DATABASE \${DB_NAME}`;`, las usamos por si decides ponerle un nombre a la DB que contenga guiones o espacios (aunque no sea recomendable).Variable
$EUID: Es una forma segura de verificar que tienes permisos de administrador antes de que el script falle a mitad de camino.Flag
-senread: Esto hace que cuando escribas la contraseña, no se vea en la pantalla (modo "silencioso"), lo cual es una práctica básica de seguridad.Variable
$?: Revisa el "exit status" del último comando. Si es0, todo salió bien.
Próximo paso sugerido
Este script crea el usuario solo para acceso local (localhost). Si estás usando esta DB para una herramienta que corre en otra máquina o en un contenedor, necesitarías cambiar localhost por % o una IP específica.
Para habilitar el acceso remoto, no solo necesitamos que el usuario de la base de datos tenga permisos para conectarse desde cualquier lugar (el símbolo %), sino que también debemos decirle a MariaDB que deje de "escuchar" solo las conexiones internas de tu propia máquina.
Aquí tienes los dos pasos necesarios para completar tu configuración en Kali Linux:
1. Modificar la configuración del servidor (Bind-Address)
Por defecto, MariaDB solo acepta conexiones desde 127.0.0.1. Debes cambiar esto para que acepte conexiones de la red:
Abre el archivo de configuración:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfBusca la línea que dice:
bind-address = 127.0.0.1Cámbiala por:
bind-address = 0.0.0.0(Esto significa "escuchar en todas las interfaces de red").Guarda y sal (
Ctrl+O,Enter,Ctrl+X).Reinicia el servicio:
sudo systemctl restart mariadb
2. Script de Bash Ajustado para Acceso Remoto
He modificado el script anterior para que el usuario que crees pueda conectarse desde cualquier IP ('%') y no solo desde localhost.
#!/bin/bash
# Colores
VERDE='\033[0;32m'
ROJO='\033[0;31m'
NC='\033[0m'
# Verificar Root
if [ "$EUID" -ne 0 ]; then
echo -e "${ROJO}Error: Ejecuta con sudo.${NC}"
exit 1
fi
echo -e "${VERDE}--- Configuración de DB con ACCESO REMOTO ---${NC}"
read -p "Nombre de la base de datos: " DB_NAME
read -p "Nombre del usuario: " DB_USER
read -s -p "Contraseña: " DB_PASS
echo -e "\n"
# El cambio clave aquí es el uso de '%' en lugar de 'localhost'
mysql -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\`;"
mysql -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASS}';"
mysql -e "GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_USER}'@'%';"
mysql -e "FLUSH PRIVILEGES;"
if [ $? -eq 0 ]; then
echo -e "${VERDE}✔ Configuración remota lista.${NC}"
echo "Recuerda que bind-address debe estar en 0.0.0.0 en 50-server.cnf"
else
echo -e "${ROJO}✘ Error en la ejecución.${NC}"
fi
Resumen Visual del Flujo de Conexión
Cuando intentas conectar desde fuera, la comunicación sigue este camino:
Tip de Kali: Si tienes el firewall
ufwactivo, no olvides abrir el puerto 3306 con:sudo ufw allow 3306/tcp.
Para verificar que todo ha quedado bien configurado, vamos a realizar una prueba de conexión rápida. Esto confirmará que tanto el usuario con permisos remotos como el bind-address están funcionando correctamente.
1. Prueba de conexión local (Verificar el usuario)
Primero, asegúrate de que el usuario puede entrar desde la misma máquina Kali, pero simulando una conexión de red:
mysql -u tu_usuario -p -h 127.0.0.1
(Si te pide la contraseña y entras al prompt MariaDB [(none)]>, el usuario está bien creado).
2. Prueba de conexión remota (Desde otra máquina)
Si tienes otra máquina en la misma red (o una máquina virtual), intenta conectar usando la IP de tu Kali:
Obtén la IP de tu Kali:
hostname -I(supongamos que es192.168.1.50).Desde la otra máquina, ejecuta:
Bashmysql -u tu_usuario -p -h 192.168.1.50
¿Qué pasa si no conecta? (Troubleshooting)
Si recibes un error de "Connection refused" o "Timeout", revisa estos tres puntos clave:
| Problema | Solución |
| Firewall bloqueando | Ejecuta sudo ufw allow 3306/tcp para abrir el puerto. |
| Bind-address incorrecto | Verifica en /etc/mysql/mariadb.conf.d/50-server.cnf que no diga 127.0.0.1. |
| Servicio caído | Reinicia siempre tras cambios: sudo systemctl restart mariadb. |
Un toque final para tu laboratorio
Como estás en Kali, es muy probable que quieras ver los logs en tiempo real para saber quién intenta conectar a tu base de datos (útil para monitorear ataques o pruebas).
Activar el General Log es como poner una cámara de seguridad en tu base de datos. En Kali Linux, esto es súper útil para ver en tiempo real si tus scripts están enviando las consultas correctas o si alguien está intentando un ataque de SQL Injection.
Sigue estos pasos para activarlo y visualizarlo:
1. Activar el Log desde la Consola de MariaDB
No necesitas reiniciar el servidor para esto. Entra a MariaDB y ejecuta:
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log_file = '/var/log/mysql/query.log';
2. Dar permisos al archivo de Log
Para que el sistema pueda escribir y tú puedas leer el archivo sin problemas de permisos:
sudo touch /var/log/mysql/query.log
sudo chown mysql:adm /var/log/mysql/query.log
sudo chmod 640 /var/log/mysql/query.log
3. ¡La magia! Ver las consultas en tiempo real
Ahora, abre una nueva terminal y usa el comando tail con el parámetro -f (follow). Esto dejará la terminal abierta "escuchando" cada movimiento de la base de datos:
sudo tail -f /var/log/mysql/query.log
¿Qué verás en esa pantalla?
Cada vez que un usuario se conecte o desconecte.
Cualquier
SELECT,INSERToUPDATEque se ejecute.Intentos fallidos de acceso.
Una advertencia importante (Performance)
El General Log registra absolutamente todo. Si dejas esto encendido en un servidor con mucho tráfico, el archivo de texto crecerá gigabytes en muy poco tiempo y podría ralentizar el disco.
Tip: Cuando termines tus pruebas, apágalo con:
SET GLOBAL general_log = 'OFF';desde la consola de MariaDB.
Próximo paso: Seguridad
Esta es la mejor forma de proteger tu base de datos en un entorno de red. Si dejas el puerto 3306 abierto para todo el mundo (0.0.0.0), cualquier persona en tu red (o en internet, si tu IP es pública) podría intentar ataques de fuerza bruta contra tu usuario.
En Kali Linux, lo más sencillo es usar UFW (Uncomplicated Firewall). Vamos a configurar una regla que diga: "Solo permite tráfico al puerto 3306 si viene de ESTA dirección IP específica".
1. Instalar y activar UFW (si no lo tienes)
sudo apt update && sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
2. Crear la regla de acceso selectivo
Supongamos que la IP de tu otra máquina (desde donde te conectas) es 192.168.1.15. Ejecuta:
sudo ufw allow from 192.168.1.15 to any port 3306 proto tcp
3. Activar el firewall
sudo ufw enable
¿Cómo funciona esto?
El firewall actúa como un filtro antes de que el tráfico llegue siquiera a MariaDB. Aquí tienes el esquema de lo que acabamos de construir:
Verificación de reglas
Para ver qué reglas tienes activas y asegurarte de que no hay puertas abiertas innecesarias, usa:
sudo ufw status numbered
Si necesitas borrar una regla:
sudo ufw delete [número_de_regla]Si necesitas añadir otra IP: Repite el paso 2 con la nueva dirección.
Un último consejo de "Pentester"
Como estás usando Kali, es probable que quieras probar si tu seguridad funciona. Intenta conectar desde una tercera IP (una que no hayas autorizado). Deberías recibir un error de "Timeout", lo que significa que el firewall está descartando los paquetes silenciosamente (lo cual es genial, porque ni siquiera confirma que el puerto existe).
Cuando trabajas en Kali Linux, es común realizar pruebas, mover configuraciones y llenar logs. Tener un script de "limpieza profunda" (o cleanup) te permite dejar el sistema como nuevo y no dejar rastros de tus experimentos.
Aquí tienes un script que revierte los cambios de seguridad, limpia los registros de la base de datos y detiene los servicios si ya no los necesitas.
Script de Limpieza (limpiar_lab.sh)
#!/bin/bash
# Colores
AMARILLO='\033[1;33m'
NC='\033[0m'
echo -e "${AMARILLO}--- Iniciando limpieza del laboratorio de DB ---${NC}"
# 1. Desactivar el General Log en MariaDB
echo "Desactivando logs de consultas..."
sudo mysql -e "SET GLOBAL general_log = 'OFF';"
# 2. Vaciar el archivo de log (sin borrarlo para no romper permisos)
echo "Vaciando /var/log/mysql/query.log..."
sudo truncate -s 0 /var/log/mysql/query.log
# 3. Resetear reglas de Firewall (UFW)
# CUIDADO: Esto borra TODAS las reglas. Si tienes otras, hazlo manual.
read -p "¿Deseas resetear el firewall UFW por completo? (s/n): " confirm
if [ "$confirm" = "s" ]; then
sudo ufw reset
sudo ufw disable
echo "Firewall reseteado y desactivado."
fi
# 4. Detener el servicio MariaDB (opcional)
read -p "¿Deseas detener el servicio de MariaDB? (s/n): " stop_service
if [ "$stop_service" = "s" ]; then
sudo systemctl stop mariadb
echo "Servicio detenido."
fi
echo -e "${AMARILLO}✔ Limpieza completada.${NC}"
¿Por qué es útil este script?
Truncate vs RM: Usamos
truncate -s 0en lugar derm. Si borras el archivo, MariaDB podría dejar de escribir logs porque el "puntero" al archivo se rompe. Truncate simplemente lo deja en 0 bytes.Privacidad: Si estás haciendo auditorías o CTFs (Capture The Flag), no querrás que tus propias consultas SQL queden guardadas en el historial del sistema.
Gestión de recursos: Detener MariaDB cuando no se usa libera memoria RAM, algo vital si corres Kali en una máquina virtual con pocos recursos.
Resumen de tu entorno actual
Ahora tienes un flujo completo:
Instalación con
mysql-defaults.Configuración en español y acceso remoto.
Automatización con scripts de creación de usuarios/DB.
Monitoreo con General Logs.
Seguridad con UFW.
Limpieza con el script final.
Hacer un backup (también llamado dump o volcado) es la regla de oro antes de realizar cualquier limpieza o cambio estructural. En Kali, la herramienta estándar es mariadb-dump (antiguamente mysqldump).
Aquí tienes cómo hacerlo de forma manual y cómo integrarlo en un script para que sea automático.
1. El comando manual
Para exportar toda una base de datos a un archivo .sql:
sudo mariadb-dump -u root -p nombre_de_tu_db > backup_mi_db.sql
Si quieres respaldar todas las bases de datos del servidor a la vez:
sudo mariadb-dump -u root -p --all-databases > backup_completo.sql
2. Script de Backup Automático (respaldo.sh)
Este script es ideal porque le añade la fecha y hora al nombre del archivo, evitando que un backup nuevo borre el anterior.
#!/bin/bash
# Configuración
USER="root"
DB_NAME="mi_laboratorio"
DESTINO="./backups"
FECHA=$(date +"%Y-%m-%d_%H-%M")
# Crear carpeta si no existe
mkdir -p $DESTINO
echo "Generando backup de: $DB_NAME..."
# Ejecutar el volcado
sudo mariadb-dump -u $USER $DB_NAME > $DESTINO/backup_${DB_NAME}_${FECHA}.sql
if [ $? -eq 0 ]; then
echo -e "\033[0;32m✔ Backup guardado en: $DESTINO/backup_${DB_NAME}_${FECHA}.sql\033[0m"
else
echo -e "\033[0;31m✘ Error al crear el backup\033[0m"
fi
3. Cómo restaurar (El proceso inverso)
Si algo sale mal y necesitas recuperar tus datos, el proceso es muy sencillo. Primero asegúrate de que la base de datos existe (si no, créala vacía) y luego ejecuta:
sudo mysql -u root -p nombre_de_tu_db < backup_mi_db.sql
Resumen de comandos de mantenimiento
| Tarea | Comando |
| Exportar DB | mariadb-dump -u [user] -p [db] > file.sql |
| Importar DB | mysql -u [user] -p [db] < file.sql |
| Ver tamaño de DB | du -h /var/lib/mysql (requiere sudo) |
Con esto ya tienes un ciclo de vida completo para tus bases de datos en Kali: desde la creación y seguridad hasta el respaldo y la limpieza final.
Crear un entorno vulnerable (un "honeypot" o laboratorio de pruebas) es la mejor manera de entender cómo ocurren las brechas de seguridad.
Para que esto funcione, instalaremos un servidor web rápido y crearemos un archivo PHP que conecte con la base de datos que configuramos antes.
1. Preparar el servidor web
En tu Kali Linux, instala Apache y PHP:
sudo apt update
sudo apt install apache2 php php-mysql -y
sudo systemctl start apache2
2. Crear la aplicación vulnerable (index.php)
Vamos a crear un archivo en el directorio raíz del servidor web. Este código es intencionalmente inseguro porque inserta la variable $id directamente en la consulta SQL sin sanitizar.
Borra el archivo por defecto:
sudo rm /var/www/html/index.htmlCrea el nuevo archivo:
sudo nano /var/www/html/index.phpPega el siguiente código:
<?php
$conexion = mysqli_connect("localhost", "pentester", "PasswordSegura123!", "mi_laboratorio");
$id = $_GET['id']; // ¡VULNERABLE! No hay filtro.
$query = "SELECT usuario, email FROM usuarios WHERE id = $id";
$resultado = mysqli_query($conexion, $query);
while ($fila = mysqli_fetch_assoc($resultado)) {
echo "<h1> Perfil de: " . $fila['usuario'] . "</h1>";
echo "Email: " . $fila['email'];
}
?>
3. Insertar datos de prueba
Para que SQLmap tenga algo que "robar", necesitamos datos en la tabla. Entra a MariaDB y ejecuta:
USE mi_laboratorio;
CREATE TABLE usuarios (id INT, usuario VARCHAR(50), email VARCHAR(50));
INSERT INTO usuarios VALUES (1, 'admin', 'admin@local.test'), (2, 'victima', 'user@test.com');
4. ¡A probar con SQLmap!
Ahora que tu web está corriendo en http://localhost/index.php?id=1, abre una terminal y lanza el ataque:
sqlmap -u "http://localhost/index.php?id=1" --banner --current-db
¿Qué está pasando aquí?
SQLmap detectará que el parámetro id es vulnerable. Si le pides --dump, verás cómo extrae toda tu tabla de usuarios en segundos.
Visualización en vivo: Si tienes abierta la terminal con el comando
tail -f /var/log/mysql/query.logque configuramos antes, verás cientos de consultas extrañas entrando de golpe. ¡Eso es SQLmap trabajando!
Pasar de un código vulnerable a uno seguro es el paso más importante para cualquier desarrollador o administrador de sistemas. La técnica que vamos a usar se llama Consultas Preparadas (Prepared Statements).
¿Por qué el código anterior era peligroso?
En el código anterior, hacíamos una concatenación: "SELECT ... WHERE id = " . $id.
Si un atacante enviaba 1 OR 1=1, la consulta se convertía en "SELECT ... WHERE id = 1 OR 1=1", lo que devolvía todos los registros de la tabla.
El Código Seguro (index_seguro.php)
Modifica tu archivo PHP con esta estructura profesional y segura:
<?php
// 1. Conexión a la base de datos
$conexion = new mysqli("localhost", "pentester", "PasswordSegura123!", "mi_laboratorio");
// 2. Obtener el ID del parámetro GET
$id_usuario = $_GET['id'];
// 3. PREPARAR la consulta con un marcador de posición (?)
// Esto le dice a MySQL: "Espera un dato, pero no lo ejecutes todavía"
$stmt = $conexion->prepare("SELECT usuario, email FROM usuarios WHERE id = ?");
// 4. VINCULAR el parámetro (s = string, i = integer)
// Aquí "i" indica que el ID debe ser un número entero. Si mandan texto, fallará.
$stmt->bind_param("i", $id_usuario);
// 5. EJECUTAR y obtener resultados
$stmt->execute();
$resultado = $stmt->get_result();
if ($fila = $resultado->fetch_assoc()) {
echo "<h1> Perfil de: " . htmlspecialchars($fila['usuario']) . "</h1>";
echo "Email: " . htmlspecialchars($fila['email']);
} else {
echo "Usuario no encontrado.";
}
$stmt->close();
$conexion->close();
?>
¿Qué hace que esto sea "Hack-Proof"?
Separación de Datos y Lógica: Al usar el signo
?, la base de datos compila la estructura de la consulta antes de recibir los datos del usuario. El dato se trata puramente como texto o número, nunca como parte del comando SQL.Tipado Estricto: Con
bind_param("i", ...), si alguien intenta inyectar código (como'1 OR 1=1'), el sistema intentará convertirlo a un número entero y, al fallar o no coincidir, la inyección simplemente no se ejecutará.Protección XSS: He añadido
htmlspecialchars(). Esto evita que, si un atacante logra meter código JavaScript en tu base de datos, este se ejecute en el navegador de otros usuarios.
Prueba final con SQLmap
Si intentas ejecutar SQLmap contra esta nueva versión:
sqlmap -u "http://localhost/index_seguro.php?id=1"
Verás que SQLmap te dirá algo como: "Target parameter 'id' does not seem to be injectable". ¡Misión cumplida!
Resumen de tu Aprendizaje
Has recorrido todo el camino:
Instalaste y configuraste el entorno en Kali.
Automatizaste la creación de DBs y Backups.
Abriste el acceso remoto y lo protegiste con un Firewall.
Creaste una vulnerabilidad, la explotaste y luego la parcheaste.
Este es el toque final para tu laboratorio en Kali. Un script de auditoría (o hardening check) es una herramienta que escanea tu propia base de datos en busca de configuraciones débiles que un atacante podría aprovechar.
En lugar de atacar desde fuera con SQLmap, este script mira "dentro" de las tablas del sistema de MariaDB.
Script de Auditoría de Seguridad (auditoria_db.sh)
#!/bin/bash
# Colores para el reporte
ROJO='\033[0;31m'
VERDE='\033[0;32m'
AMARILLO='\033[1;33m'
NC='\033[0m'
echo -e "${AMARILLO}--- Iniciando Auditoría de Seguridad MariaDB ---${NC}\n"
# 1. Verificar usuarios sin contraseña
echo -n "1. Usuarios sin contraseña: "
users_no_pass=$(sudo mysql -N -s -e "SELECT COUNT(*) FROM mysql.user WHERE password='' OR authentication_string='';")
if [ "$users_no_pass" -gt 0 ]; then
echo -e "${ROJO}PELIGRO ($users_no_pass usuarios encontrados)${NC}"
else
echo -e "${VERDE}OK${NC}"
fi
# 2. Verificar si root puede conectar remotamente
echo -n "2. Root con acceso remoto (%): "
root_remote=$(sudo mysql -N -s -e "SELECT COUNT(*) FROM mysql.user WHERE user='root' AND host='%';")
if [ "$root_remote" -gt 0 ]; then
echo -e "${ROJO}ALTO RIESGO (Detectado)${NC}"
else
echo -e "${VERDE}SEGURO (Solo local)${NC}"
fi
# 3. Verificar bases de datos de prueba (test)
echo -n "3. Existencia de base de datos 'test': "
test_db=$(sudo mysql -N -s -e "SHOW DATABASES LIKE 'test';")
if [ ! -z "$test_db" ]; then
echo -e "${AMARILLO}ADVERTENCIA (Eliminar DB 'test')${NC}"
else
echo -e "${VERDE}OK${NC}"
fi
# 4. Verificar carga de archivos locales (LOAD DATA LOCAL INFILE)
echo -n "4. Local Infile (Lectura de archivos): "
infile_status=$(sudo mysql -N -s -e "SHOW VARIABLES LIKE 'local_infile';" | awk '{print $2}')
if [ "$infile_status" == "ON" ]; then
echo -e "${AMARILLO}ACTIVADO (Riesgo de exfiltración)${NC}"
else
echo -e "${VERDE}DESACTIVADO (Seguro)${NC}"
fi
echo -e "\n${AMARILLO}--- Fin de la Auditoría ---${NC}"
¿Qué significan estos puntos?
Usuarios sin contraseña: Es la vulnerabilidad más básica. A veces, al instalar
mysql-defaults, se crean usuarios de mantenimiento que quedan abiertos.Root Remoto: El usuario
rootNUNCA debería poder conectar desde%. Si alguien adivina la clave de root remotamente, tiene el control total de tu servidor.Base de datos 'test': Por defecto, MySQL trae una base de datos llamada
testa la que cualquiera puede entrar. Borrarla es parte del proceso de "limpieza" estándar.Local Infile: Si está en
ON, un atacante con acceso SQL podría usar comandos para leer archivos sensibles de tu Kali (como/etc/passwd) y verlos en los resultados de una consulta.
El "Checkmate" de la Seguridad
Si el script de auditoría te da muchos errores en rojo, la forma más rápida de solucionar casi todo de golpe es el comando oficial que mencionamos al principio:
sudo mysql_secure_installation
Este asistente interactivo te guiará para poner clave a root, borrar usuarios anónimos y eliminar la base de datos de prueba.
Resumen del flujo de trabajo en Kali
| Paso | Herramienta/Concepto |
| Configuración | mysql-defaults + scripts de Bash |
| Defensa | UFW (Firewall) + Prepared Statements (PHP) |
| Ofensiva | SQLmap (para pruebas de penetración) |
| Control | General Log + Auditoría Script |
Tener una documentación clara es lo que separa a un usuario casual de un profesional de la ciberseguridad o un administrador de sistemas. He preparado este archivo en formato Markdown (.md) que resume todo nuestro trabajo.
Puedes copiar este contenido en un archivo llamado GUIA_MYSQL_KALI.md en tu carpeta de notas.
📚 Guía Maestra: MySQL/MariaDB en Kali Linux
Esta guía resume la configuración, seguridad, explotación controlada y defensa de un entorno de base de datos.
1. Configuración Inicial
El paquete mysql-defaults en Kali apunta a MariaDB.
Instalación:
sudo apt install default-mysql-serverIdioma (Español): Editar
/etc/mysql/mariadb.conf.d/50-server.cnfy añadir:lc-messages-dir = /usr/share/mysqllc-messages = es_ES
2. Acceso Remoto y Seguridad de Red
Para permitir conexiones externas de forma segura:
Escucha Global: Cambiar
bind-address = 127.0.0.1a0.0.0.0en el archivo.cnf.Firewall (UFW): Restringir el puerto 3306 a una IP específica:
sudo ufw allow from [TU_IP] to any port 3306 proto tcp
3. Scripts de Automatización (Resumen)
A. Creación de DB y Usuario
mysql -e "CREATE DATABASE IF NOT EXISTS lab_db;"
mysql -e "CREATE USER 'user'@'%' IDENTIFIED BY 'pass';"
mysql -e "GRANT ALL PRIVILEGES ON lab_db.* TO 'user'@'%';"
B. Respaldo (Backup)
mariadb-dump -u root -p lab_db > backup_$(date +%F).sql
4. Auditoría y Pentesting
Para probar la seguridad de tus aplicaciones, usamos un flujo de Ataque vs Defensa:
| Fase | Acción / Herramienta | Propósito |
| Vulnerabilidad | Parámetro $_GET['id'] sin filtrar | Simular un punto de entrada débil. |
| Ataque | sqlmap -u "URL" --dbs | Automatizar la extracción de datos. |
| Monitoreo | tail -f /var/log/mysql/query.log | Ver las huellas del atacante en tiempo real. |
| Defensa | Prepared Statements (PHP) | Prevenir la inyección separando lógica de datos. |
5. Comandos de Supervivencia
Reiniciar servicio:
sudo systemctl restart mariadbVer logs en vivo:
SET GLOBAL general_log = 'ON';(dentro de MySQL).Hardening rápido:
sudo mysql_secure_installation
¡Esa es la actitud de un verdadero usuario de Kali! La línea de comandos (CLI) te da un control total, es más rápida y consume menos recursos que cualquier interfaz gráfica.
Para profundizar, vamos a ver técnicas avanzadas de administración interna y análisis forense de la base de datos que te harán moverte como un experto.
1. Consultas de "Inteligencia" (Information Schema)
En lugar de solo ver tablas, puedes interrogar al diccionario de datos de MariaDB para encontrar debilidades o estructuras. Esto es lo que herramientas como SQLmap hacen por debajo.
Entra a MariaDB (sudo mysql) y prueba esto:
Listar tablas con más filas (útil para encontrar datos sensibles):
SQLSELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'mi_laboratorio' ORDER BY table_rows DESC;Buscar columnas que se llamen "pass" o "pwd" en todo el servidor:
SQLSELECT table_schema, table_name, column_name FROM information_schema.columns WHERE column_name LIKE '%pass%' OR column_name LIKE '%pwd%';
2. Gestión de Procesos en Tiempo Real
Si sospechas que un script se ha quedado colgado o que alguien está ejecutando una consulta pesada, puedes ver qué está pasando "ahora mismo":
Ver procesos activos:
SQLSHOW FULL PROCESSLIST;Matar un proceso sospechoso:
Si ves un ID (por ejemplo, el 45) que está tardando demasiado:
SQLKILL 45;
3. Comandos de Terminal (Fuera de MySQL)
No siempre necesitas entrar al prompt de MySQL. Puedes administrar desde la Bash de Kali:
Verificar la versión y variables sin entrar:
mysqladmin -u root -p variables | grep versionComprobar si el servidor "está vivo":
mysqladmin -u root -p pingMonitor de rendimiento rápido:
mysqladmin -u root -p proc stat
4. Análisis de fragmentación y optimización
Con el tiempo, las tablas de laboratorio pueden volverse lentas tras borrar y meter datos. Puedes optimizarlas directamente desde la terminal:
# Optimizar todas las tablas de una base de datos específica
mysqlcheck -u root -p --optimize mi_laboratorio
5. El "History" de MySQL
Al igual que en Bash, MySQL guarda un historial de lo que escribes. En Kali, esto es un riesgo de seguridad si dejas contraseñas en los comandos.
Dónde está:
~/.mysql_historyLimpiarlo:
cat /dev/null > ~/.mysql_historyEvitar que guarde historial (truco ninja):
Crea un enlace simbólico a
/dev/null:ln -sf /dev/null ~/.mysql_history
¡Esta es una excelente manera de combinar tus habilidades de Bash con la administración de bases de datos! Vamos a crear un script que no solo recoja datos técnicos, sino que los formatee en un archivo HTML visual que podrías abrir en el navegador de tu Kali (Firefox) para ver un reporte profesional.
Este script usará etiquetas HTML básicas y comandos de consola para extraer la "salud" de MariaDB.
Script: Generador de Reporte de Salud (reporte_db.sh)
#!/bin/bash
# Configuración
OUTPUT="reporte_mariadb.html"
FECHA=$(date +"%d/%m/%Y %H:%M:%S")
echo "Generando reporte de salud..."
# Inicio del HTML
cat <<EOF > $OUTPUT
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Reporte de Salud MariaDB - Kali Linux</title>
<style>
body { font-family: sans-serif; background: #2c3e50; color: #ecf0f1; padding: 20px; }
h1 { color: #3498db; }
.card { background: #34495e; padding: 15px; border-radius: 8px; margin-bottom: 20px; box-shadow: 0 4px 6px rgba(0,0,0,0.3); }
table { width: 100%; border-collapse: collapse; }
th, td { text-align: left; padding: 10px; border-bottom: 1px solid #7f8c8d; }
th { background: #2980b9; }
.status-ok { color: #2ecc71; font-weight: bold; }
</style>
</head>
<body>
<h1>📊 Reporte de Estado MariaDB</h1>
<p>Generado el: $FECHA</p>
<div class="card">
<h2>1. Información del Servidor</h2>
<table>
<tr><th>Variable</th><th>Valor</th></tr>
$(mysql -N -s -e "SHOW VARIABLES WHERE Variable_name IN ('version', 'hostname', 'datadir', 'max_connections');" | awk '{print "<tr><td>" $1 "</td><td>" $2 "</td></tr>"}')
</table>
</div>
<div class="card">
<h2>2. Tamaño de las Bases de Datos</h2>
<table>
<tr><th>Base de Datos</th><th>Tamaño (MB)</th></tr>
$(mysql -N -s -e "SELECT table_schema 'DB', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) 'Size' FROM information_schema.tables GROUP BY table_schema;" | awk '{print "<tr><td>" $1 "</td><td>" $2 "</td></tr>"}')
</table>
</div>
<div class="card">
<h2>3. Usuarios y Permisos Críticos</h2>
<table>
<tr><th>Usuario</th><th>Host</th><th>¿Acceso Total?</th></tr>
$(mysql -N -s -e "SELECT user, host, Super_priv FROM mysql.user WHERE Super_priv='Y';" | awk '{print "<tr><td>" $1 "</td><td>" $2 "</td><td>" $3 "</td></tr>"}')
</table>
</div>
<p><em>Reporte generado automáticamente desde Kali Linux CLI.</em></p>
</body>
</html>
EOF
echo -e "\033[0;32m✔ Reporte generado con éxito: $OUTPUT\033[0m"
# Abrir automáticamente en Firefox (opcional)
# firefox $OUTPUT &
¿Cómo funciona este "Reporteador"?
Heredoc (
cat <<EOF): Es una técnica de Bash que permite escribir bloques grandes de texto (en este caso HTML/CSS) directamente en un archivo, inyectando variables en medio.Inyección de Comandos: Dentro del HTML, ejecutamos sub-shells
$(mysql ...)que obtienen los datos reales de MariaDB y los formatean como filas de tabla (<tr><td>).Information Schema: Usamos las tablas internas de MySQL para calcular el tamaño de los datos en disco, algo que no se ve con un simple
SHOW DATABASES.
Análisis de los resultados
Cuando abras el archivo reporte_mariadb.html en Firefox, fíjate especialmente en la sección de Usuarios y Permisos Críticos:
Si ves muchos usuarios con
Super_priv='Y', tu superficie de ataque es grande.Si el tamaño de
datadirestá cerca del límite de tu disco en Kali, podrías tener problemas de rendimiento pronto.
¿Qué te gustaría hacer ahora?
Podríamos llevar esto al siguiente nivel:
Programar el reporte: Hacer que se ejecute solo cada hora usando
cron.Análisis de Índices: Añadir una sección al reporte que te diga qué tablas no tienen índices (lo que las hace lentas).
Logs de Errores: Incluir las últimas 10 líneas del log de errores de MariaDB en el HTML.