Rocky Linux / Instalar MariaDB y restringir el acceso a la base de datos

En Rocky Linux, puede iniciar el servidor MariaDB instalando el paquete mariadb-server y activando el servicio mariadb. Después de la instalación, elimine las cuentas predeterminadas innecesarias con mariadb-secure-installation y cree cuentas con los privilegios mínimos que utilizarán las aplicaciones en lugar de root.

Comprobar la versión disponible y los paquetes

cat /etc/rocky-release
dnf info mariadb-server
dnf module list mariadb

Según la versión de Rocky Linux y la implementación de DNF, el soporte de comandos de módulo y la versión proporcionada varían. Si la aplicación requiere una versión principal específica de MariaDB, elija entre el repositorio predeterminado y el repositorio oficial de MariaDB, y no mezcle paquetes del servidor de diferentes repositorios.

Instalar y iniciar MariaDB

Instalar paquetes del servidor

sudo dnf install mariadb-server

Verifique el resultado de la instalación.

rpm -q mariadb-server
mariadb --version

Activar servicio

sudo systemctl enable --now mariadb
systemctl status mariadb

Si falla el arranque, consulte el siguiente registro para identificar la causa.

journalctl -u mariadb -b --no-pager

Verificación de acceso del administrador local

sudo mariadb

Recientemente, MariaDB suele configurarse utilizando la autenticación de socket Unix para la cuenta de base de datos root. En este caso, se puede acceder localmente con privilegios de administrador de Linux y puede no ser necesario crear una contraseña separada para root de la base de datos.

Configurar la seguridad inicial

sudo mariadb-secure-installation

Esta herramienta permite configurar de manera interactiva la eliminación de usuarios anónimos, la restricción de acceso remoto de root, la eliminación de la base de datos de prueba, entre otros. A partir de MariaDB 10.4, debido a la autenticación por socket Unix, las instrucciones antiguas y el flujo de preguntas pueden ser diferentes. Para más detalles, consulte el documento oficial de instalación segura de MariaDB.

El nombre mysql_secure_installation puede conservarse como enlace de compatibilidad, pero en documentación nueva resulta más claro usar mariadb-secure-installation.

Crear base de datos y cuenta para la aplicación

Crear base de datos

Abra una sesión administrativa con sudo mariadb y ejecute los siguientes comandos SQL dentro del cliente, conservando el punto y coma final. El resultado esperado es la creación de la base de datos y del usuario; si ya existen, revise su configuración en vez de borrarlos o repetir la creación sin comprobarla.

CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

La regla de colación afecta los resultados de búsqueda y ordenación y el comportamiento de los índices. Verifique los requisitos de la aplicación y la lista de compatibilidad del MariaDB que está utilizando.

Crear usuario exclusivo local

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'replace-with-a-strong-secret';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';

No use la contraseña de ejemplo tal cual. Asigne solo los permisos necesarios para la aplicación y evite GRANT ALL ON *.* y el uso remoto de root.

Verificación de permisos

SHOW GRANTS FOR 'appuser'@'localhost';

Compruebe que los permisos enumerados se limiten a appdb.*. Escriba exit; para volver a la shell antes de ejecutar las órdenes del sistema. Para crear la cuenta remota, abra de nuevo la sesión administrativa y salga antes de configurar el cortafuegos.

En las versiones recientes de MariaDB, los comandos de cambio de cuenta y permisos se aplican de inmediato, por lo que no es necesario ejecutar siempre FLUSH PRIVILEGES después de CREATE USER y GRANT. No modifique directamente las tablas de permisos.

Permitir acceso remoto de manera limitada

Comprobar las opciones y puertos de escucha

sudo mariadbd --print-defaults
ss -lntp | grep 3306

La ubicación del archivo de configuración y el orden de aplicación pueden variar según el paquete. Verifique la relación de inclusión de /etc/my.cnf y /etc/my.cnf.d/ y haga una copia de seguridad de los archivos existentes.

Escuchar solo en una dirección del servidor

En la sección [mysqld], configure una dirección que esté realmente asignada a la interfaz privada del servidor. 192.0.2.20 es una dirección reservada para documentación; sustitúyala antes de guardar. Compruebe también que skip-networking no desactive TCP.[mysqld].

[mysqld]
bind-address = 192.0.2.20

Dado que 0.0.0.0 recibe desde todas las interfaces IPv4, restrínjalo a direcciones específicas a menos que sea absolutamente necesario. Para la configuración de acceso remoto, puede consultar la Guía oficial de conexión remota de MariaDB.

Usuarios exclusivamente remotos y restricciones de firewall

CREATE USER 'appuser'@'192.0.2.10' IDENTIFIED BY 'replace-with-a-strong-secret';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'192.0.2.10';

En la shell, identifique la zona de la interfaz que recibe la conexión y sustituya REPLACE_WITH_ACTIVE_ZONE. Revise antes las reglas existentes: una regla restringida no anula otra que ya permita 3306 a todo el mundo. El ejemplo añade solo una regla temporal; confirme la conexión desde el cliente autorizado antes de hacerla permanente.

sudo firewall-cmd --get-active-zones
zone=REPLACE_WITH_ACTIVE_ZONE
sudo firewall-cmd --zone="$zone" --list-all
sudo firewall-cmd --zone="$zone" --add-rich-rule='rule family="ipv4" source address="192.0.2.10/32" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --zone="$zone" --list-rich-rules

Tras comprobarla, repita únicamente la orden --add-rich-rule con --permanent para conservar esa regla. Para deshacerla, use --remove-rich-rule con la misma zona y expresión; si la guardó, retírela también con --permanent. Evite guardar todas las reglas temporales mediante --runtime-to-permanent cuando solo quiere conservar este cambio.

Cambie las direcciones de documentación por las direcciones reales del servidor de aplicaciones. Evite la combinación de crear el host del usuario como % y abrir el puerto a todo Internet.

Aplicación de la configuración y prueba de conexión

sudo systemctl restart mariadb
sudo systemctl status mariadb
ss -lntp | grep 3306

Conéctese desde el cliente.

mariadb --host=192.0.2.20 --user=appuser --password appdb

Si no se añade un valor directamente después de --password, se puede ingresar de forma interactiva. Escribir la contraseña en la línea de comandos puede exponerla en el historial del shell y en la lista de procesos.

Si atraviesa una red no confiable, configure un certificado TLS y haga que el cliente verifique el certificado del servidor.

Elementos a verificar antes de actualizaciones y copias de seguridad

  • Realice copias de seguridad periódicas de los datos y archivos de configuración y pruebe la recuperación en otro sistema.
  • Antes de cambiar a una versión principal, verifique las notas de la versión, las funciones eliminadas y la compatibilidad con conjuntos de caracteres y reglas de ordenamiento.
  • Después de actualizar los paquetes, consulte la documentación de la versión instalada para determinar si es necesario ejecutar mariadb-upgrade.
  • Supervise el uso del disco, el número de conexiones, las consultas lentas, el estado de replicación y los registros de errores.
  • Las credenciales de la aplicación deben protegerse mediante permisos en los archivos de configuración o mediante un sistema de gestión de secretos.

Preguntas frecuentes

sudo mariadb funciona pero mariadb -u root -p falla.

Esto puede deberse a que la cuenta root usa autenticación de socket Unix. Verifique el plugin de autenticación actual y, a menos que haya una razón particular, mantenga el método de acceso del administrador local.

No se puede acceder externamente

bind-address, verifique secuencialmente el valor Host de la cuenta de usuario remota, el estado de recepción del puerto 3306, firewalld y el grupo de seguridad de la nube.

¿Está bien abrir el puerto 3306 a toda Internet?

No se recomienda. Limítelo a la dirección fija del servidor de aplicaciones o a la red privada, y use VPN, TLS y cuentas con privilegios mínimos simultáneamente.

¿Se puede usar mysql_secure_installation?

Puede ser proporcionado con un nombre compatible, pero el nombre actual en la documentación de MariaDB es mariadb-secure-installation. Verifique el archivo ejecutable instalado y la documentación de la versión.