Mysql Entendiendo el sistema de permisos
Revisión del 13:08 1 nov 2017 de Wiki (discusión | contribuciones)
Sumario
Niveles de seguridad
- Parece lógico que si queremos acceder a información guardada en una base de datos, tengamos establecido algún sistema de permisos que especifique que operaciones van a poderse realizar con los datos guardados.
- Además, el servidor Mysql también va a permitir gestionar ciertos permisos administrativos sobre el propio gestor.
- Las operaciones que vamos a poder realizar las podemos agrupar en las siguientes categorías:
- DATOS (conformaría el Lenguaje de Manipulación de Datos => DML (Data Manipulation Language), componente de un Sistema de Gestión de Base de Datos):
- Manipulación de datos: INSERT, UPDATE, DELETE aplicadas a tablas/vistas dentro de una base de datos.
- Consulta de datos: SELECT aplicada a tablas/vistas dentro de una base de datos.
- Vistas: CREATE VIEW, ALTER VIEW, DROP VIEW.
- Resto de órdenes DML.
- GESTIÓN (conformaría el Lenguaje de Definición de Datos => DDL (Data Definition Language), componente de un Sistema de Gestión de Base de Datos):
- Base de datos: CREATE DATABASE, ALTER DATABASE, DROP DATABASE
- Tablas: CREATE TABLE, ALTER TABLE, DROP TABLE
- Procedimientos almacenados: CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, EXECUTE
- Triggers: CREATE TRIGGER, ALTER TRIGGER, DROP TRIGGER
- Resto de órdenes DDL.
- SEGURIDAD (conformaría un sub-lenguaje del Lenguaje de Definición de Datos, denominado Lenguaje de Control de Datos (Data Control Language => DCL)):
- Usuarios: CREATE USER, ALTER USER, DROP USER
- Gestión de permisos: GRANT, REVOKE
- Resto de órdenes DCL.
- Mysql incorpora un sistema de seguridad en el que con las órdenes definidas en el DCL, especifica qué permisos DDL y DML va a tener un usuario.
- Para ello debemos pasar por diferentes niveles de seguridad.
Primer Nivel: Mysql
- El primer nivel lo compone el propio Mysql.
- Debemos de determinar qué usuarios tienen permiso de conexión al servidor Mysql.
- La información que va a guardar Mysql para determinar si un usuario tiene permiso de conexión es:
- Nombre del usuario
- Password del usuario
- Dirección IP/Nombre del host desde el que el usuario está intentando conectarse al servidor.
- Toda esa información está guardada en la tabla user de la base de datos Mysql.
- Si ejecutamos la orden SQL: desc mysql podemos observar lo siguiente:
- Host: Indica la dirección ip/nombre del host desde el cual el usuario va a poder conectarse.
- Recordar que por defecto, Mysql no permite conexiones remotas utilizando TCP/IP, por lo que tendríais que comentar la [bind-address variable del sistema bind-address] en su archivo de configuración.
- Los valores más comunes para este campo suelen ser:
- localhost/127.0.0.1: esto implica que el usuario sólo puede conectarse vía ssh o estando físicamente en la misma máquina donde se encuentra el servidor Mysql.
- %: Cualquier dirección IP.
- A.B.C.D: Una dirección ip concreta. Por ejemplo: 192.168.1.10
- Es posible utilizar el símbolo '%' como cualquier parte de una dirección ip de la forma: 192.168.1.%
- Es posible utilizar el símbolo '%' como cualquier parte de un nombre de host de la forma: '%.mysql.com'
- Más información en este enlace.
- User: El nombre del usuario que tiene acceso al servidor.
- Password: El password del usuario. Está encriptada.
- Importante: Recordar que los usuarios del servidor Mysql no tienen nada que ver con los usuarios creados a nivel del sistema operativo.
- Una vez creado un usuario, éste puede conectarse al Mysql, pero no puede realizar ninguna acción ya que no tiene establecido ningún tipo de permiso.
Segundo Nivel: Bases de datos
- Una vez creado el usuario debemos otorgarle permisos.
- Los más comunes son los que le van a permitir realizar operaciones sobre una base de datos.
- Cuando creamos un usuario podemos otorgarle permisos a nivel de 'todas las bases de datos' o a nivel de 'una base de datos en particular'.
- Los permisos globales (los que se aplican a todas las bases de datos) están definidos en la propia tabla 'user' de la base de datos 'mysql'.
- En la imagen podemos observar las columnas de la tabla user: 'select_priv','update_priv','delete_priv','insert_priv'.
- Estas columnas pueden tener un valor 'Y' o 'N' y por defecto, el valor predeterminado es 'NO'. Un usuario que tenga puesto a 'YES' el valor de estas columnas, tendría como consecuencia que podría realizar operaciones SQL de SELECT, UPDATE, DELETE e INSERT sobre todas las tablas de todas las bases de datos de Mysql.
- En la imagen podemos observar como el usuario 'root' tiene permisos mientras que un usuario creado en una práctica anterior ('user1') no tiene dicho permiso.
- Nota: Antes de la versión MySQL 5.6.7, existía una tabla host en la base de datos 'mysql' donde también se guardaba permisos a nivel global de qué direcciones ip podrían acceder a qué bases de datos y permisos globales sobre dichas bases de datos.
- Los permisos locales a nivel de una base de datos en particular se encuentran guardados en la tabla db de la base de datos Mysql.
- En el caso de que un usuario intentara realizar alguna operación en una base de datos, y no tuviera permiso 'global' para realizarla, iría a esta tabla a buscar si tiene otorgado el permiso.
- Si vemos la imagen podemos comprobar como en esta tabla:
- Las columnas Host,Db, User conforman la clave primaria de la tabla y por tanto no puede haber dos filas con los mismos valores.
- Host: nombre del host desde está permitido acceder a la base de datos.
- Db: nombre de la base de datos.
- User: nombre del usuario que tiene permiso de acceso a la base de datos.
- Igual que en los permisos a nivel global, un permiso a 'YES' en esta tabla, implicaría que el usuario tendría ese permiso en todas las tablas creadas dentro de la base de datos.
- Podemos comprobar en la imagen como el usuario 'user1' tiene permiso de selección (select_priv) desde 'localhost' en la base de datos 'employees' y por lo tanto va a poder ejecutar la orden SQL SELECT sobre cualquier tabla de la base de datos.
Tercer Nivel: Tablas y columnas
-- Ángel D. Fernández González -- (2017).

