phpMyAdmin es una cómoda interfaz web para MariaDB y MySQL, y también una de las URL más escaneadas de Internet. Esta guía muestra dos instalaciones en tu VPS Linux Infrawire, el paquete apt con Apache y una instalación manual detrás de Nginx, y después las medidas que lo mantienen fuera del alcance de los bots.
📋 Requisitos previos
- Un VPS con Ubuntu 24.04 o Debian 12, con acceso root o
sudo(la IP y la contraseña root están en tu área de cliente) - Una pila LAMP (opción A) o LEMP (opción B) funcional con MariaDB
- Tu propia IP pública, llamada
ADMIN_IPmás abajo
1. Opción A: instalar el paquete apt con Apache
Bashapt update apt install -y phpmyadmin php-mbstring php-zip php-gd php-curl
En el instalador, selecciona apache2 con la barra espaciadora (debe aparecer un asterisco), responde "Sí" para configurar la base de datos con dbconfig-common y define una contraseña para la cuenta interna de phpMyAdmin. Después recarga Apache:
Bashphpenmod mbstring systemctl reload apache2
phpMyAdmin ya se sirve en http://VPS_IP/phpmyadmin.
2. Crear un usuario de base de datos dedicado
Nunca inicies sesión como root. En MariaDB bajo Ubuntu y Debian, root usa autenticación unix_socket y phpMyAdmin lo rechazará de todos modos: déjalo así y crea una cuenta normal.
Bashmariadb
SQLCREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT ALL PRIVILEGES ON appdb.* TO 'pmauser'@'localhost'; FLUSH PRIVILEGES; EXIT;
Concede permisos solo sobre las bases de datos que el usuario realmente gestiona. No actives AllowNoPassword en la configuración.
3. Ocultar la URL y añadir autenticación (Apache)
Cambia el alias por defecto por uno aleatorio y crea un archivo de contraseñas:
BashSUFFIX=$(openssl rand -hex 6); echo "pma-$SUFFIX" sed -i "s#Alias /phpmyadmin#Alias /pma-$SUFFIX#" /etc/phpmyadmin/apache.conf htpasswd -c /etc/phpmyadmin/.htpasswd USER
Añade después estas líneas dentro del bloque <Directory /usr/share/phpmyadmin> existente en /etc/phpmyadmin/apache.conf:
Apache1AuthType Basic 2AuthName 'Restricted area' 3AuthUserFile /etc/phpmyadmin/.htpasswd 4<RequireAll> 5 Require valid-user 6 Require ip ADMIN_IP 7</RequireAll>
Sin <RequireAll>, Apache aceptaría cualquiera de las dos condiciones; con él se exigen tanto la contraseña como la IP.
Bashapache2ctl configtest && systemctl reload apache2
4. Opción B: instalación manual detrás de Nginx
Instala las dependencias y descarga la última versión desde el sitio oficial de phpMyAdmin (sustituye VERSION por el número actual):
Bashapt install -y nginx php-fpm php-mysql php-mbstring php-xml php-zip php-gd php-curl apache2-utils cd /tmp wget https://files.phpmyadmin.net/phpMyAdmin/VERSION/phpMyAdmin-VERSION-all-languages.tar.gz tar xzf phpMyAdmin-VERSION-all-languages.tar.gz mkdir -p /var/www/pma mv phpMyAdmin-VERSION-all-languages /var/www/pma/pma-SECRET cd /var/www/pma/pma-SECRET cp config.sample.inc.php config.inc.php openssl rand -hex 16
Sustituye pma-SECRET por un nombre aleatorio. Edita config.inc.php y pega el valor generado (32 caracteres) como secreto:
PHP$cfg['blowfish_secret'] = 'RANDOM_32_CHARS'; $cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
Bashmkdir -p /var/lib/phpmyadmin/tmp chown www-data:www-data /var/lib/phpmyadmin/tmp chmod 700 /var/lib/phpmyadmin/tmp chown -R root:www-data /var/www/pma chmod 640 /var/www/pma/pma-SECRET/config.inc.php htpasswd -c /etc/nginx/.htpasswd USER
Añade este bloque dentro del server { ... } de tu sitio. En Debian 12 el socket es php8.2-fpm.sock en lugar de php8.3-fpm.sock:
Nginx1location ^~ /pma-SECRET/ { 2 allow ADMIN_IP; 3 deny all; 4 auth_basic 'Restricted area'; 5 auth_basic_user_file /etc/nginx/.htpasswd; 6 root /var/www/pma; 7 index index.php; 8 9 location ~ \.php$ { 10 include snippets/fastcgi-php.conf; 11 fastcgi_pass unix:/run/php/php8.3-fpm.sock; 12 } 13}
Bashnginx -t && systemctl reload nginx
5. La opción más segura: un túnel SSH
Si no quieres ninguna exposición pública, deja la interfaz accesible solo desde el VPS y abre un túnel desde tu ordenador:
Bashssh -L 8080:127.0.0.1:80 USER@VPS_IP
Mientras la sesión esté abierta, entra en http://127.0.0.1:8080/pma-SECRET/. En Apache, restringe el bloque con Require local en lugar de Require ip ADMIN_IP; en Nginx, usa allow 127.0.0.1;. Esto también resuelve el problema de una IP doméstica cambiante.
6. Verificar la protección
Bashcurl -sI http://VPS_IP/phpmyadmin | head -n 1 curl -sI http://VPS_IP/pma-SECRET/ | head -n 1
La primera petición debe devolver 404. La segunda devuelve 403 desde cualquier IP distinta de ADMIN_IP, y 401 desde la tuya hasta que indiques la contraseña de la autenticación básica. Sirve además phpMyAdmin solo por HTTPS; de lo contrario, las contraseñas viajan en claro.
🛠️ Solución de problemas
404 Not Found. El alias o el nombre de la location no coincide con la URL escrita, o no se recargó el servidor web.
403 Forbidden para ti. Tu IP pública ha cambiado. Actualiza ADMIN_IP o cambia al túnel SSH.
"The mbstring extension is missing" o página en blanco. Instala php-mbstring y ejecuta phpenmod mbstring (Apache) o reinicia php8.3-fpm (Nginx).
Access denied para root. Es lo esperado y deseable. Inicia sesión con el usuario dedicado creado en el paso 2.
🎉 phpMyAdmin está instalado, oculto y restringido: solo tú accedes a tus bases de datos.