MySQLPostgreSQLBase de datos5 min de lectura

Asegurar bases de datos MySQL/PostgreSQL

Bind a localhost, contraseñas fuertes, privilegios mínimos, conexiones cifradas y backups encriptados.


Principios de seguridad para bases de datos

  • Mínimo privilegio: cada usuario solo accede a lo que necesita
  • Bind a localhost: no exponer al mundo
  • Contraseñas fuertes y únicas
  • Conexiones cifradas cuando sea posible
  • Backups regulares y encriptados

MySQL: Configuración segura

Ejecutar mysql_secure_installation

bash
sudo mysql_secure_installation

Esto permite:

  • Configurar contraseña de root
  • Eliminar usuarios anónimos
  • Deshabilitar login remoto de root
  • Eliminar base de datos de test

Bind a localhost

Editá /etc/mysql/mysql.conf.d/mysqld.cnf:

ini
[mysqld]
bind-address = 127.0.0.1
bash
sudo systemctl restart mysql

Crear usuarios con privilegios mínimos

sql
-- Crear usuario para una app específica
CREATE USER 'miapp'@'localhost' IDENTIFIED BY 'ContraseñaFuerte123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON miapp_db.* TO 'miapp'@'localhost';
FLUSH PRIVILEGES;

-- Nunca usar GRANT ALL a menos que sea estrictamente necesario

Eliminar bases y usuarios de test

sql
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

PostgreSQL: Configuración segura

Configurar autenticación

Editá /etc/postgresql/16/main/pg_hba.conf:

terminal
# Solo conexiones locales con contraseña
local   all   all                 scram-sha-256
host    all   all   127.0.0.1/32  scram-sha-256

Bind a localhost

Editá /etc/postgresql/16/main/postgresql.conf:

terminal
listen_addresses = 'localhost'
bash
sudo systemctl restart postgresql

Crear roles con privilegios mínimos

sql
-- Crear rol para la aplicación
CREATE ROLE miapp WITH LOGIN PASSWORD 'ContraseñaFuerte123!';
GRANT CONNECT ON DATABASE miapp_db TO miapp;
GRANT USAGE ON SCHEMA public TO miapp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO miapp;

Conexiones cifradas (SSL)

MySQL con SSL

sql
-- Verificar estado SSL
SHOW VARIABLES LIKE '%ssl%';

-- Forzar SSL para un usuario
ALTER USER 'miapp'@'%' REQUIRE SSL;

PostgreSQL con SSL

En postgresql.conf:

terminal
ssl = on
ssl_cert_file = '/etc/ssl/certs/server.crt'
ssl_key_file = '/etc/ssl/private/server.key'

Backups encriptados

bash
# MySQL: backup cifrado con gpg
mysqldump -u root -p miapp_db | gpg --symmetric --cipher-algo AES256 -o backup_$(date +%Y%m%d).sql.gpg

# PostgreSQL: backup cifrado
pg_dump miapp_db | gpg --symmetric --cipher-algo AES256 -o backup_$(date +%Y%m%d).sql.gpg

# Restaurar
gpg -d backup_20260115.sql.gpg | mysql -u root -p miapp_db

Recomendaciones

  • Nunca expongas el puerto de la base de datos a internet
  • Si necesitás acceso remoto, usá un túnel SSH
  • Rotá contraseñas de base de datos cada 3-6 meses
  • Monitoreá queries lentas y conexiones activas
  • Mantené la base de datos actualizada con parches de seguridad

¿Te resultó útil esta guía?