Mysql:GRANT

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Commande SQL MySQL (gestion des droits)
Voir aussi Mysql:show · Mysql

GRANT est la commande SQL utilisée pour attribuer des privilèges à un utilisateur MySQL/MariaDB sur une base, une table, ou globalement (*.*). Elle se combine avec CREATE USER (création du compte) et REVOKE (retrait de privilèges).

Syntaxe

CREATE USER 'utilisateur'@'hôte' IDENTIFIED BY 'mot_de_passe';
GRANT privilège [, privilège...] ON base.table TO 'utilisateur'@'hôte';
REVOKE privilège ON base.table FROM 'utilisateur'@'hôte';
SHOW GRANTS FOR 'utilisateur'@'hôte';
FLUSH PRIVILEGES;

hôte peut être localhost (connexion locale uniquement), une IP précise, ou % (n'importe quel hôte — à réserver aux cas où c'est réellement nécessaire).

Depuis MySQL 5.7 / MariaDB 10.2, combiner création de compte et attribution de droits en une seule commande (GRANT ... IDENTIFIED BY) est déprécié : il est recommandé de séparer CREATE USER puis GRANT (à vérifier selon la version exacte du serveur).

Exemples

Créer un utilisateur applicatif dédié à une base

CREATE USER 'appuser'@'%' IDENTIFIED BY 'mot_de_passe';
GRANT ALL PRIVILEGES ON nom_base.* TO 'appuser'@'%';
FLUSH PRIVILEGES;

Compte de supervision (lecture seule)

Un outil de monitoring (Nagios, Cacti…) n'a besoin que de droits de lecture et de visibilité sur les process, jamais de droits d'écriture :

CREATE USER 'monitoring'@'ip_serveur_supervision' IDENTIFIED BY 'mot_de_passe';
GRANT USAGE ON *.* TO 'monitoring'@'ip_serveur_supervision';
GRANT PROCESS ON *.* TO 'monitoring'@'localhost';
GRANT SELECT ON *.* TO 'monitoring'@'localhost';

Compte root distant restreint

CREATE USER 'root'@'ip_admin' IDENTIFIED BY 'mot_de_passe_complexe';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip_admin' WITH GRANT OPTION;

Compte en lecture seule sur une table

CREATE USER 'lecteur'@'ip_client' IDENTIFIED BY 'mot_de_passe';
GRANT SELECT ON nom_base.nom_table TO 'lecteur'@'ip_client';

Changer le mot de passe root directement en base (ancienne méthode)

UPDATE mysql.user SET password = PASSWORD('nouveau_mot_de_passe') WHERE User = 'root';
FLUSH PRIVILEGES;

Depuis MySQL 5.7.6 / MariaDB 10.1.20, la colonne password et la fonction PASSWORD() sont dépréciées ; utiliser plutôt ALTER USER 'root'@'localhost' IDENTIFIED BY 'nouveau_mot_de_passe'; (à vérifier selon version).

Bonnes pratiques

  • Après une installation fraîche, supprimer les comptes par défaut inutiles (utilisateurs anonymes, comptes root accessibles à distance) et ne garder que les accès nécessaires.
  • Un compte dédié par application/usage plutôt qu'un compte root partagé — limite l'impact en cas de compromission.
  • Générer des mots de passe robustes (gestionnaire de mots de passe) plutôt que des valeurs faciles à deviner.
  • Toute modification directe des tables système (mysql.user) doit être suivie d'un FLUSH PRIVILEGES; pour être prise en compte.
  • Éviter 'utilisateur'@'%' (tout hôte) quand une IP ou un sous-réseau précis suffit.

Voir aussi

  • Mysql:showSHOW GRANTS, SHOW PROCESSLIST...
  • Mysql:mysql — se connecter en ligne de commande
  • Mysql — panorama général MySQL/MariaDB