Otorgando permisos a nivel de tabla
Puede crear un usuario con permisos de nivel de tabla en MySQL realizando lo siguiente:
-
Conéctese a MySQL como usuario con Create_user_priv y Grant_priv. Determine qué usuarios tienen estos privilegios ejecutando la siguiente consulta. Su usuario ya necesitará el privilegio SELECT en MySQL.user para ejecutar la consulta.
SELECT User, Host, Super_priv, Create_user_priv, Grant_priv from mysql.user WHERE Create_user_priv = 'Y' AND Grant_Priv = 'Y';
-
Ejecute la siguiente consulta para generar las sentencias GRANT para su usuario restringido. Reemplace 'mydatabase', 'myuser' y 'myhost' con información específica para su base de datos.
Tenga en cuenta que las comillas que rodean a miusuario y micontraseña son dos comillas simples, no dobles. Los caracteres que rodean a myhost y ,TABLE_NAME, son acentos graves (la tecla se encuentra debajo de la tecla de escape en su teclado).
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON mydatabase.`', TABLE_NAME, '` to ''myuser''@`myhost`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mydatabase';
Por ejemplo, si quisiera conectar al usuario 'chartio_read_only' a su base de datos de 'Informes' usando el cliente chartio_connect, ejecutaría lo siguiente:
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON Reports.`', TABLE_NAME, '` to ''chartio_read_only''@`localhost`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Reports';
Si quisiera conectar al usuario 'chartio_direct_connect' a su base de datos 'Analytics' mediante una conexión directa desde los servidores de Chartio, ejecutaría lo siguiente:
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON Analytics.`', TABLE_NAME, '` to ''chartio_direct_connect''@`52.6.1.1`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Analytics';
-
La consulta debería resultar similar a lo siguiente:
GRANT SELECT, SHOW VIEW ON mydatabase.`Activity` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Marketing` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Operations` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Payments` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Plans` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Services` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Subscriptions` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Users` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Visitors` to 'myuser'@`myhost`;
-
Seleccione las declaraciones solo para las tablas a las que le gustaría otorgar acceso y ejecute esas consultas. Por ejemplo, si solo quisiéramos otorgar acceso a la tabla Usuarios y Visitantes ejecutaríamos:
GRANT SELECT, SHOW VIEW ON mydatabase.`Users` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Visitors` to 'myuser'@`myhost`;
-
Proporcione al usuario una contraseña segura.
SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
o
SET PASSWORD FOR 'chartio_direct_connect'@`52.6.1.1` = PASSWORD('top$secret');
Ahora puede acceder de forma segura a su base de datos con este usuario y estar seguro de que solo tiene permisos para las tablas especificadas.
Otorgando permisos de nivel de columna
El procedimiento para otorgar permisos a nivel de columna en una tabla específica es muy similar a otorgar permisos a nivel de tabla.
-
Genere las instrucciones GRANT para los permisos de nivel de columna utilizando la siguiente consulta:
SELECTCONCAT('GRANT SELECT (`', COLUMN_NAME, '`), SHOW VIEW ON mydatabase.`', TABLE_NAME, '` to ''myuser''@`myhost`;') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'mydatabase' AND TABLE_NAME = 'mytable';
Por ejemplo, si quisiera conectar el usuario 'chartio_read_only' a columnas específicas en la tabla 'Usuarios' de la base de datos 'Informes' utilizando el cliente chartio_connect, ejecutaría lo siguiente:
SELECTCONCAT('GRANT SELECT (`', COLUMN_NAME, '`), SHOW VIEW ON Reports.`', TABLE_NAME, '` to ''chartio_read_only''@`localhost`;') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'Reports' AND TABLE_NAME = 'Users';
-
La consulta debería dar como resultado algo similar a lo siguiente:
GRANT SELECT (`User_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Campaign_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Created_Date`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Company`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`City`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`State`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Zip`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Phone_Number`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Credit_Card`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`;
-
Seleccione solo las declaraciones para las columnas a las que le gustaría otorgar acceso y ejecute esas consultas. Por ejemplo, si solo quisiéramos otorgar acceso a las columnas 'User_ID' y 'Company', ejecutaríamos:
GRANT SELECT (`User_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Company`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`;
-
Proporcione al usuario una contraseña segura.
SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
Para más información consulte la documentación de MySQL.