post icon

Como Otorgar y Denegar permisos sobre los objetos de MySQL

Administrar la seguridad de nuestras bases de datos suele ser un tema que solemos dejar muy “colgado” y le restamos importancia siendo que no debe ser así, luego de la funcionalidad y las copias de seguridad deberían enfocarse nuestras prioridades en la seguridad del mismo.

Personalmente considero que un motor que no soporte Procedimientos Almacenados o Funciones no debe utilizarse para almacenar datos importantes, ello nos ayudará a administrar gran parte de la seguridad del mismo.

Algunas ventajas que obtenemos al utilizar Procedures en vez de Querys directos desde la aplicación son las siguientes:

  • El código SQL ya no se verifica su sintaxis una vez creada, por lo que se ejecuta más rápido.
  • El código SQL ya no se vuelve a compilar, y también hace que se ejecute más rápido que un Query externo.
  • Se generan estadísticas de uso de los Procedimientos, lo cuales ayudarán a optimizar el rendimiento y volvemos a obtener mayor velocidad de ejecución.
  • Evitamos ser atacados por SQL Injection, ya que no podrán modificar el Query para propósitos malignos.
  • La seguridad aumenta, ya que los usuarios no pueden interactuar directamente con las tablas, sino más bien sólo pueden trabajar con los SP que hacen lo que sólo nosotros hemos determinado que hagan.
  • Requiere de menor trabajo a la hora de administrar los permisos, solo asignamos permisos de EXECUTE en vez de SELECT, INSERT, UPDATE, DELETE, etc.

Lo recomendable es crear varios usuarios con distintos niveles de permisos, para el ejemplo hoy crearé dos usuarios el primero llamado limitado que sólo podrá ejecutar los stored procedures y otro llamado administrador que podrá hacer todo, desde crear, eliminar, alterar, truncar, insertar, actualizar, seleccionar entre otras cosas. Para proceder a esto es recomendable loguearse como root, desde localhost.

CREATE USER limitado IDENTIFIED BY '******';
CREATE USER administrador IDENTIFIED BY '******';

Ahora procedemos a otorgar los permisos a uno, que puede ser como nuestro usuario root

GRANT ALL ON *.* TO 'administrador'@'%' IDENTIFIED BY '******';

Para comenzar con el usuario limitado, le revocaremos todos los permisos que el disponga, y le iremos otorgando según sea necesario.

REVOKE ALL PRIVILEGES on *.* from limitado;

Para ir asignando los permisos al usuario limitado sobre los procedimientos, necesariamente tenemos crear hacerlo por cada uno de ellos, aunque si se ingenian un poco podrían hacerlo con SQL Dinamico.

GRANT EXECUTE ON PROCEDURE mibd.miprocedimiento TO 'limitado'@'%' IDENTIFIED BY '******';

Si tenemos una tabla llamada empleados, ahora sólo podríamos acceder a ella logueandonos como el usuario administrador o ejecutando algún procedimiento con el usuario limitado.

MySQL 5.0.3 en adelante recién ha implementado éste sistema, así que deberemos verificar si lo cumplimos, la misma ésta basada en el estándar SQL 2003. Por lo que la seguridad del SQL podemos setearla como INVOKER o DEFINER. En que se diferencia ésto? Si utilizamos el INVOKER, el procedimiento se ejecutará con los permisos del invocador, en este caso el usuario limitado y si dentro contiene algun query que afecte alguna de las tablas sobre la cual él no tiene permisos el motor nos devolverá un error de permisos. Aquí entra en juego los procedimientos de tipo DEFINER, en donde debemos definir que el mismo será ejecutado con los permisos de algún otro usuario, administrador. Así podrá no tendremos problemas.

Para comprender mejor pondré 2 ejemplos del mismo procedimiento, el primero será de tipo INVOKER, o como no debemos crearlos en éste caso en particular y el segundo de tipo DEFINER como deberiamos hacerlo.

CREATE PROCEDURE mibd.miprocedimiento()
SQL SECURITY INVOKER
BEGIN
	SELECT * FROM MITABLA;
END
CREATE DEFINER = 'administrador'@'%'
PROCEDURE mibd.miprocedimiento()
BEGIN
	SELECT * FROM MITABLA;
END

Comentarios desde Facebook:

  1. avatar
    AFJ ARGENTINA Google Chrome Windows
    12 noviembre 2010 at 10:15 #

    hola exelente tu post…. super claro

Trackbacks/Pingbacks

  1. Tweets that mention Como Otorgar [Grant] y Denegar [Revoke] permisos sobre los objetos de MySQL | DevTroce.com -- Topsy.com UNITED STATES - 3 noviembre 2010

    […] This post was mentioned on Twitter by Ronald Riveros, DevTroce. DevTroce said: Como Otorgar y Denegar permisos sobre los objetos de #MySQL: Administrar la #seguridad de… http://goo.gl/fb/XHQQj […]

  2. Como crear reportes con Crystal Reports en ASP.Net y SQL Server | DevTroce.com WordPress - 2 noviembre 2010

    […] seguir con éste tutorial necesitaremos de la BD Adventure Works, en este enlace pueden ver como conseguirlo e instalarlo para los que no […]

Responder