# Crear un usuario de MySQL con acceso restringido a una IP y permisos totales sobre un esquema

- Link: https://binariocero.com/mysql/crear-un-usuario-de-mysql-con-acceso-restringido-a-una-ip-y-permisos-totales-sobre-un-esquema
- Published: 2026-09-16T20:02:37+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

Cuando administramos un servidor MySQL, es habitual que necesitemos crear usuarios
con acceso limitado a determinadas bases de datos y, además, restringir desde qué
equipos pueden conectarse.

Una configuración especialmente útil en entornos de red local es crear un usuario
que tenga **todos los permisos sobre un esquema concreto**, pero que **solo pueda
conectarse desde una dirección IP determinada**.

En este ejemplo utilizaremos la dirección IP `172.16.1.52`.

## 1. Crear el esquema

El primer paso es crear la base de datos o esquema sobre el que trabajará el usuario.

Por ejemplo:

    ```wp-block-code
    CREATE DATABASE mi_schema;
    ```

Esto crea un esquema denominado `mi_schema`.

Si el esquema ya existe, este paso no es necesario.

## 2. Crear el usuario restringido por IP

Una de las características importantes del sistema de usuarios de MySQL es que el
usuario se puede asociar a un determinado origen de conexión.

Para crear un usuario que únicamente pueda conectarse desde `172.16.1.52`, utilizaremos:

    ```wp-block-code
    CREATE USER 'mi_usuario'@'172.16.1.52'
    IDENTIFIED BY 'TU_PASSWORD';
    ```

La parte:

    ```wp-block-code
    'mi_usuario'@'172.16.1.52'
    ```

es especialmente importante.

En MySQL, una cuenta está formada por:

    ```wp-block-code
    'usuario'@'host'
    ```

Por tanto:

    ```wp-block-code
    'mi_usuario'@'172.16.1.52'
    ```

significa que `mi_usuario` solo puede autenticarse cuando la conexión procede de`
172.16.1.52`.

No es lo mismo que crear:

    ```wp-block-code
    'mi_usuario'@'%'
    ```

ya que `%` permitiría conexiones desde cualquier dirección que cumpla el resto de
requisitos de autenticación.

## 3. Conceder todos los permisos sobre el esquema

Una vez creado el usuario, podemos concederle todos los privilegios sobre `mi_schema`:

    ```wp-block-code
    GRANT ALL PRIVILEGES ON mi_schema.*
    TO 'mi_usuario'@'172.16.1.52';
    ```

El `*` después del nombre del esquema indica que los permisos se aplican a todos
los objetos de esa base de datos.

Por ejemplo:

    ```wp-block-code
    mi_schema.*
    ```

incluye las tablas y demás objetos incluidos en ese esquema.

El usuario tendrá permisos para realizar las operaciones necesarias sobre ese esquema,
pero estos permisos **no se extienden automáticamente al resto de bases de datos
del servidor**.

## 4. Aplicar los cambios

En las versiones actuales de MySQL, los cambios realizados mediante `CREATE USER`
y `GRANT` se gestionan directamente por el servidor, por lo que normalmente no es
necesario ejecutar `FLUSH PRIVILEGES`.

Si aun así queremos hacerlo explícitamente, podemos ejecutar:

    ```wp-block-code
    FLUSH PRIVILEGES;
    ```

## 5. Comprobar los permisos

Es recomendable verificar que la configuración se ha realizado correctamente.

Podemos consultar los privilegios del usuario mediante:

    ```wp-block-code
    SHOW GRANTS FOR 'mi_usuario'@'172.16.1.52';
    ```

El resultado debería mostrar una concesión similar a:

    ```wp-block-code
    GRANT ALL PRIVILEGES ON `mi_schema`.* TO `mi_usuario`@`172.16.1.52`
    ```

Esto confirma que el usuario dispone de todos los privilegios sobre `mi_schema`.

## 6. Resultado de la configuración

Con esta configuración tendremos:

| Elemento | Configuración | 
| Esquema | `mi_schema` | 
| Usuario | `mi_usuario` | 
| IP permitida | `172.16.1.52` | 
| Permisos | Todos sobre `mi_schema` | 
| Acceso a otros esquemas | No concedido |

Por ejemplo, una conexión desde:

    ```wp-block-code
    172.16.1.52
    ```

podrá utilizar el usuario:

    ```wp-block-code
    mi_usuario
    ```

mientras que una conexión procedente de:

    ```wp-block-code
    172.16.1.53
    ```

no podrá utilizar esa misma cuenta.

## 7. Script completo

Si necesitamos realizar toda la configuración desde cero, podemos utilizar el siguiente
script:

    ```wp-block-code
    CREATE DATABASE mi_schema;

    CREATE USER 'mi_usuario'@'172.16.1.52'
    IDENTIFIED BY 'TU_PASSWORD';

    GRANT ALL PRIVILEGES ON mi_schema.*
    TO 'mi_usuario'@'172.16.1.52';

    FLUSH PRIVILEGES;
    ```

Y para comprobar posteriormente los permisos:

    ```wp-block-code
    SHOW GRANTS FOR 'mi_usuario'@'172.16.1.52';
    ```

## 8. Una consideración importante

La restricción:

    ```wp-block-code
    'mi_usuario'@'172.16.1.52'
    ```

controla **desde qué host puede autenticarse el usuario en MySQL**, pero no sustituye
a las medidas de seguridad de red.

Si MySQL está escuchando conexiones remotas, también conviene revisar el firewall
del servidor y permitir el puerto de MySQL —habitualmente `3306`— únicamente desde
las redes o equipos que realmente necesiten acceder.

Además, si el servidor está expuesto a otras redes, es recomendable evitar accesos
innecesarios y utilizar contraseñas robustas.

## Conclusión

La combinación de un usuario asociado a una dirección IP concreta y permisos limitados
a un único esquema permite crear una configuración con un nivel de control mucho
mayor que utilizar una cuenta con acceso global.

La clave está en combinar:

    ```wp-block-code
    'mi_usuario'@'172.16.1.52'
    ```

para restringir **el origen de la conexión**, con:

    ```wp-block-code
    GRANT ALL PRIVILEGES ON mi_schema.*
    ```

para limitar **el alcance de los permisos** al esquema que necesita utilizar el 
usuario.

De esta forma, el usuario puede trabajar con todos los objetos de `mi_schema`, pero
no dispone de permisos sobre las demás bases de datos del servidor y tampoco puede
utilizar esa cuenta desde una dirección IP diferente a `172.16.1.52`.
