Tutorial

Cómo instalar y proteger phpMyAdmin en Ubuntu 20.04

UbuntuApachePHPApplicationsUbuntu 20.04

Brennan Bearnes escribió una versión anterior de este tutorial.

Introducción

Aunque muchos usuarios necesitan la funcionalidad de un sistema de gestión de bases de datos como MySQL, es posible que no se sientan cómodos interactuando con el sistema únicamente desde la consola de MySQL.

phpMyAdmin se creó con el propósito de que los usuarios puedan interactuar con MySQL a través de una interfaz web. En esta guía, abordaremos la forma de instalar y proteger phpMyAdmin de modo que pueda utilizarlo de forma segura para gestionar sus bases de datos en un sistema Ubuntu 20.04.

Requisitos previos

Para completar esta guía, necesitará lo siguiente:

Adicionalmente, existen importantes consideraciones de seguridad al utilizar software como phpMyAdmin, ya que:

  • Se comunica directamente con su instalación de MySQL.
  • Maneja la autenticación utilizando credenciales de MySQL.
  • Se ejecuta y muestra resultados para consultas SQL arbitrarias.

Por estas razones, y porque se trata de una aplicación PHP ampliamente implementada que con frecuencia recibe ataques, nunca debe ejecutar phpMyAdmin en sistemas remotos a través de una conexión HTTP simple.

Si no tiene un dominio existente configurado con un certificado SSL/TLS, puede seguir esta guía para proteger Apache con Let’s Encrypt en Ubuntu 20.04. Deberá registrar un nombre de dominio, crear registros DNS para su servidor y configurar un host virtual en Apache.

Paso 1: Instalación de phpMyAdmin

Puede utilizar APT para instalar phpMyAdmin desde los repositorios predeterminados de Ubuntu.

Como non-root user, actualice el índice de paquetes de su servidor:

  • sudo apt update

Después de esto, puede instalar el paquete phpmyadmin. Junto con este paquete, en la documentación oficial también se le recomienda instalar algunas extensiones PHP en su servidor para habilitar ciertas funcionalidades y mejorar el rendimiento.

Si siguió el tutorial de pila LAMP de los requisitos previos, varios de estos módulos se habrán instalado junto con el paquete php. Sin embargo, se recomienda también instalar estos paquetes:

  • php-mbstring: módulo para administrar cadenas no-ASCII y convertir cadenas a diferentes codificaciones.
  • php-zip: esta extensión admite la carga de archivos .zip a phpMyAdmin.
  • php-gd: habilita la obtención de ayuda de la biblioteca GD Graphics.
  • php-json: proporciona PHP con compatibilidad para serialización JSON.
  • php-curl: permite que PHP interactúe con diferentes tipos de servidores utilizando diferentes protocolos.

Ejecute el siguiente comando para instalar estos paquetes en su sistema. Tenga en cuenta que el proceso de instalación requiere que tome algunas decisiones para configurar phpMyAdmin correctamente. En breve, veremos estas opciones:

  • sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

Estas son las opciones que debe elegir cuando se le solicite para configurar correctamente su instalación:

  • Para la selección del servidor, elija apache2 Advertencia: Cuando la línea de comandos aparece, “apache2” está resaltado, pero no está seleccionado. Si no pulsa SPACE para seleccionar Apache, el instalador no moverá los archivos necesarios durante la instalación. Pulse ESPACIO, TAB y luego ENTER para seleccionar Apache.
  • Cuando se le pregunte si utiliza dbconfig-common para configurar la base de datos, seleccione Yes.
  • Luego, se le solicitará elegir y confirmar una contraseña para la aplicación de MySQL para phpMyAdmin.

Nota: Suponiendo que instaló MySQL conforme al paso 2 del tutorial de la pila LAMP de los requisitos previos, es posible que haya decidido habilitar el complemento Validate Password. En el momento en que se redactó este documento, habilitar este componente generará un error cuando intente establecer una contraseña para el usuario phpmyadmin:

Error de validación de contraseña phpMyAdmin

Para resolver esto, seleccione la opción abort a fin de detener el proceso de instalación. Luego, abra su línea de comandos de MySQL:

  • sudo mysql

O bien, si habilitó la autenticación de contraseña para el root user de MySQL, ejecute este comando y luego ingrese su contraseña cuando se le solicite:

  • mysql -u root -p

Desde la línea de comandos, ejecute el siguiente comando para deshabilitar el componente Validate Password. Tenga en cuenta que con esto en realidad no se desinstalará, sino solo se evitará que el componente sea cargado en su servidor MySQL:

  • UNINSTALL COMPONENT "file://component_validate_password";

Después de esto, puede cerrar el cliente MySQL:

  • exit

Luego, vuelva a instalar el paquete phpmyadmin, que funcionará según lo previsto:

  • sudo apt install phpmyadmin

Una vez que phpMyAdmin esté instalado, puede abrir la línea de comandos de MySQL una vez más con sudo mysql o mysql -u root -p y luego ejecutar el siguiente comando para volver a habilitar el componente “Validate Password”:

  • INSTALL COMPONENT "file://component_validate_password";

El proceso de instalación añade el archivo de configuración de phpMyAdmin de Apache al directorio /etc/apache2/conhable/, donde se lee de forma automática. Para terminar de configurar Apache y PHP a fin de que funcionen con phpMyAdmin, la única tarea que queda a continuación en esta sección del tutorial es habilitar explícitamente la extensión PHP mbstring. Esto se puede hacer escribiendo lo siguiente:

  • sudo phpenmod mbstring

A continuación, reinicie Apache para que sus cambios surtan efecto:

  • sudo systemctl restart apache2

phpMyAdmin ahora está instalado y configurado para funcionar con Apache. Sin embargo, pra poder iniciar sesión y comenzar a interactuar con sus bases de datos de MySQL, deberá asegurarse de que sus usuarios de MySQL tengan los privilegios necesarios para interactuar con el programa.

Paso 2: Ajuste de la autenticación y los privilegios de usuario

Cuando instaló phpMyAdmin en su servidor, automáticamente creó un usuario de base de datos llamado phpmyadmin que realiza ciertos procesos subyacentes para el programa. En vez de registrarse como este usuario con la contraseña administrativa que estableció durante la instalación, se le recomienda iniciar sesión como root user de MySQL o como usuario dedicado a administrar las bases de datos a través de la interfaz de phpMyAdmin.

Configuración del acceso con contraseña para la cuenta root de MySQL

En los sistemas Ubuntu con MySQL 5.7 (y versiones posteriores), el usuario root de MySQL se configura para la autenticación usando el complemento auth_socket de manera predeterminada en lugar de una contraseña. En muchos casos, esto proporciona mayor seguridad y utilidad, pero también puede generar complicaciones cuando sea necesario permitir que un programa externo (como phpMyAdmin) acceda al usuario.

Si aún no lo ha hecho, deberá cambiar el método de autenticación de auth_socket a uno que haga uso de una contraseña, para poder acceder a phpMyAdmin como su root user de MySQL. Para hacer esto, abra la consola de MySQL desde su terminal:

  • sudo mysql

A continuación, compruebe con el siguiente comando el método de autenticación utilizado por una de sus cuentas de usuario de MySQL:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost | | phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 5 rows in set (0.00 sec)

En este ejemplo, puede ver que, en efecto, el usuario root se autentica utilizando el complemento de auth_socket. Para configurar la cuenta de root de modo que la autenticación se realice con una contraseña, ejecute el siguiente comando ALTER USER. Asegúrese de cambiar password por una contraseña segura que elija:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

Nota: La instrucción ALTER USER previa establece el root user de MySQL para la autenticación con el complemento caching_sha2_password. Según la documentación oficial de MySQL, caching_sha2_password es el complemento de autenticación preferido por MySQL, ya que proporciona un cifrado de contraseña más seguro que el anterior, aunque aún usado ampliamente, mysql_native_password.

Sin embargo, algunas versiones de PHP no funcionan de forma confiable con caching_sha2_password. PHP notificó que este problema se corregió a partir de PHP 7.4, pero si encuentra un error cuando intente iniciar sesión en phpMyAdmin más adelante, es conveniente que en vez de esto establezca root para autenticar con mysql_native_password.

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Luego, compruebe nuevamente los métodos de autenticación empleados por cada uno de sus usuarios para confirmar que root ya no se autentique usando el complemento auth_socket:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | caching_sha2_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost | | debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost | | phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 5 rows in set (0.00 sec)

En este resultado, podrá ver que el root user se auntenticará usando una contraseña. Ahora podrá iniciar sesión en la interfaz phpMyAdmin como usuario root con la contraseña que estableció aquí.

Configuración del acceso con contraseña para un usuario dedicado de MySQL

Por otra parte, para el flujo de trabajo de algunos puede resultar más conveniente la conexión a phpMyAdmin con un usuario dedicado. Para hacer esto, abra una vez más el shell de MySQL:

  • sudo mysql

Si tiene habilitada la autenticación de contraseña para su root user, como se describe en la sección anterior, deberá ejecutar el siguiente comando e ingresar su contraseña cuando se le solicite para establecer conexión:

  • mysql -u root -p

A partir de ahí, cree un usuario nuevo y asigne una contraseña segura:

  • CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

Nota: De nuevo, dependiendo de la versión de PHP que instaló, es conveniente establecer su nuevo usuario para la autenticación con mysql_native_password en lugar de caching_sha2_password:

  • ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Luego, conceda a su nuevo usuario los privilegios apropiados. Por ejemplo, con el siguiente comando podría conceder privilegios de usuario a todas las tablas dentro de la base de datos, así como la facultad de añadir, cambiar y eliminar privilegios de usuario:

  • GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

A continuación, cierre el shell de MySQL:

  • exit

Ahora puede acceder a la interfaz web visitando el nombre de dominio o la dirección IP pública de su servidor, con “/phpmyadmin” agregado:

https://your_domain_or_IP/phpmyadmin

Pantalla de inicio de sesión de phpMyAdmin

Inicie sesión en la interfaz como root o con el nombre de usuario y la contraseña que configuró.

Cuando inicie sesión, verá la interfaz de usuario. Tendrá el siguiente aspecto:

Interfaz de usuario de phpMyAdmin

Ahora que puede establecer conexión e interactuar con phpMyAdmin, solo falta fortalecer la seguridad de sus sistemas para protegerlos de atacantes.

Paso 3: Protección de la instancia de phpMyAdmin

Debido a su presencia universal, phpMyAdmin es un objetivo popular para atacantes. Debe tomar medidas adicionales para evitar el acceso no autorizado. Una opción para hacer esto es disponer una puerta de enlace delante de toda la aplicación utilizando las funciones de autenticación y autorización de .htaccess integradas de Apache.

Para hacerlo, primero debe habilitar el uso de anulaciones del archivo .htaccess editando su archivo de configuración de Apache.

Utilice su editor de texto preferido para editar el archivo phpmyadmin.conf que se dispuso en su directorio de configuración de Apache. En este caso, utilizaremos nano:

  • sudo nano /etc/apache2/conf-available/phpmyadmin.conf

Agregue una directiva AllowOverride All dentro de la sección <Directory /usr/share/phpmyadmin>​​​ del archivo de configuración, como se muestra:

/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All
    . . .

Una vez que agregue esta línea, guarde y cierre el archivo. Si utilizó nano para editar el archivo, hágalo presionando CTRL + X, Y y luego ENTER.

Para implementar los cambios que realizó, reinicie Apache:

  • sudo systemctl restart apache2

Ahora que habilitó el uso de .htaccess para su aplicación, deberá crear uno para implementar seguridad.

Para que pueda hacerlo de forma correcta, el archivo debe crearse dentro del directorio de la aplicación. Puede crear el archivo necesario y abrirlo en su editor de texto con privilegios root escribiendo lo siguiente:

  • sudo nano /usr/share/phpmyadmin/.htaccess

Dentro de este archivo, ingrese la siguiente información:

/usr/share/phpmyadmin/.htaccess
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

A continuación, se muestra lo que significa cada una de estas líneas:

  • AuthType Basic: en esta línea se especifica el tipo de autenticación que implementará. Con este tipo se implementará la autenticación de contraseña utilizando un archivo de contraseña.
  • AuthName: establece el mensaje para el cuadro de diálogo de autenticación. Debe procurar que esto sea genérico para que los usuarios no autorizados no obtengan información sobre lo que se protege.
  • AuthUserFile: establece la ubicación del archivo de contraseña que se utilizará para la autenticación. Esto debe quedar fuera de los directorios que se presentan. Crearemos este archivo pronto.
  • Require valid-user: especifica que solo los usuarios autenticados deberán tener acceso al recurso. Esto es lo que realmente impide el ingreso de los usuarios no autorizados.

Cuando termine, guarde y cierre el archivo.

La ubicación que seleccionó para su archivo de contraseña fue /etc/phpmyadmin/.htpasswd. Ahora puede crear este archivo y pasarle un usuario inicial con la utilidad htpasswd:

  • sudo htpasswd -c /etc/phpmyadmin/.htpasswd username

Para el usuario que creará, se le solicitará seleccionar y confirmar una contraseña. Después, el archivo se creará con la contraseña con hash que ingresó.

Si desea ingresar un usuario adicional, debe hacerlo sin el indicador -c, como se muestra:

  • sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser

Ahora, cuando acceda a su subdirectorio phpMyAdmin, se le solicitarán el nombre de cuenta y la contraseña adicionales que acaba de configurar:

https://domain_name_or_IP/phpmyadmin

Contraseña phpMyAdmin de Apache

Después de ingresar la autenticación de Apache, accederá a la página de autenticación normal de phpMyAdmin para ingresar sus credenciales de MySQL. Al añadir un conjunto adicional de credenciales que no son las de MySQL, proporciona a su base de datos una capa de seguridad adicional. Esto es conveniente, ya que phpMyAdmin ha sido vulnerable a amenazas de seguridad en el pasado.

Conclusión

De esta manera, phpMyAdmin debería estar ya configurado y listo para usar en su servidor Ubuntu 20.04. Utilizando esta interfaz, puede crear fácilmente bases de datos, usuarios y tablas, y realizar operaciones habituales, como las de eliminar y modificar estructuras y datos.

Creative Commons License