Mysql
 sql >> Base de données >  >> RDS >> Mysql

Accorder des autorisations de table et de colonne MySQL

Accorder des autorisations au niveau de la table

Vous pouvez créer un utilisateur avec des autorisations au niveau de la table dans MySQL en procédant comme suit :

  1. Connectez-vous à MySQL en tant qu'utilisateur avec Create_user_priv et Grant_priv. Déterminez quels utilisateurs disposent de ces privilèges en exécutant la requête suivante. Votre utilisateur aura déjà besoin du privilège SELECT sur MySQL.user pour exécuter la requête.

    SELECT User, Host, Super_priv, Create_user_priv, Grant_priv from mysql.user WHERE Create_user_priv = 'Y' AND Grant_Priv = 'Y';
    
  2. Exécutez la requête suivante pour générer les instructions GRANT pour votre utilisateur restreint. Remplacez "mydatabase", "myuser" et "myhost" par des informations spécifiques à votre base de données.

    Notez que les guillemets entourant myuser et mypassword sont deux guillemets simples et non doubles. Les caractères entourant myhost et ,TABLE_NAME, sont des backticks (la touche se trouve sous la touche d'échappement de votre clavier).

    SELECT CONCAT('GRANT SELECT, SHOW VIEW ON mydatabase.`', TABLE_NAME, '` to ''myuser''@`myhost`;')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'mydatabase';
    

    Par exemple, si vous souhaitez connecter l'utilisateur "chartio_read_only" à votre base de données "Rapports" à l'aide du client chartio_connect, vous exécuterez ce qui suit :

    SELECT CONCAT('GRANT SELECT, SHOW VIEW ON Reports.`', TABLE_NAME, '` to ''chartio_read_only''@`localhost`;')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'Reports';
    

    Si vous vouliez connecter l'utilisateur "chartio_direct_connect" à votre base de données "Analytics" en utilisant une connexion directe depuis les serveurs de Chartio, vous exécuteriez ce qui suit :

    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 requête devrait donner un résultat semblable à celui-ci :

    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. Sélectionnez les instructions uniquement pour les tables auxquelles vous souhaitez accorder l'accès et exécutez ces requêtes. Par exemple, si nous voulions uniquement accorder l'accès à la table Utilisateurs et Visiteurs, nous exécuterions :

    GRANT SELECT, SHOW VIEW ON mydatabase.`Users` to 'myuser'@`myhost`;
    GRANT SELECT, SHOW VIEW ON mydatabase.`Visitors` to 'myuser'@`myhost`;
    
  5. Donnez à l'utilisateur un mot de passe sécurisé.

    SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
    

    ou

    SET PASSWORD FOR 'chartio_direct_connect'@`52.6.1.1` = PASSWORD('top$secret');
    

Vous pouvez désormais accéder en toute sécurité à votre base de données avec cet utilisateur et être assuré qu'il n'a des autorisations que sur les tables spécifiées.

Accorder des autorisations au niveau des colonnes

La procédure d'octroi d'autorisations au niveau des colonnes sur une table spécifique est très similaire à l'octroi d'autorisations au niveau de la table.

  1. Générez les instructions GRANT pour les autorisations au niveau des colonnes à l'aide de la requête suivante :

    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';
    

    Par exemple, si vous vouliez connecter l'utilisateur « chartio_read_only » à des colonnes spécifiques dans la table « Utilisateurs » de la base de données « Rapports » à l'aide du client chartio_connect, vous exécuteriez ce qui suit :

    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 requête devrait aboutir à quelque chose de similaire à ce qui suit :

    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. Sélectionnez uniquement les instructions pour les colonnes auxquelles vous souhaitez accorder l'accès et exécutez ces requêtes. Par exemple, si nous voulions uniquement accorder l'accès aux colonnes "User_ID" et "Company", nous exécuterions :

    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. Donnez à l'utilisateur un mot de passe sécurisé.

    SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
    

Pour plus d'informations, consultez la documentation MySQL.