sql >> Base de Datos >  >> RDS >> Mysql

Otorgar permisos de tabla y columna de MySQL

Otorgando permisos a nivel de tabla

Puede crear un usuario con permisos de nivel de tabla en MySQL realizando lo siguiente:

  1. 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';
    
  2. 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';
    
  3. 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`;
    
  4. 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`;
    
  5. 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.

  1. 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';
    
  2. 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`;
    
  3. 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`;
    
  4. 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.