Introducción
En la administración profesional de sistemas, utilizar el usuario root para las conexiones habituales de las aplicaciones supone un riesgo importante para la seguridad. Si un atacante vulnera una aplicación que utiliza la cuenta root, obtiene el control total de todas las bases de datos del servidor.
La práctica recomendada establece que cada aplicación debe tener su propio usuario dedicado, con permisos limitados exclusivamente a su propia base de datos dedicada.
Este modelo equivale, en las bases de datos, a separar las identidades de las aplicaciones en el nivel del sistema operativo. El control de acceso debe reflejar el propósito de cada cuenta, no solo la comodidad.
Esta es la versión para bases de datos del principio de mínimo privilegio que ya ha visto en la gestión de usuarios de Linux. Si una cuenta de aplicación se ve comprometida, limitar sus privilegios reduce el alcance del daño.
En este laboratorio, protegerá el entorno siguiendo estos procedimientos habituales:
- Cree una base de datos nueva para una aplicación hipotética.
- Cree una cuenta de usuario específica para esa aplicación.
- Conceda al usuario permisos únicamente sobre su base de datos específica.
- Verifique la configuración iniciando sesión como el usuario nuevo.
Crear una base de datos nueva
Primero, debe iniciar sesión en el servidor MySQL con privilegios administrativos para crear la base de datos nueva.
Abra el terminal y ejecute el siguiente comando para acceder al intérprete de comandos de MySQL:
sudo mysql
Nota: Este comando utiliza
sudopara autenticarse como root mediante el socket del sistema. Si se le solicita una contraseña que no conoce, pruebe conmysql -u root -p.
Cuando aparezca el prompt mysql>, podrá ejecutar sentencias SQL.
En este punto, está conectado como usuario administrativo de la base de datos, porque crear bases de datos es una operación privilegiada. Normalmente, las cuentas de las aplicaciones no tienen este nivel de control.
Cree una base de datos nueva llamada app_db. Esta base de datos será el contenedor de los datos de nuestra aplicación.
CREATE DATABASE app_db;
Si la operación se realiza correctamente, MySQL responderá con Query OK. Puede comprobar que la base de datos existe mostrando todas las bases de datos:
SHOW DATABASES;
Debería ver app_db en la lista.
Crear un usuario dedicado
Ahora que tenemos una base de datos, necesitamos un usuario que la gestione. Crearemos un usuario llamado app_user.
En el mismo intérprete de comandos de MySQL, ejecute la siguiente sentencia:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';
Desglose de la sentencia:
'app_user': el nombre de usuario.'@'localhost': restringe al usuario para que solo pueda conectarse desde este servidor, como medida de seguridad.IDENTIFIED BY 'password': establece la contraseña como"password".
En este momento, el usuario existe, pero no tiene permisos. Puede iniciar sesión, pero no puede leer ni escribir datos.
Este es un modelo de seguridad importante: la identidad y los privilegios son elementos independientes. Crear una cuenta no concede automáticamente la capacidad de utilizar todos los objetos de todas las bases de datos.
Puede comprobar que el usuario existe consultando la tabla de usuarios del sistema:
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
Conceder permisos
Ahora debemos conceder explícitamente a app_user permiso para utilizar app_db.
Queremos conceder a nuestro usuario todos los permisos (ALL) sobre app_db, incluidos los permisos para leer, escribir y modificar tablas.
Ejecute este comando en el intérprete de comandos de MySQL:
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
Desglose de la sintaxis:
GRANT ALL PRIVILEGES: concede permisos de acceso completo.ON app_db.*: aplica estos permisos a la base de datosapp_dby a*, es decir, a todas las tablas que contiene.TO 'app_user'@'localhost': especifica quién recibe estos permisos.
El patrón database.* es importante porque los privilegios pueden limitarse a distintos ámbitos. En MySQL/MariaDB, se pueden conceder permisos de forma global, por base de datos, por tabla y, en algunos casos, con un alcance todavía más específico.
Esto garantiza que app_user tenga amplios permisos dentro de app_db, pero no tenga permisos en ningún otro lugar.
Para confirmar que los permisos se han asignado correctamente:
SHOW GRANTS FOR 'app_user'@'localhost';
Verificar el acceso del usuario
Para asegurarnos de que todo funciona como se espera, cerraremos la sesión de la cuenta root e intentaremos iniciar sesión como el usuario nuevo.
Primero, salga de la sesión de root:
EXIT;
A continuación, vuelva al terminal de Linux e inicie sesión como app_user:
mysql -u app_user -p
Cuando se le solicite, introduzca la contraseña password.
Después de iniciar sesión, compruebe qué bases de datos puede ver:
SHOW DATABASES;
Qué debe comprobar:
- Debe ver
app_dbyinformation_schema. - No debe ver
mysqlnisys.
Esto confirma que la configuración de permisos funciona correctamente: el usuario solo puede ver aquello a lo que tiene permiso de acceso.
Este paso de verificación es fundamental para el control de acceso. No basta con ejecutar una sentencia GRANT; debe confirmar que la vista resultante del sistema coincide con el diseño de mínimo privilegio que pretendía aplicar.
Cambie a su base de datos para terminar el laboratorio:
USE app_db;
EXIT;
Resumen
En este laboratorio, ha implementado correctamente un modelo seguro de acceso a bases de datos. Ha aprendido a:
- Crear una base de datos nueva (
app_db). - Crear un usuario dedicado (
app_user). - Conceder permisos específicos mediante el comando
GRANT. - Verificar que los controles de acceso funcionan según lo previsto.
Este modelo de mínimo privilegio es un pilar fundamental de la seguridad de las bases de datos y debe utilizarse con cada aplicación que implemente.



