Diferencia entre revisiones de «Mysql Gestión de permisos»
Ir a la navegación
Ir a la búsqueda
| Línea 54: | Línea 54: | ||
| + | : Todos los permisos que vamos a indicar a continuación tienen su correspondiente 'columna' en la tabla '''mysql.user'''. | ||
: Estos permisos son los siguientes: | : Estos permisos son los siguientes: | ||
| Línea 72: | Línea 73: | ||
: Más información: | : Más información: | ||
| − | : | + | :: [https://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html Enlace]. |
| Línea 80: | Línea 81: | ||
:* [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file FILE]: Quien tenga otorgado este privilegio puede leer y escribir en ficheros del servidor utilizando las intrucciones [https://dev.mysql.com/doc/refman/5.7/en/load-data.html LOAD DATA INFILE], [https://dev.mysql.com/doc/refman/5.7/en/select-into.html SELECT INTO ...OUTFILE] y la función [https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file LOAD_FILE()]. | :* [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file FILE]: Quien tenga otorgado este privilegio puede leer y escribir en ficheros del servidor utilizando las intrucciones [https://dev.mysql.com/doc/refman/5.7/en/load-data.html LOAD DATA INFILE], [https://dev.mysql.com/doc/refman/5.7/en/select-into.html SELECT INTO ...OUTFILE] y la función [https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file LOAD_FILE()]. | ||
| + | :: Este permiso puede ser muy peligroso por lo que no debería otorgarse a ningún usuario. | ||
| + | :: Con la función LOAD_FILE() cargamos archivos que se <u>encuentran en el servidor</u>. En la versión 5.7, solamente deja 'cargar' los archivos que se encuentren en el directorio '''/var/lib/mysql-files/''', el cual está establecido en la variable del sistema [https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv secure_file_priv]. Recordar que en distribuciones Ubuntu es necesario otorgar permisos de acceso si utilizamos un directorio diferente, como vimos [http://wiki.cifprodolfoucha.es/index.php?title=Mysql_Instalaci%C3%B3n#Caso_especial:_Los_directorios anteriormente en la instalación]. | ||
| + | :: Veamos un ejemplo: | ||
| + | :::<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | SELECT LOAD_FILE('/var/lib/mysql-files/prueba.txt'); | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :: La función LOAD DATA INFILE puede cargar tanto ficheros locales (LOAD DATA '''LOCAL''' INFILE) como del servidor. | ||
| + | :: La función SELECT INTO hace el proceso contrario, y guarda una consulta en un archivo. | ||
| + | |||
| + | :* [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_create-user CREATE USER]: Permite crear, modificar, borrar, [https://dev.mysql.com/doc/refman/5.7/en/rename-user.html renombrar] y [https://dev.mysql.com/doc/refman/5.7/en/revoke.html quitar los permisos de los usuarios]. | ||
| + | |||
| + | :* [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_process PROCESS]: Permite ver los threads del servidor. Es utilizado al ejecutar las órdenes SQL: | ||
| + | ::* [https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html show processlist] o la orden [https://dev.mysql.com/doc/refman/5.7/en/mysqladmin.html mysqladmin processlist]: Muestra las conexiones al servidor. Todo usuario puedo ejecutarla para ver sus propias conexiones, pero la forma: show '''full''' processlist, muestra todas las conexiones y esto sólo lo podrá ver el usuario que tenga el permiso PROCESS. | ||
| + | ::* [https://dev.mysql.com/doc/refman/5.7/en/show-engine.html SHOW ENGINE]: Muestra información sobre los motores de almacenamiento. | ||
| + | :* [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_reload RELOAD]: Permite realizar operaciones de '''FLUSH''' en el servidor. Dichas operaciones las podemos realizar desde SQL con el comando [https://dev.mysql.com/doc/refman/5.7/en/flush.html sql FLUSH] o con la [https://dev.mysql.com/doc/refman/5.7/en/mysqladmin.html herramienta mysqladmin] y las operaciones: flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, y reload (hace lo mismo que flush-privelges). | ||
| − | + | REPLICATION CLIENT, | |
REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER | REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER | ||
Revisión del 20:58 28 nov 2017
Introdución
- Las dos órdenes SQL que nos van a permitir establecer y quitar permisos son: GRANT y REVOKE.
- Cada vez que ejecutemos una de estas órdenes será necesasrio ejecutar la orden FLUSH PRIVILEGES para que los cambios tengan efecto.
- Los permisos que vamos a otorgar estarán en uno de los niveles de seguridad que vimos en un punto anterior y que por lo tanto se traducirá en la inserción, modificación y borrado de filas en las tablas: user,db,tables_priv y columns_priv.
- Cuando se crea un usuario el único permiso que tiene es el de USAGE que le da derecho a conectarse a Mysql.
GRANT
- Esta es la orden SQL que concede permisos.
- Podemos consultar su sintaxis completa en este enlace.
Permisos a nivel global
- Para que otorgar un permiso a este nivel, hay que indicar: ON *.* en la cláusula grant.
- La sintaxis básica para dar permisos a nivel del gestor Mysql, incluyendo los permisos administrativos sería:
1 GRANT SELECT ON *.* TO 'user1'@'localhost'
- Nota: Si el usuario ya está conectado cuando se realiza el cambio de permisos, no serán aplicados. El usuario necesita cerrar la conexión y volver a abrirla.
- En este ejemplo, estaríamos dando permiso de selección sobre todas las tablas de todas las bases de datos, al usuario 'user1' conectado desde host 'localhost'.
- Recordar que esta sentencia se traducirá en una orden INSERT sobre la tabla mysql.user.
- Podemos otorgar varios permisos en una única operación, separándolos con comas:
1 GRANT SELECT,UPDATE ON *.* TO 'user1'@'localhost'
- Nota: Si el usuario ya está conectado cuando se realiza el cambio de permisos, no serán aplicados. El usuario necesita cerrar la conexión y volver a abrirla.
- Como ya comentamos en un punto anterior, existen ciertos permisos que permiten administrar el gestor Mysql y que no tienen 'otros niveles' como sucede con el permiso SELECT por ejemplo (podemos tener un select a nivel de base de datos, a nivel de tabla, a nivel de columna de una tabla).
- Nota: Lógicamente para que un usuario pueda otorgar estos permisos, debe de tener permiso para poder otorgarlo. Esto lo veremos posteriormente, pero por ahora indicar que el usuario que ejecuta las órdenes que otorgan los permisos es 'root'.
- Todos los permisos que vamos a indicar a continuación tienen su correspondiente 'columna' en la tabla mysql.user.
- Estos permisos son los siguientes:
- CREATE TABLESPACE: El usuario tiene permiso para crear (CREATE), borrar (DROP) o modificar (ALTER) 'tablespace'. Un 'tablespace' es una parte de disco donde podemos guardar la información de una o varias tablas. La principal ventaja es que nos va a permitir guardar los datos de una tabla 'fuera' del directorio de datos de Mysql. Existen otras funcionalidades que se pueden consultar en el enlace anterior.
- Un ejemplo:
1 GRANT CREATE TABLESPACE ON *.* TO 'user1'@'localhost'
- Por defecto se crea en el mismo director que donde Mysql guarda los datos, indicado por la variable del sistema datadir.
- Una vez creado un tablespace podemos crear una tabla o varias tablas y hacer que se guarde en ese tablespace.
- Un ejemplo:
- En este ejemplo estamos creando un tablespace en el directorio '/datos/', creado previamente y con permisos por parte de apparmor (tenéis que darle los mismos permisos que los de datos) y posteriormente creamos una tabla en ese tablespace, comprobando como después de añadir dos filas, físicamente aparece el 'archivo ibd' en el directorio.
- Más información:
- EXECUTE: El usuario tiene permiso para ejecutar procedimientos y funciones.
- FILE: Quien tenga otorgado este privilegio puede leer y escribir en ficheros del servidor utilizando las intrucciones LOAD DATA INFILE, SELECT INTO ...OUTFILE y la función LOAD_FILE().
- Este permiso puede ser muy peligroso por lo que no debería otorgarse a ningún usuario.
- Con la función LOAD_FILE() cargamos archivos que se encuentran en el servidor. En la versión 5.7, solamente deja 'cargar' los archivos que se encuentren en el directorio /var/lib/mysql-files/, el cual está establecido en la variable del sistema secure_file_priv. Recordar que en distribuciones Ubuntu es necesario otorgar permisos de acceso si utilizamos un directorio diferente, como vimos anteriormente en la instalación.
- Veamos un ejemplo:
1 SELECT LOAD_FILE('/var/lib/mysql-files/prueba.txt');
- La función LOAD DATA INFILE puede cargar tanto ficheros locales (LOAD DATA LOCAL INFILE) como del servidor.
- La función SELECT INTO hace el proceso contrario, y guarda una consulta en un archivo.
- CREATE USER: Permite crear, modificar, borrar, renombrar y quitar los permisos de los usuarios.
- PROCESS: Permite ver los threads del servidor. Es utilizado al ejecutar las órdenes SQL:
- show processlist o la orden mysqladmin processlist: Muestra las conexiones al servidor. Todo usuario puedo ejecutarla para ver sus propias conexiones, pero la forma: show full processlist, muestra todas las conexiones y esto sólo lo podrá ver el usuario que tenga el permiso PROCESS.
- SHOW ENGINE: Muestra información sobre los motores de almacenamiento.
- RELOAD: Permite realizar operaciones de FLUSH en el servidor. Dichas operaciones las podemos realizar desde SQL con el comando sql FLUSH o con la herramienta mysqladmin y las operaciones: flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, y reload (hace lo mismo que flush-privelges).
REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER
- Veamos un ejemplo:
1 GRANT CREATE USER,CREATE TABLESPACE ON *.* TO 'user1'@'localhost'; 2 select User,Host, Create_user_priv,Create_tablespace_priv from mysql.user;
- Nota: Si el usuario ya está conectado cuando se realiza el cambio de permisos, no serán aplicados. El usuario necesita cerrar la conexión y volver a abrirla.
Consideraciones finales
- No dejar el permiso file_priv en ninguna cuenta de Mysql.
- Es uno de los más peligrosos.
-- Ángel D. Fernández González -- (2017).