MAX_USER_CONNECTIONS 2;
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 33/69 - Bertrand LIAUDET
Précisions – 1 : PT 1
La notion de privilège est identique à celle de droit.
Standard SQL
La gestion des privilèges MySQL suit en partie la norme SQL.
Il lui manque la gestion des rôles qu’on trouve sous ORACLE (un rôle est une sorte d’utilisateur abstrait avec des droits. Un utilisateur concret peut alors avoir certains rôles).
Elle distingue les utilisateurs selon leur hôte : la machine d’où ils se connectent.
Effectivité des privilèges
Les privilèges de niveau utilisateur seront effectifs immédiatement pour toute nouvelle connexion mais ne sont pas effectifs pour les connexions en cours.
Les privilèges de niveau BD seront effectifs immédiatement pour toute nouvelle utilisation d’une BD (use database) mais ne sont pas effectifs pour la BD en cours d’utilisation.
Les privilèges de niveau tables et colonnes seront effectifs immédiatement pour toute nouvelle utilisation de la table et de la colonne.
Précisions – 2 : Donner des privilèges : GRANT … ON … TO Syntaxe simplifiée
GRANT privilege [,privilege] ON composant TO user[@host]
[IDENTIFIED BY motDePasse] [WITH GRANT OPTION]
Syntaxe complète
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count]]
Création d’utilisateur avec GRANT
Le GRANT s’applique à un utilisateur existant déjà. S’il n’existe pas, le GRANT fait office de CREATE USER. C’est à cela que sert le IDENTIFIED BY…
Tous les privilèges
Mot clé : ALL ou ALL PRIVILEGES à la place d’une liste de privilèges particuliers.
Exemples
Création d’un utilisateur avec tous les droits :
mysql> GRANT ALL PRIVILEGES ON *.* TO admin2@localhost IDENTIFIED BY 'mdpAdmin' WITH GRANT OPTION;
Donner des droits de consultation sur certaines colonnes :
mysql> GRANT SELECT (ne, nom) ON empdept.emp TO toto@’%’;
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 35/69 - Bertrand LIAUDET
Précisions – 3 : Consulter les privileges : SHOW GRANTS FOR Syntaxe
SHOW GRANTS [FOR user];
Exemple
Consultation des droits d’un utilisateur: pour pouvoir voir les privilèges, il faut avoir l’accès à la BD mysql.
mysql> SHOW GRANTS FOR admin2@'localhost';
+---+
| Grants for admin2@localhost |
+---+
| GRANT ALL PRIVILEGES ON *.* TO 'admin2'@'localhost' IDENTIFIED BY PASSWORD '*65D70AAC97E173AC4521B06CED3F332D9CB6E2E4' WITH
GRANT OPTION |
+---+
1 row in set (0.00 sec)
Consultation de ses propres droits : tout utilisateur, quels que soient ses droits, peut les consulter mysql> SHOW GRANTS;
Précisions - 4 : Retirer des privileges : REVOKE … ON … FROM … Syntaxe simplifiée
REVOKE privilege [,privilege] ON composant FROM user[@host]
Syntaxe complète n°1
REVOKE privilege [(column_list)] [* , privilege [(column_list)]]
ON [composant] priv_level FROM user[@host] [*, user[@host]] Syntaxe complète n°2
Pour supprimer tous les droits et le GRANT OPTION
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user[@host] [*,
user[@host]] Exemples
➢ Suppression d’un droit
mysql> REVOKE select (nom) on empdept.emp from toto@’%’;
➢ Suppression de tous les droits sauf le grant option:
mysql> REVOKE all on *.* from admin2@localhost;
➢ Suppression du droit de grant :
mysql> REVOKE grant option on *.* from admin2@localhost;
➢ Suppression de tous les droits et du grant option :
mysql> revoke all, grant option from admin2@localhost;
A noter qu’il n’y a plus de « on *.* » Transitivité du grant option
Sous Oracle, si un utilisateur u1 donne des droits à un utilisateur u2 sur une BD1, que l’utilisateur u2 donne des droit à u3 sur BD1 et que finalement u1 retire les droits à u2 sur BD1, alors, automatiquement, u3 perd ses droits sur BD1. Ce n’est pas le cas avec MySQL.
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 37/69 - Bertrand LIAUDET
Précisions - 5 : Limiter les ressources des comptes
http://dev.mysql.com/doc/refman/5.0/fr/user-resources.html Limiter les ressources globalement
Variable système :
• max_connections : vaut 100 par défaut.
• max_user_connections. Vaut 0 par défaut (il n’y a alors pas de limites).
Limiter les ressources d’un utilisateur
Il y a 4 possibilités de limitation des ressources au niveau des droits :
• Nombre de connexions
• Nombre de connexions par heure
• Nombre de requête par heure
• Nombre de modifications par heure
Ce sont des privilèges client de niveau user (globaux).
Ils mettent à jour les attributs max_user_connections, max_connections (par heure) max_questions et max_updates dans mysql.user.
Exemples
➢ Création des limites
mysql> GRANT USAGE ON *.* TO 'toto'@'localhost' WITH MAX_QUERIES_PER_HOUR 20
MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;
Les types de limite peuvent être appelés dans n'importe quel ordre.
Si la commande GRANT n'a pas de clause WITH, les limites valent alors 0, c'est à dire qu'il n'y a pas de limite.
➢ Modification de limites
mysql> GRANT USAGE ON *.* TO 'toto'@'%' WITH MAX_QUERIES_PER_HOUR 100;
➢ Suppression de limites
Pour supprimer une limite existante, on lui donne la valeur 0.
mysql> GRANT USAGE ON *.* TO 'toto'@'%' WITH MAX_QUERIES_PER_HOUR 0;
Le compteur d'utilisation des ressources se met en marche dès que la limite n'est pas nulle.
Remise à zéro des comptes
L’administrateur peut remettre les compteurs à zéro pour tous les comptes (ce n’est pas la même chose que d’annuler les limites !)
mysql> flush user_resources;
ou bien
mysql> flush privileges ; ou bien
shell> mysqladmin reload ;
Pour remettre à zéro les compteurs d’un seul compte, il suffit de refaire un grant usage en redonnant la valeur des limites.
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 39/69 - Bertrand LIAUDET
Organisation des privilèges
2 CLASSES de privilèges : serveur et client
Les classes de privilèges concernent les utilisateurs des privilèges :
• Les privilèges serveur : concernent l’administrateur et les développeurs d’applications.
• Les privilèges client : concernent les applications.
4 NIVEAUX de privilèges : user, BD, table, attribut
Les niveaux de privilèges concernent l’objet de la BD qui porte le privilège.
On distingue 4 niveaux hiérarchiques d’intervention : utilisateur, BD, table et attribut.
Niveau 1 : utilisateur ( = global)
Les droits globaux s'appliquent à un utilisateur.
Ils concernent toutes les bases de données d'un serveur.
Ces droits sont stockés dans la table mysql.user.
Niveau 2 : BD
Les droits de niveau BD s'appliquent à toutes les tables d'une base de données.
Ces droits sont stockés dans la table mysql.db Niveau 3 : table et procédure
Les droits de niveau table s'appliquent à toutes les colonnes et à tous les tuples d'une table.
Les droits de niveau procédure s’appliquent aux procédures d’une BD.
Ces droits sont stockés dans la table mysql.tables_priv et mysql.procs_priv.
Il s’agit essentiellement de DELETE, CREATE, ALTER, DROP Niveau 4 : colonne
Les droits de niveau colonne s'appliquent à certaines colonnes et certains tuples d’une table.
Ces droits sont stockés dans la table mysql.columns_priv.
Il s’agit de INSERT, UPDATE et SELECT.
Héritage des privilèges
Un privilège de niveau N est transmis au niveau N+1 (inférieurs) : un privilège de niveau « user » (1) existe au niveau « colonne » (4)
Liste des privilèges : SHOW PRIVILEGES
Nom Classe Niveau Principe
ALL [PRIVILEGES] Serveur 1 : User Tous les privilèges, sauf WITH GRANT OPTION CREATE USER Serveur 1 : User Autorise l'utilisation de CREATE USER
PROCESS Serveur 1 : User Autorise l'utilisation de SHOW FULL ROCESSLIST.
RELOAD Serveur 1 : User Autorise l'utilisation de FLUSH.
SHUTDOWN Serveur 1 : User Autorise l'utilisation de mysqladmin shutdown.
SUPER Serveur 1 : User Autorise une connexion unique même si max_connections est atteint, et l'exécution des commandes CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS et ET GLOBAL.
USAGE Serveur 1 : User Pour créer un utilisateur sans droits.
FILE Client 1 : User Autorise l'utilisation de SELECT ... INTO OUTFILE et LOAD DATA INFILE.
SHOW DATABASES Client 1 : User Autorise l'utilisation de SHOW DATABASES.
Nom Classe Niveau Principe
CREATE ROUTINE Serveur 2 : BD Autorise l'utilisation de CREATE ROUTINE
LOCK TABLES Serveur 2: BD Autorise l'utilisation de LOCK TABLES sur les tables pour lesquelles l'utilisateur a les droits de SELECT.
Nom Classe Niveau Principe
ALTER Serveur 3 : Table Modification (tous les ALTER possibles) CREATE Client 3 : Table Autorise l'utilisation de CREATE.
CREATE VIEW Client 3 : Table Autorise l'utilisation de CREATE VIEW.
DELETE Client 3 : Table Autorise l'utilisation de DELETE.
DROP Serveur 3 : Table Destruction de bases ou de tables
INDEX Serveur 3 : Table Création ou suppression d’index sur une table SHOW VIEW Client 3 : Table Autorise l'utilisation de SHOW CREATE VIEW GRANT OPTION Serveur 3 : Table
et proc Autorise l’utilisation de GRANT
Nom Classe Niveau Principe
ALTER ROUTINE Client 3 : Proc Autorise l'utilisation de ALTER ROUTINE
EXECUTE Client 3 : Proc Autorise l'utilisateur à exécuter des procédures stockées (pour MySQL 5.0).
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 41/69 - Bertrand LIAUDET
Les principaux privilèges sont les suivants :
Nom Classe Niveau Droit
USAGE Serveur 1 : User Pour créer un utilisateur sans droits.
ALL [PRIVILEGES] Serveur 1 : User Tous les privilèges, sauf WITH GRANT OPTION WITH GRANT OPTION Serveur 1 : User Autorise l’utilisation de GRANT
Nom Classe Niveau Droit
CREATE Serveur 2 : BD, Table Création (toutes les créations possible) DROP Serveur 2 : BD, Table Destruction de bases ou de tables ALTER Serveur 3 : Table Autorise l'utilisation de ALTER.
Nom Classe Niveau Droit
SHOW DATABASES Client 1 : User Autorise l'utilisation de SHOW DATABASES.
SELECT Client Tuples Autorise l'utilisation de SELECT.
INSERT Client Tuples Autorise l'utilisation de INSERT.
UPDATE Client Tuples Autorise l'utilisation de UPDATE.
DELETE Client Tuples Autorise l'utilisation de DELETE.
Création de rôles sous MySQL
Définition d’un rôle
Un rôle est un profil type d’utilisateur qu’on peut ensuite affecter à un utilisateur.
Par exemple : lecteur, opérateur de saisie, administrateur du SI, etc.
MySQL ne permet pas de créer de rôle.
Solution MySQL : création d’utilisateur servant de modèle
Toutefois, on peut contourner cette impossibilité en créant des utilisateurs servant de modèle.
Ces utilisateurs seront créés sur « localhost » avec un mot de passe arbitraire.
Ces utilisateurs seront définis avec les autorisations souhaitées.
Application du modèle à un nouvel utilisateur
1) Créer un utilisateur avec son hôte et son mot de passe, sans droit.
2) Faire un SHOW GRANTS sur l’utilisateur servant de modèle 3) Appliquer les GRANT affichés à l’utilisateur qu’on a créé.
Cette séquence pourrait être écrite dans une procédure stockée.
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 43/69 - Bertrand LIAUDET
Les bases de données installées par défaut Bases de données préinstallées
mysql> show databases;
+---+
| Database | +---+
| information_schema |
| mysql |
| performance_schema |
| sys | +---+
4 rows in set (0.00 sec) Présentation
MySQL contient 4 bases de données par défaut pour gérer les données du SGBD (on dit aussi
« schema à la place de BD ».
Les BD mysql et la BD information schéma représentent le dictionnaire des données, c’est à dire des informations sur les bases de données et les utilisateurs.
La BD mysql est une première version du dictionnaire des données. On y trouve la table user.
https://dev.mysql.com/doc/refman/8.0/en/system-schema.html
La BD information_schema est le dictionnaire des données « moderne ».
https://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-transactions.html Les BD performance_schema et sys fournissent des informations de performance.
https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html https://dev.mysql.com/doc/refman/8.0/en/sys-schema.html
Le dictionnaire des données 1ère version : La BD mysql
La BD mysql (version 5.5) Présentation
C’est une base de donnée qui sert surtout à gérer :
• les utilisateurs et les droits.
• la définition des procédures et des fonctions.
On y trouve une table « user » avec les attributs « host » et « user »
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 45/69 - Bertrand LIAUDET
Graphe des tables de droits
La colonne vertébrale du graphe est : TABLE DB USER
COLUMN_PRIVS PROC_PRIVS
TABLE_PRIVS PROC
DB (user, host, bd)
USER(user, host) HOST(host, bd)
A noter que :
L’utilisateur est caractérisé par son nom d’utilisateur et son hôte. La BD appartient à un utilisateur. Elle fait donc référence à un utilisateur.
MySQL permet aussi de définir des droits pour une BD et pour un hôte donné, quel que soit l’utilisateur.
Liste des tables
On peut voir les tables de la BD mysql en faisant un show tables mysql> show tables from mysql;
+---+
| time_zone_leap_second | fuseaux horaires
| time_zone_name | vides par défaut
BASES DE DONNÉES – Utilisateurs – Droits - Dictionnaires - page 47/69 - Bertrand LIAUDET
Manipulation des tables de la BD mysql
Les tables de la BD mysql sont modifiées par :
▪ Les ordres DCL (data control language) : CREATE USER, RENAME USER, DROP USER, SET PASSWORD, GRANT, REVOKE.
▪ Des ordres DML (data manipulation language) : INSERT, UPDATE, DELETE travaillant directement dans les tables de la BD mysql. C’est utile pour faire des modifications de masse et résoudre certains problèmes particuliers non gérés par le DCL.
Travailler directement sur les tables de la BD mysql n’est pas recommandé !!!
C’est parfois utile pour faire des modifications particulières.
C’est nécessaire pour la table host qui n’est pas modifiable avec les ordres du DCL.
Actualisation de la BD mysql : flush privileges Recharger les tables de droits
Au démarrage, le serveur charge en mémoire vive l’ensemble de la BD mysql.
Les modifications effectuées par les ordres du DCL sont répercutées aussi en mémoire vive.
Les modifications effectuées directement dans la BD mysql par des ordres du DML ne sont pas répercutées en mémoire vive.
Pour actualiser la mémoire vive : mysql> flush privileges On peut aussi faire :
shell> mysqladmin flush-privileges ou
shell> mysqladmin reload
Précisions – 1 : Précisions sur le contenu des tables de droit