Control de acceso root en phpMyAdmin con Core-Admin
Introducción
Core-Admin despliega una instalación de phpMyAdmin gestionada a través de la herramienta crad-mysql-phpmyadmin-installer, que además de instalar y configurar phpMyAdmin para todos los servidores MySQL/MariaDB locales, incluye un sistema de política de acceso root que permite controlar desde un único punto si el usuario root puede iniciar sesión vía phpMyAdmin y, en caso afirmativo, desde qué direcciones IP.
El acceso a phpMyAdmin como usuario root es una de las principales vías de exposición en paneles de administración de bases de datos. Por ese motivo, Core-Admin aplica una política restrictiva por defecto y ofrece mecanismos sencillos para adaptarla a las necesidades de cada entorno sin necesidad de editar manualmente el fichero config.inc.php de phpMyAdmin.
La política se aplica de forma uniforme a todos los servidores MySQL que phpMyAdmin tenga configurados en el servidor (servidor por defecto y servidores adicionales gestionados por Core-Admin).
Requisitos previos
- Core-Admin instalado con el módulo MySQL Manager
- Paquete
core-admin-php-my-admin-installerinstalado (incluyecrad-mysql-phpmyadmin-installer) - Acceso con privilegios de
rootal servidor - phpMyAdmin instalado previamente mediante
crad-mysql-phpmyadmin-installer
Valores por defecto
Al instalar phpMyAdmin por primera vez (o al actualizar a la versión con soporte de política de acceso root), Core-Admin aplica la siguiente configuración segura por defecto:
| Parámetro | Valor |
|---|---|
| Modo | disabled |
| IPs permitidas | (vacía) |
| Comportamiento | El login con usuario root es denegado en todos los servidores MySQL desde phpMyAdmin |
Esto se traduce, en el config.inc.php generado por Core-Admin, en la directiva:
$cfg['Servers'][$i]['AllowRoot'] = FALSE;
Aplicada a cada servidor MySQL configurado.
Importante: la denegación de root en phpMyAdmin no implica que el usuario root quede desactivado en el propio MySQL/MariaDB. Sigues pudiendo conectarte con root por el socket local (
mysql -u root) o por cualquier otro cliente. Únicamente se restringe el acceso vía interfaz web de phpMyAdmin.
Modos de política disponibles
La política soporta tres modos que cubren los escenarios más habituales:
disabled (por defecto)
Deniega completamente el login como root desde phpMyAdmin para todos los servidores. Es la opción recomendada en entornos de producción: obliga a usar cuentas con privilegios limitados para el uso diario y reserva el acceso root a canales fuera de banda (SSH + cliente CLI).
allow_from_ips
Permite el login como root únicamente desde una lista explícita de direcciones IP o rangos CIDR. En el config.inc.php se genera, además de AllowRoot = TRUE, una regla AllowDeny con orden deny,allow que primero deniega a todo el mundo y luego permite solo a las IPs configuradas:
$cfg['Servers'][$i]['AllowRoot'] = TRUE;
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = array(
'deny root from all',
'allow root from 1.2.3.4',
'allow root from 10.0.0.0/24'
);
Es la opción recomendada cuando exista un conjunto acotado y estable de equipos de administración desde los que se necesite acceso root web.
unrestricted
Desactiva cualquier control de IP y permite el login como root desde cualquier IP que pueda alcanzar phpMyAdmin. No se recomienda salvo en entornos internos de laboratorio, porque expone la cuenta root a cualquier fuente capaz de resolver el panel.
Gestión desde la línea de comandos
Todas las operaciones se realizan a través del mismo binario crad-mysql-phpmyadmin-installer. La política se persiste en:
/etc/core-admin/mysql/phpmyadmin-root-policy.json
Cada cambio, por defecto, refresca automáticamente la configuración de phpMyAdmin regenerando config.inc.php y ajustando el site Apache. Se puede inhibir este refresco con la opción --no-apply si se prefiere agrupar varios cambios y aplicarlos posteriormente en un único refresco.
Consultar la política activa
crad-mysql-phpmyadmin-installer --show-root-policy
Ejemplo de salida con la política por defecto:
phpMyAdmin root access policy
-----------------------------
file: /etc/core-admin/mysql/phpmyadmin-root-policy.json (not present, showing defaults)
mode: disabled
description: root login is DENIED on all phpMyAdmin servers
allowed_ips: (none)
Si el fichero todavía no existe (instalación recién hecha, sin cambios aplicados), la herramienta muestra los valores por defecto con la indicación (not present, showing defaults).
Listar IPs permitidas
crad-mysql-phpmyadmin-installer --list-root-ips
Imprime una IP por línea (o (no allowed IPs configured) si no hay ninguna). Resulta útil para consumir la lista desde scripts.
Cambiar el modo de política
crad-mysql-phpmyadmin-installer --set-root-mode allow_from_ips
crad-mysql-phpmyadmin-installer --set-root-mode disabled
crad-mysql-phpmyadmin-installer --set-root-mode unrestricted
La herramienta avisa en dos situaciones sensibles:
- Al seleccionar
unrestricted: muestra unWARNINGrecordando que se desactiva todo control de IP - Al seleccionar
allow_from_ipssin tener ninguna IP configurada: muestra unWARNINGindicando que, en ese estado, el login root quedará efectivamente denegado hasta añadir IPs con--add-root-ip
Añadir IPs permitidas
crad-mysql-phpmyadmin-installer --add-root-ip 1.2.3.4
crad-mysql-phpmyadmin-installer --add-root-ip 10.0.0.0/24
crad-mysql-phpmyadmin-installer --add-root-ip 2001:db8::/32
Admite IPv4, IPv6 y rangos CIDR. La validación es deliberadamente permisiva: cualquier valor que tenga forma de IP/CIDR se acepta y se delega la decisión final a las reglas AllowDeny de phpMyAdmin.
Si la política actual no es allow_from_ips, la herramienta añade la IP igualmente a la lista y muestra una nota recordando que hay que cambiar el modo para que las IPs surtan efecto:
INFO: IP 1.2.3.4 added to allowed list (1 total)
NOTE: current mode is 'disabled'. Run --set-root-mode allow_from_ips to enforce IP-based filtering.
Eliminar IPs permitidas
crad-mysql-phpmyadmin-installer --remove-root-ip 1.2.3.4
Si la IP no estaba en la lista, la operación es un no-op y se notifica con INFO: IP X is not in the allowed list.
Aplicar cambios por lotes con --no-apply
Para cambiar modo y añadir varias IPs sin regenerar la configuración en cada paso:
crad-mysql-phpmyadmin-installer --set-root-mode allow_from_ips --no-apply
crad-mysql-phpmyadmin-installer --add-root-ip 1.2.3.4 --no-apply
crad-mysql-phpmyadmin-installer --add-root-ip 10.0.0.0/24 --no-apply
crad-mysql-phpmyadmin-installer --refresh-php-my-admin-configuration
La última llamada aplica los cambios acumulados regenerando config.inc.php y ajustando el site Apache. Esta operación es reentrante: puede ejecutarse las veces que haga falta sin efectos secundarios (preserva el blowfish_secret existente para no invalidar cookies activas).
Resumen de opciones
| Opción | Descripción |
|---|---|
--show-root-policy |
Muestra el modo y las IPs permitidas actuales |
--list-root-ips |
Imprime la lista de IPs permitidas, una por línea |
--set-root-mode MODE |
Cambia el modo (disabled, allow_from_ips, unrestricted) |
--add-root-ip IP[/CIDR] |
Añade una IP/CIDR a la lista de permitidas |
--remove-root-ip IP[/CIDR] |
Elimina una IP/CIDR de la lista |
--no-apply |
No regenera config.inc.php tras el cambio (persiste solo) |
--refresh-php-my-admin-configuration |
Regenera config.inc.php y ajusta el site Apache |
Escenarios típicos
Desactivar la protección (permitir root desde cualquier IP)
crad-mysql-phpmyadmin-installer --set-root-mode unrestricted
Usar solo en entornos controlados. No se requiere nada más: el refresco automático regenera config.inc.php y el próximo login por phpMyAdmin aceptará root desde cualquier origen.
Volver a la configuración segura por defecto
crad-mysql-phpmyadmin-installer --set-root-mode disabled
Deniega el login root inmediatamente en todos los servidores configurados en phpMyAdmin, independientemente de la lista de IPs guardada (la lista se conserva, pero deja de aplicarse).
Permitir root únicamente desde la red de administración
crad-mysql-phpmyadmin-installer --set-root-mode allow_from_ips --no-apply
crad-mysql-phpmyadmin-installer --add-root-ip 203.0.113.5 --no-apply
crad-mysql-phpmyadmin-installer --add-root-ip 198.51.100.0/24
El último comando, al no llevar --no-apply, dispara el refresco y deja la política aplicada.
Revocar una IP que ya no debe tener acceso
crad-mysql-phpmyadmin-installer --remove-root-ip 203.0.113.5
El cambio se aplica inmediatamente: a partir de ese momento, los logins root desde esa IP pasan por la regla deny root from all y son rechazados.
Detalles técnicos
Ficheros implicados
| Elemento | Ruta |
|---|---|
| Política persistida (JSON) | /etc/core-admin/mysql/phpmyadmin-root-policy.json |
| Configuración de phpMyAdmin | /usr/share/phpmyadmin/config.inc.php |
| Site Apache generado | /etc/apache2/sites-enabled/001-mysql.conf |
El fichero de política tiene una estructura sencilla:
{
"mode": "allow_from_ips",
"allowed_ips": ["1.2.3.4", "10.0.0.0/24"]
}
Se escribe de forma atómica (escritura a .tmp + rename) para evitar dejar el fichero corrupto si la operación se interrumpe. El directorio padre se crea automáticamente con permisos 0755 si no existe.
Directivas phpMyAdmin generadas
La política se materializa en las directivas de phpMyAdmin siguiendo este esquema, aplicado a cada servidor MySQL configurado:
-
disabled→$cfg['Servers'][$i]['AllowRoot'] = FALSE; -
allow_from_ips→AllowRoot = TRUE+ reglasAllowDeny(deny root from allseguido deallow root from <ip>por cada IP) -
unrestricted→$cfg['Servers'][$i]['AllowRoot'] = TRUE;
Validación de IPs
El validador admite:
- IPv4:
1.2.3.4 - IPv4 + CIDR:
10.0.0.0/24 - IPv6:
2001:db8::1 - IPv6 + CIDR:
2001:db8::/32
Es deliberadamente permisivo (no valida rangos octeto por octeto) porque la decisión final la toma el motor AllowDeny de phpMyAdmin.
Idempotencia y reentrancia
La operación de refresco (--refresh-php-my-admin-configuration, que también se dispara tras cada cambio salvo con --no-apply) es idempotente:
- Compara el contenido nuevo con el
config.inc.phpexistente; si no hay diferencias, no toca el fichero -
Preserva el
$cfg['blowfish_secret']existente entre refrescos, para no invalidar las cookies de sesiones activas - Limpia el fichero
.tmpsi no hubo cambios, de forma que se puede volver a ejecutar con seguridad en tareas programadas
Preguntas frecuentes
P: ¿Qué ocurre con los cambios manuales que haya hecho en config.inc.php?
Se sobrescriben en cada refresco. La configuración de phpMyAdmin se regenera íntegramente a partir de la información de servidores MySQL de Core-Admin y de la política de acceso root. Si necesitas ajustes personalizados, deben integrarse en el propio instalador.
P: ¿Afecta esto a otros usuarios de MySQL distintos de root?
No. La política actúa exclusivamente sobre la directiva AllowRoot/AllowDeny de phpMyAdmin, que filtra el usuario root. Otros usuarios siguen pudiendo autenticarse con las reglas normales de phpMyAdmin.
P: ¿Cómo puedo aplicar una misma política en varios servidores?
La política es local a cada servidor, pero el fichero /etc/core-admin/mysql/phpmyadmin-root-policy.json es portable. Puedes replicarlo a otros hosts y ejecutar crad-mysql-phpmyadmin-installer --refresh-php-my-admin-configuration para aplicarlo, o automatizar el conjunto de órdenes --set-root-mode / --add-root-ip desde un script de despliegue.
P: ¿Qué sucede si pongo allow_from_ips sin añadir ninguna IP?
La configuración generada emite AllowRoot = TRUE junto con la regla deny root from all y ninguna allow. En la práctica se deniega cualquier acceso root, y la herramienta avisa de esta situación al fijar el modo.
P: ¿Puedo revertir a la configuración inicial?
Sí, ejecutando crad-mysql-phpmyadmin-installer --set-root-mode disabled. Si además quieres dejar la lista de IPs vacía, puedes eliminarlas con --remove-root-ip o borrar directamente /etc/core-admin/mysql/phpmyadmin-root-policy.json y ejecutar --refresh-php-my-admin-configuration: sin fichero, la política por defecto es disabled con la lista vacía.
P: ¿El cambio surte efecto inmediato?
Sí: salvo que se use --no-apply, la herramienta regenera config.inc.php al terminar. Las nuevas sesiones verán la política actualizada; las ya autenticadas mantienen su sesión hasta el siguiente login, momento en el que se aplica el nuevo filtro.