Gestión, seguridad y control de acceso para phpMyAdmin con Core-Admin


#1

Introducción

Core-Admin despliega y mantiene la instalación de phpMyAdmin del servidor a través de una única herramienta: crad-mysql-phpmyadmin-installer.pyc. No se trata solo de un instalador: es el punto central desde el que se gestiona todo el ciclo de vida del panel, evitando tener que editar a mano ni el config.inc.php de phpMyAdmin ni el site de Apache.

Con esta herramienta se controla:

Área Para qué sirve Opciones
Instalación y refresco Desplegar phpMyAdmin y regenerar su configuración de forma reentrante (sin opciones), --force, --refresh-php-my-admin-configuration
Acceso root Denegar el login root o limitarlo a IPs concretas --show-root-policy, --set-root-mode, --add-root-ip, --remove-root-ip, --list-root-ips
Servidores MySQL Qué servidores aparecen en el selector de login, incluidos servidores remotos --list-extra-servers, --add-extra-server, --remove-extra-server, --check-extra-servers
Motor PHP Con qué versión de PHP se ejecuta el panel --show-php-engine, --set-php-engine
FQDN y certificado SSL Nombre público del panel y certificado Let’s Encrypt asociado --show-fqdn-policy, --set-fqdn, --clear-fqdn
Almacenamiento de configuración Usuario de control y base phpmyadmin (marcadores, historial, diseñador…) --show-controluser-policy, --rotate-controluser-pass

Todas las opciones comparten el mismo patrón de funcionamiento: la configuración se persiste en un fichero JSON bajo /etc/core-admin/mysql/, y cada cambio aplica automáticamente la configuración regenerando lo que haga falta (config.inc.php, site de Apache, pools php-fpm). Ese refresco es reentrante: puede repetirse las veces que sea necesario, incluso desde tareas programadas, sin efectos secundarios. Con --no-apply se persiste el cambio sin aplicarlo, lo que permite agrupar varias modificaciones y aplicarlas al final en una sola pasada.

Las políticas se aplican de forma uniforme a todos los servidores MySQL que phpMyAdmin tenga configurados (servidor por defecto, servidores locales adicionales gestionados por Core-Admin y servidores remotos añadidos manualmente).

Requisitos previos

  • Core-Admin instalado con el módulo MySQL Manager
  • Paquete core-admin-tools, que incluye /usr/sbin/crad-mysql-phpmyadmin-installer.pyc
  • Acceso con privilegios de root al servidor
  • Para las opciones de gestión, phpMyAdmin instalado previamente con esta misma herramienta

Instalación y refresco

Instalación

crad-mysql-phpmyadmin-installer.pyc

La herramienta descarga la versión de phpMyAdmin correspondiente a la distribución desde el repositorio de descargas de Core-Admin, la despliega en /usr/share/phpmyadmin, genera el config.inc.php con todos los servidores MySQL locales, aplica la política de acceso root vigente y ajusta el site de Apache (ServerName y certificado).

La versión que se instala depende de la distribución, porque cada rama de phpMyAdmin exige un mínimo de PHP:

Distribuciones phpMyAdmin
buster, bullseye, bookworm, bionic, focal, jammy, noble, stretch, xenial 5.2.3 (rama estable)
squeeze, wheezy, jessie, precise, centos6, lenny 4.9.11 (rama LTS)

Si ya hay una instalación previa, la herramienta no la sobrescribe: hay que forzarlo explícitamente.

crad-mysql-phpmyadmin-installer.pyc --force

Antes de desplegar la nueva copia, la instalación anterior se mueve a /usr/share/phpmyadmin-old-<fecha>, de forma que siempre queda una copia de seguridad recuperable.

Refresco

crad-mysql-phpmyadmin-installer.pyc --refresh-php-my-admin-configuration

Regenera la configuración a partir del estado actual: servidores MySQL detectados, política de acceso root, servidores remotos configurados, motor PHP seleccionado, FQDN y certificado. Es la operación que se ejecuta implícitamente tras cada cambio de política (salvo con --no-apply) y es segura de ejecutar periódicamente:

  • Compara el resultado con el config.inc.php existente y no toca el fichero si no hay diferencias
  • Preserva el $cfg['blowfish_secret'], para no invalidar las cookies de las sesiones activas
  • Reaplica el motor PHP seleccionado, que un cambio de modo de trabajo de #WebhostingManagement habría revertido

Control de acceso root

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.

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.

Consultar la política activa

crad-mysql-phpmyadmin-installer.pyc --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.pyc --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.pyc --set-root-mode allow_from_ips
crad-mysql-phpmyadmin-installer.pyc --set-root-mode disabled
crad-mysql-phpmyadmin-installer.pyc --set-root-mode unrestricted

La herramienta avisa en dos situaciones sensibles:

  • Al seleccionar unrestricted: muestra un WARNING recordando que se desactiva todo control de IP
  • Al seleccionar allow_from_ips sin tener ninguna IP configurada: muestra un WARNING indicando 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.pyc --add-root-ip 1.2.3.4
crad-mysql-phpmyadmin-installer.pyc --add-root-ip 10.0.0.0/24
crad-mysql-phpmyadmin-installer.pyc --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.pyc --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.pyc --set-root-mode allow_from_ips --no-apply
crad-mysql-phpmyadmin-installer.pyc --add-root-ip 1.2.3.4           --no-apply
crad-mysql-phpmyadmin-installer.pyc --add-root-ip 10.0.0.0/24       --no-apply
crad-mysql-phpmyadmin-installer.pyc --refresh-php-my-admin-configuration

La última llamada aplica los cambios acumulados. El patrón --no-apply funciona igual con el resto de políticas descritas en este artículo.

Servidores MySQL en el selector de login

phpMyAdmin muestra en su pantalla de login un selector con los servidores MySQL disponibles. Core-Admin lo construye en dos capas:

  • Servidores locales: se detectan automáticamente en cada refresco a partir de los servidores MySQL/MariaDB que Core-Admin gestiona en la máquina (instancias adicionales en puertos distintos incluidas). No hay que configurar nada.
  • Servidores adicionales (normalmente remotos): se añaden a mano y sirven para exponer un MySQL que vive en otra máquina. El caso típico es un segundo nodo del mismo cliente que no tiene (ni queremos que tenga) su propio phpMyAdmin.

Listar y comprobar

crad-mysql-phpmyadmin-installer.pyc --list-extra-servers
crad-mysql-phpmyadmin-installer.pyc --check-extra-servers

--check-extra-servers vuelve a sondear cada servidor configurado sin modificar nada, útil tras cambios de firewall o de permisos:

phpMyAdmin additional servers reachability check
-----------------------------------------------
  [OK  ] node02 (10.0.0.2:3306): MySQL handshake received from 10.0.0.2:3306 (protocol v10)
  [FAIL] node03 (10.0.0.3:3306): TCP connection to 10.0.0.3:3306 failed: [Errno 111] Connection refused
WARN: 1 of 2 additional server(s) are NOT reachable from this host

Devuelve código de salida 1 si algún servidor falla, con lo que se puede encadenar en comprobaciones automatizadas.

Añadir un servidor remoto

crad-mysql-phpmyadmin-installer.pyc --add-extra-server node02 --extra-host 10.0.0.2 --extra-port 3306
crad-mysql-phpmyadmin-installer.pyc --add-extra-server node02 --extra-host 10.0.0.2 --extra-ssl

Antes de guardar nada, la herramienta comprueba de verdad que el camino funciona: abre una conexión TCP desde esta máquina (la que ejecuta phpMyAdmin, es decir, exactamente la ruta de red que usará el panel) y lee el saludo inicial del protocolo MySQL. No hacen falta credenciales: se valida que el puerto es accesible y que hay un MySQL dispuesto a aceptar conexiones desde este host.

Esto detecta los dos fallos que dejan una entrada rota sin avisar:

  • Puerto cerrado, filtrado o host equivocado
  • MySQL activo pero que rechaza a este host (ER_HOST_NOT_ALLOWED, ER_HOST_IS_BLOCKED), con lo que el login nunca podría funcionar

Si la comprobación falla, el servidor no se añade. Con --force-extra-server se puede forzar, por ejemplo al aprovisionar antes de tocar el firewall o los permisos del MySQL remoto.

Eliminar un servidor remoto

crad-mysql-phpmyadmin-installer.pyc --remove-extra-server node02

Nota: a los servidores remotos se les aplica la misma política de acceso root, pero no se les configura el almacenamiento de configuración (marcadores, historial, diseñador…), porque Core-Admin no dispone de credenciales administrativas para crear el esquema en una máquina ajena. El login y la gestión normal de bases de datos funcionan con total normalidad.

Motor PHP con el que se ejecuta phpMyAdmin

El problema

Por defecto, phpMyAdmin se ejecuta con el PHP que trae la distribución. En equipos con recorrido, eso deja el panel muy por detrás de lo que la propia versión de phpMyAdmin admite:

Distribución PHP del sistema PHP máximo usable por phpMyAdmin 5.2.3
Debian 10 (buster) 7.3 8.4
Ubuntu 20.04 (focal) 7.4 8.4
Debian 11 (bullseye) 7.4 8.4
Ubuntu 22.04 (jammy) 8.1 8.4
Debian 12 (bookworm) 8.2 8.4
Ubuntu 24.04 (noble) 8.3 8.4

Core-Admin ya construye sus propios motores PHP (/usr/core-admin/php/<versión>, paquetes core-admin-php-<versión>) que se usan para los hostings de cliente. Las opciones --show-php-engine / --set-php-engine permiten aprovechar esos motores también para phpMyAdmin, con dos ventajas: un intérprete con soporte y parches de seguridad al día, y mejor rendimiento en el panel (importante en operaciones pesadas: importaciones, exportaciones, búsquedas sobre tablas grandes).

Importante: el cambio afecta exclusivamente al sitio de phpMyAdmin (001-mysql). Los hostings de cliente conservan su versión de PHP configurada; nada de lo que se describe en esta sección los toca.

Versiones de PHP admitidas por cada phpMyAdmin

La herramienta no permite seleccionar una versión de PHP con la que phpMyAdmin no vaya a funcionar. El máximo se calcula como la intersección de:

  1. Lo que la distribución admite (misma lógica que usa Core-Admin para los motores PHP de hostings).
  2. Lo que admite la versión de phpMyAdmin instalada:
phpMyAdmin Ventana de PHP
5.2.3 (estable actual) 7.2 – 8.4
5.2.0 – 5.2.2 7.2 – 8.3 (anteriores a las correcciones de deprecaciones de PHP 8.4)
5.1.x 7.1 – 8.0
5.0.x 7.1 – 7.4
4.9.x (LTS, distribuciones antiguas) 5.5 – 7.4 (no funciona sobre PHP 8)

Consultar el motor actual

crad-mysql-phpmyadmin-installer.pyc --show-php-engine

Ejemplo de salida en un Debian 11 sin política configurada:

phpMyAdmin PHP engine policy
---------------------------
  file:              /etc/core-admin/mysql/phpmyadmin-php-policy.json (not present, using system php)
  mode:              default (not configured)
  phpmyadmin:        5.2.3 (supports php 7.2 .. 8.4)
  system_php:        7.4
  running_with:      system php 7.4 (from /etc/apache2/sites-enabled/001-mysql.conf)
  max_available:     8.4
  usable_versions:   7.2 (not installed), 7.3 (not installed), 7.4 (not installed), 8.0 (not installed), 8.1 (not installed), 8.2 (not installed), 8.3 (not installed), 8.4 (not installed)
  working_mode:      apache2-mpm-worker-php-fpm

Las versiones marcadas como (not installed) son utilizables pero el motor todavía no está desplegado: se instala automáticamente al seleccionarlo.

Seleccionar el motor

# máximo soportado por el sistema y por la versión de phpMyAdmin instalada
crad-mysql-phpmyadmin-installer.pyc --set-php-engine max

# fijar una versión concreta
crad-mysql-phpmyadmin-installer.pyc --set-php-engine 8.2

# volver al PHP de la distribución
crad-mysql-phpmyadmin-installer.pyc --set-php-engine default

Al seleccionar un motor, la herramienta realiza los siguientes pasos:

  1. Instala el paquete core-admin-php-<versión> si el motor no está ya desplegado.
  2. Comprueba que el motor tiene las extensiones que phpMyAdmin necesita (mysqli, mbstring, json, session). Si falta alguna, se niega a hacer el cambio en lugar de dejar el panel inservible.
  3. Crea el pool php-fpm dedicado del sitio 001-mysql con esa versión y arranca el motor.
  4. Reescribe la directiva SetHandler del site Apache de phpMyAdmin para que apunte al nuevo socket, y recarga Apache.
  5. Recarga el php-fpm del sistema para que deje de servir el pool anterior.

El modo max no congela el número: se reevalúa en cada refresco, de modo que cuando se actualiza phpMyAdmin o aparece un motor PHP más reciente, el panel sube solo en el siguiente --refresh-php-my-admin-configuration.

Requisitos

  • Modo de trabajo de #WebhostingManagement apache2-mpm-worker-php-fpm. En modo apache2-mpm-itk, phpMyAdmin corre con el mod_php del sistema y no es posible seleccionar el motor: la herramienta lo indica con un aviso y no toca nada.
  • En distribuciones antiguas (squeeze, wheezy, jessie, precise, centos6, lenny), donde phpMyAdmin se ejecuta mediante el envoltorio php-fastcgi-wrapper, la selección también funciona: se reescribe el envoltorio apuntando al motor elegido y se reinicia Apache. En esas distribuciones se instala phpMyAdmin 4.9.11 (rama LTS), por lo que el máximo es PHP 7.4.

Persistencia y reaplicación

La selección se guarda en /etc/core-admin/mysql/phpmyadmin-php-policy.json:

{
    "mode": "max",
    "version": null
}

Con mode a default (PHP del sistema), max (recalculado en cada aplicación) o fixed (con la versión fijada en version).

La política se reaplica en cada refresco. Esto no es cosmético: al cambiar el modo de trabajo de #WebhostingManagement, el vhost 001-mysql se regenera con el pool php-fpm por defecto y se perdería el motor seleccionado. El refresco lo vuelve a dejar en su sitio.

Si no existe el fichero de política, la herramienta no toca nada del motor PHP: el comportamiento es idéntico al de instalaciones anteriores a esta funcionalidad.

FQDN del panel y certificado SSL

El vhost de phpMyAdmin se publica con el nombre del servidor y un certificado Let’s Encrypt emitido para ese nombre. En muchos despliegues interesa publicarlo con un nombre distinto (un nombre comercial, un panel compartido, un nombre que no revele la máquina).

crad-mysql-phpmyadmin-installer.pyc --show-fqdn-policy
crad-mysql-phpmyadmin-installer.pyc --set-fqdn panel03.example.com
crad-mysql-phpmyadmin-installer.pyc --clear-fqdn

Al fijar un FQDN alternativo, la herramienta reescribe el ServerName del site de phpMyAdmin y solicita un certificado Let’s Encrypt para ese nombre, dejando apuntadas las directivas SSLCertificateFile / SSLCertificateKeyFile al certificado obtenido. --clear-fqdn revierte al nombre del servidor.

Requisito: el DNS del nombre elegido debe resolver ya a este servidor antes de ejecutar --set-fqdn, porque la emisión del certificado se valida por HTTP contra ese nombre.

El estado se consulta con --show-fqdn-policy, que además informa de si ya existe certificado emitido para el nombre efectivo:

phpMyAdmin alternative FQDN policy
----------------------------------
  file:                /etc/core-admin/mysql/phpmyadmin-fqdn-policy.json
  alternative_fqdn:    panel03.example.com
  server_hostname:     srv12.example.net
  effective_fqdn:      panel03.example.com
  certificate_status:  found (cert=/etc/letsencrypt-lego/7/certificates/panel03.example.com.crt)

Si no hay certificado todavía, se indica que se solicitará en el próximo refresco.

Almacenamiento de configuración de phpMyAdmin

phpMyAdmin guarda marcadores, búsquedas guardadas, historial de consultas, vista de relaciones, diseñador, seguimiento de cambios y preferencias de usuario en una base de datos propia (phpmyadmin, tablas pma__*) a la que accede con un usuario de control (pma). Core-Admin lo aprovisiona automáticamente en cada servidor MySQL local: crea la base, el usuario, los permisos y el esquema, y reutiliza las mismas credenciales en cada refresco para no invalidar nada.

Normalmente no hay que tocar nada, pero se puede consultar el estado:

crad-mysql-phpmyadmin-installer.pyc --show-controluser-policy
phpMyAdmin control-user policy
------------------------------
  file:         /etc/core-admin/mysql/phpmyadmin-controluser.json
  dbname:       phpmyadmin
  control_user: pma
  control_pass: (hidden, 24 chars)
  servers:
    - Default: db=present user=present
    - mysql57: db=present user=MISSING

La salida indica, servidor a servidor, si la base y el usuario de control están correctamente aprovisionados, lo que permite detectar de un vistazo por qué en un servidor concreto no funcionan los marcadores o el historial.

Y se puede rotar la contraseña del usuario de control (por ejemplo, dentro de un procedimiento de rotación de credenciales):

crad-mysql-phpmyadmin-installer.pyc --rotate-controluser-pass

La rotación genera una contraseña nueva, la aplica con ALTER USER en cada servidor MySQL local y regenera la configuración para que el panel la use de inmediato. Si algún servidor falla, se informa de cuáles y el resto se completa igualmente.

La contraseña se guarda en /etc/core-admin/mysql/phpmyadmin-controluser.json con permisos 0600.

Resumen completo de opciones

Instalación y refresco

Opción Descripción
(sin opciones) Instala phpMyAdmin si no está instalado
--force Reinstala/actualiza aunque ya exista (guarda copia de la instalación anterior)
--refresh-php-my-admin-configuration Regenera configuración, site Apache y políticas activas (reentrante)
--no-apply Persiste el cambio de política sin aplicarlo en ese momento

Acceso root

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

Servidores adicionales

Opción Descripción
--list-extra-servers Lista los servidores remotos configurados
--check-extra-servers Re-sondea la accesibilidad de todos ellos (no modifica nada)
--add-extra-server NOMBRE Añade un servidor remoto (requiere --extra-host)
--extra-host IP\|FQDN Host del servidor remoto
--extra-port PUERTO Puerto del servidor remoto (por defecto 3306)
--extra-ssl Conectar por SSL/TLS al servidor remoto
--force-extra-server Añadir aunque falle la comprobación de accesibilidad
--remove-extra-server NOMBRE Elimina un servidor remoto

Motor PHP

Opción Descripción
--show-php-engine Muestra el motor actual, la política, el máximo disponible y las versiones utilizables
--set-php-engine max Selecciona el máximo soportado por el sistema y por la versión de phpMyAdmin
--set-php-engine <versión> Fija una versión concreta (por ejemplo 8.2)
--set-php-engine default Vuelve al PHP de la distribución

FQDN y almacenamiento de configuración

Opción Descripción
--show-fqdn-policy Muestra el FQDN efectivo y el estado del certificado
--set-fqdn FQDN Publica el panel con un nombre alternativo y solicita su certificado
--clear-fqdn Revierte al nombre del servidor
--show-controluser-policy Muestra el usuario de control y su aprovisionamiento por servidor
--rotate-controluser-pass Rota la contraseña del usuario de control en todos los servidores

Escenarios típicos

Actualizar phpMyAdmin al PHP más reciente posible

crad-mysql-phpmyadmin-installer.pyc --show-php-engine     # ver de dónde partimos
crad-mysql-phpmyadmin-installer.pyc --set-php-engine max

En un Debian 11 con phpMyAdmin 5.2.3 esto sube el panel de PHP 7.4 (el del sistema) a PHP 8.4, instalando core-admin-php-8.4 si hiciera falta. Si algo no encaja (extensión ausente, modo de trabajo itk), la herramienta lo indica y deja la configuración anterior intacta.

Permitir root únicamente desde la red de administración

crad-mysql-phpmyadmin-installer.pyc --set-root-mode allow_from_ips --no-apply
crad-mysql-phpmyadmin-installer.pyc --add-root-ip 203.0.113.5 --no-apply
crad-mysql-phpmyadmin-installer.pyc --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.pyc --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.

Volver a la configuración segura por defecto

crad-mysql-phpmyadmin-installer.pyc --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).

Dar acceso al MySQL de un segundo nodo sin desplegar otro panel

crad-mysql-phpmyadmin-installer.pyc --add-extra-server node02 --extra-host 10.0.0.2
crad-mysql-phpmyadmin-installer.pyc --check-extra-servers

Tras el alta, el servidor aparece en el selector de login del panel existente.

Publicar el panel con un nombre propio y certificado válido

crad-mysql-phpmyadmin-installer.pyc --set-fqdn panel03.example.com

Con el DNS ya apuntando a la máquina, el site queda con ese ServerName y un certificado Let’s Encrypt emitido para él.

Detalles técnicos

Ficheros implicados

Elemento Ruta
Política de acceso root (JSON) /etc/core-admin/mysql/phpmyadmin-root-policy.json
Política de motor PHP (JSON) /etc/core-admin/mysql/phpmyadmin-php-policy.json
FQDN alternativo (JSON) /etc/core-admin/mysql/phpmyadmin-fqdn-policy.json
Servidores adicionales (JSON) /etc/core-admin/mysql/phpmyadmin-extra-servers.json
Usuario de control (JSON, 0600) /etc/core-admin/mysql/phpmyadmin-controluser.json
Instalación de phpMyAdmin /usr/share/phpmyadmin/
Configuración de phpMyAdmin /usr/share/phpmyadmin/config.inc.php
Site Apache generado /etc/apache2/sites-enabled/001-mysql.conf
Motores PHP de Core-Admin /usr/core-admin/php/<versión>/
Pool php-fpm del panel (motor Core-Admin) /etc/core-admin/php/<versión>/php-fpm.d/001-mysql.conf

Los ficheros de política tienen estructuras sencillas. Por ejemplo, el de acceso root:

{
    "mode": "allow_from_ips",
    "allowed_ips": ["1.2.3.4", "10.0.0.0/24"]
}

Y el de servidores adicionales:

{
    "servers": [
        { "name": "node02", "host": "10.0.0.2", "port": "3306", "ssl": false }
    ]
}

Todos se escriben 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 si no existe.

Directivas phpMyAdmin generadas

La política de acceso root se materializa en las directivas de phpMyAdmin siguiendo este esquema, aplicado a cada servidor MySQL configurado:

  • disabled$cfg['Servers'][$i]['AllowRoot'] = FALSE;
  • allow_from_ipsAllowRoot = TRUE + reglas AllowDeny (deny root from all seguido de allow root from <ip> por cada IP)
  • unrestricted$cfg['Servers'][$i]['AllowRoot'] = TRUE;

A cada servidor local se le añade además el bloque de almacenamiento de configuración (controluser, controlpass, pmadb y el mapeo de tablas pma__*).

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 (que también se dispara tras cada cambio salvo con --no-apply) es idempotente:

  • Compara el contenido nuevo con el config.inc.php existente; si no hay diferencias, no toca el fichero
  • Preserva el $cfg['blowfish_secret'] existente entre refrescos, para no invalidar las cookies de sesiones activas
  • Reutiliza las credenciales del usuario de control, de modo que el aprovisionamiento de pma__* no se rompe
  • Limpia el fichero .tmp si 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 las políticas activas. Si necesitas ajustes personalizados, deben integrarse en el propio instalador.

P: ¿Afecta la política de root a otros usuarios de MySQL?
No. 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 configuración en varios servidores?
Las políticas son locales a cada máquina, pero los ficheros de /etc/core-admin/mysql/ son portables. Puedes replicarlos y ejecutar crad-mysql-phpmyadmin-installer.pyc --refresh-php-my-admin-configuration para aplicarlos, o automatizar la secuencia de órdenes 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: Al cambiar el motor PHP de phpMyAdmin, ¿se ven afectados los hostings de cliente?
No. El cambio se limita al pool php-fpm y al vhost del sitio 001-mysql (phpMyAdmin). Cada hosting conserva la versión de PHP que tenga asignada.

P: ¿Cómo vuelvo al PHP de la distribución si algo no va bien?
Con crad-mysql-phpmyadmin-installer.pyc --set-php-engine default. La configuración vuelve al pool php-fpm por defecto y se recarga Apache. También puedes borrar /etc/core-admin/mysql/phpmyadmin-php-policy.json, aunque en ese caso el motor seleccionado se mantiene hasta el siguiente cambio de modo de trabajo o refresco del vhost: sin fichero de política, la herramienta deja de intervenir sobre el motor.

P: ¿Por qué --show-php-engine dice que no se puede seleccionar el motor?
Porque el modo de trabajo de #WebhostingManagement es apache2-mpm-itk. En ese modo PHP se ejecuta como mod_php del propio Apache y todos los sitios comparten el intérprete del sistema. Para seleccionar el motor de phpMyAdmin hay que estar en apache2-mpm-worker-php-fpm.

P: He añadido un servidor remoto y no me aparecen los marcadores ni el historial en él.
Es el comportamiento esperado: en servidores remotos no se aprovisiona el almacenamiento de configuración, porque Core-Admin no tiene credenciales administrativas en esa máquina. El login y la gestión de bases de datos funcionan con normalidad.

P: ¿Puedo revertir a la configuración inicial?
Sí. Para el acceso root, --set-root-mode disabled; para el motor PHP, --set-php-engine default; para el nombre del panel, --clear-fqdn. También puedes borrar el fichero JSON correspondiente en /etc/core-admin/mysql/ y ejecutar un refresco: sin fichero, cada política vuelve a su comportamiento por defecto.

P: ¿Los cambios surten efecto inmediato?
Sí: salvo que se use --no-apply, la herramienta aplica el cambio al terminar. Las nuevas sesiones ven la configuración actualizada; las ya autenticadas mantienen su sesión hasta el siguiente login.