Mysql Entendiendo el sistema de permisos
Revisión del 15:16 1 nov 2017 de Wiki (discusión | contribuciones) (→Tercer Nivel: Tablas y columnas)
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
- A nivel de tabla, un usuario que tenga permiso a este nivel lo tendrá sobre toda la tabla.
- Es decir, si tengo permiso de selección, podré seleccionar todas las columnas de la tabla.
- Los permisos en este nivel se guardan en la tabla tables_priv de la base de datos mysql.
- Como observamos, las columnas de la tabla tienen:
- Clave primaria formada por las columnas (User,Db,Host y Table_name).
- Grantor: Indica el usuario que otorgó este permiso.
- TimeStamp: El momento en que se otorgó el permiso.
- TablePriv: Tabla sobre la que se va a aplicar el permiso.
- Debemos de tener en cuenta que si otorgamos permiso a nivel de tabla, aquí aparecerá el tipo de permiso (por ejemplo, delete,insert).
- Column_priv: En caso de que tengamos un permiso a nivel de tabla, esta columna estará en blanco. Si tenemos un permiso a nivel de columna, esta columna tendré el tipo de permiso (por ejemplo, update) y la columna anterior (TablePriv) estará en blanco (podría tener un permiso diferente al de update).
- En la imagen se puede ver como a nivel de tabla, el usuario 'user1' tiene permiso de delete sobre toda la tabla mientras que tiene un permiso de 'insert' sobre alguna columna de la tabla.
- A nivel de columnas, indicamos sobre qué columnas de una tabla voy a tener permiso.
- Como observamos, las columnas de la tabla tienen:
- Clave primaria formada por las columnas (User,Db,Host, Table_name y Column_name).
- TimeStamp: No se usa.
- Column_priv: permiso que tenemos sobre esta columna de esta tabla.
- En la imagen superior se puede ver como a nivel de columna, el usuario 'user1' tiene permiso de 'insert' sobre la tabla 'departments' de la base de datos 'employees' pero sólo en la columna 'dept_name'. Por eso la tabla anterior indicaba en la columna 'column_priv' el valor 'insert'
- El listado de los posibles permisos que podemos otorgar a nivel de tabla/columna se muestran en la siguiente imagen (también están los permisos a nivel de proc. y funciones que se comenta en el siguiente punto).
Lista de privilegios en Mysql
- En base a lo visto anteriormente, podemos detallar la lista de privilegios que disponemos en Mysql:
Procedimientos y funciones
- Estos permisos se encuentran al mismo nivel que las tablas, pero afectan a los procedimientos y funciones que podamos tener creados en Mysql.
- En las siguientes unidades veremos para qué pueden servir y crearemos varios.
- A estas alturas sólo debemos saber que un procedimiento/función es un conjunto de instrucciones SQL agrupadas y que se ejecutan todas juntas cuando se llama al nombre del procedimiento/función.
- Por lo tanto, uno de los permisos que vamos a tener es el de ejecución (EXECUTE) para que un usuario pueda llamar al procedimiento/función.
- Las columnas TimeStamp y Grantor no se utilizan.
Órdenes SQL relacionadas
- Cualquier modificación que hagamos directamente sobre las tablas del sistema vistas anteriormente (user, db, table_priv, column_priv) no tendrán efecto:
- Hasta que reiniciemos el servicio
- Ejecutemos la orden SQL: FLUSH PRIVILEGES
- Ejecutemos la herramienta cliente mysqladmin: mysqladmin -u root -p flush-privileges (suponemos cuenta root con password)
- Ejecutemos la herramienta cliente mysqladmin: mysqladmin -u root -p reload (suponemos cuenta root con password)
- Para mostrar la lista de usuarios del sistema:
- Desde SQL:
1 SELECT user, host FROM mysql.user;
- Gráficamente desde 'MysqlWorkBench:
- Gráficamente desde PhpMyAdmin:
- Listado de usuarios desde PhpMyAdmin
- Para mostrar los permisos que posee un determinado usuario:
1 show grants for 'user'@'host'
- Por ejemplo:
-- Ángel D. Fernández González -- (2017).



