Lorsque vous créez un compte dans la console ApsaraDB RDS, vous pouvez lui accorder des autorisations sur des bases de données entières. Pour restreindre un compte à des tables, des vues ou des champs spécifiques, exécutez directement des instructions SQL sur l'instance afin d'appliquer une autorisation granulaire.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un compte privilégié. Pour obtenir des instructions, consultez la rubrique Créer un compte.
Fonctionnement
L'autorisation granulaire dans MySQL repose sur des privilèges hiérarchisés. Chaque niveau étant indépendant, une autorisation complète nécessite généralement plusieurs instructions GRANT.
| Niveau | Syntaxe | Types de privilèges pris en charge |
|---|---|---|
| Global | ON *.* |
PROCESS, REPLICATION SLAVE, REPLICATION CLIENT et autres |
| Table | ON db.table |
ALL PRIVILEGES, SELECT, UPDATE, INSERT, DELETE et autres |
| Vue | ON db.view |
SELECT uniquement |
| Colonne | ON TABLE table (col) |
SELECT, UPDATE et autres |
Les comptes créés via cette procédure ne peuvent pas afficher leurs bases de données autorisées dans la console ApsaraDB RDS. Pour rendre une base de données visible dans la console, utilisez un nom de table générique ( * ) au lieu d'un nom de table spécifique lors de l'attribution des autorisations sur les tables.
Accorder des autorisations sur les tables
Utilisez un compte privilégié pour vous connecter à l'instance RDS, puis exécutez les instructions SQL suivantes.
Étape 1 : Créez un compte.
CREATE USER `<username>`@`%` IDENTIFIED BY '<password>';
Étape 2 : Accordez des autorisations globales.
GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<username>'@'%';
Étape 3 : Accordez toutes les autorisations sur une table spécifique.
GRANT ALL PRIVILEGES ON `<database>`.`<table>` TO '<username>'@'%';
Remplacez<table>par*pour accorder l'accès à toutes les tables de la base de données. Cela permet également au compte d'afficher la base de données dans la console ApsaraDB RDS.
Étape 4 : Accordez des autorisations en lecture seule sur les tables système mysql couramment utilisées.
GRANT SELECT ON `mysql`.`help_topic` TO '<username>'@'%';
GRANT SELECT ON `mysql`.`func` TO '<username>'@'%';
GRANT SELECT ON `mysql`.`time_zone` TO '<username>'@'%';
GRANT SELECT ON `mysql`.`slow_log` TO '<username>'@'%';
GRANT SELECT ON `mysql`.`proc` TO '<username>'@'%';
GRANT SELECT ON `mysql`.`general_log` TO '<username>'@'%';
-- Grant permissions on other system tables based on your requirements.
Exemples
Autoriser un compte à gérer une table
Créez le compte test01 avec un accès complet à la table test100 dans la base de données rds001.
CREATE USER `test01`@`%` IDENTIFIED BY 'passwd';
GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test01'@'%';
GRANT ALL PRIVILEGES ON `rds001`.`test100` TO 'test01'@'%';
GRANT SELECT ON `mysql`.`help_topic` TO 'test01'@'%';
GRANT SELECT ON `mysql`.`func` TO 'test01'@'%';
Autoriser un compte à gérer plusieurs tables
Créez le compte test02 avec un accès complet aux tables test100, test200 et test300 dans la base de données rds001.
CREATE USER `test02`@`%` IDENTIFIED BY 'passwd';
GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test02'@'%';
GRANT ALL PRIVILEGES ON `rds001`.`test100` TO 'test02'@'%';
GRANT ALL PRIVILEGES ON `rds001`.`test200` TO 'test02'@'%';
GRANT ALL PRIVILEGES ON `rds001`.`test300` TO 'test02'@'%';
GRANT SELECT ON `mysql`.`help_topic` TO 'test02'@'%';
GRANT SELECT ON `mysql`.`func` TO 'test02'@'%';
Accorder des autorisations sur les vues
Le privilège SELECT est le seul type de privilège que vous pouvez accorder au niveau d'une vue.
GRANT SELECT ON <database>.<view> TO <username>;
Exemples
Autoriser un compte à interroger une vue
GRANT SELECT ON rds001.view_test1 TO test01;
Autoriser un compte à interroger plusieurs vues
GRANT SELECT ON rds001.view_test1 TO test01;
GRANT SELECT ON rds001.view_test2 TO test01;
Accorder des autorisations sur les champs
Les autorisations au niveau des colonnes limitent l'accès à des champs spécifiques au sein d'une table. Chaque type de privilège doit être suivi du nom de la colonne entre parenthèses.
GRANT UPDATE (<field>) ON TABLE <table> TO <username>; -- Authorize updates to a field.
GRANT SELECT (<field>) ON TABLE <table> TO <username>; -- Authorize queries on a field.
Exemples
Autoriser un compte à mettre à jour un champ
GRANT UPDATE (testid) ON TABLE testtable TO test01;
Autoriser un compte à mettre à jour plusieurs champs
GRANT UPDATE (test_id) ON TABLE testtable TO test01;
GRANT UPDATE (test_name) ON TABLE testtable TO test01;
Alternative : utiliser Data Management (DMS)
Exécutez les mêmes instructions SQL dans Data Management (DMS) plutôt que via un client ou la CLI.
FAQ
J'obtiens l'erreur « Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation » lors de l'exécution des instructions SQL. Que dois-je faire ?
Le compte utilisé ne dispose pas du privilège CREATE USER. Utilisez le compte privilégié pour exécuter les instructions, ou accordez d'abord ce privilège à votre compte actuel :
GRANT CREATE USER ON *.* TO 'your_user'@'host';
FLUSH PRIVILEGES;