
Les programmes sont-ils déjà installés ?
|
|
$ mysql mysql> SHOW databases; mysql> USE test; mysql> SHOW tables; mysql> USE mysql; mysql> SHOW tables; mysql> SHOW columns FROM user; mysql> SELECT host, user, password FROM user; mysql>quit |
# # mysqladmin -u root password moi
Le mot de passe de l'administrateur "root" de mysql est maintenant moi.
# Variante : on peut utiliser le mode console, avec la fonction de cryptage PASSWORD(), spécifique à Mysql
mysql>SET PASSWORD FOR root= PASSWORD('moi');
Un bon mot de passe root doit comprendre entre 10 et 13 caractères, il est aussi intèressant de modifier son nom
en un autre nom anodin, histoire de compliquer la tâche d'éventuels pirates
update mysql set user='chef' where user='root';
flush privileges;
Et pour créer un compte root sans droit
grant usage on *.* to 'root'@'localhost';
ou le mot clé usage représente l'absence de droit d'utilisation, aucun accès aux tables et aux données
n'est autorisé
* # mysql --> access denied for user root@localhost
* Désormais, pour se connecter au serveur, il doit préciser son mot de passe interactivement
# mysql -u root -p
Enter password : moi (il n'apparait pas à l'écran)
Welcome to the MySQL monitor
......
* Le paramètre -u user est indispensable si l'utilisateur Mysql user qui veut se connecter, est différent du compte utilisateur actuellement connecté au système.
* Si le serveur Mysql est hébergé par une autre machine, il faut préciser son nom d'hôte après le paramètre -h
* Si on met juste le paramètre -p, le mot de passe est demandé interactivement, comme cela a été décrit ci-dessus.
Mais on peut le donner (attention en clair !) collé après -p, repreons l'exemple précédent :
# mysql -h machine -u root -pmoi
mysql>
* Par exemple l'utilisateur actuel du système veut se connecter sous le nom d'utilisateur Mysql jean, au serveur en exécution sur la machine appelée apache du domaine bahut.ac-creteil.fr
# mysql -h apache -u jean -p
Enter password : (il n'apparait pas à l'écran)
Welcome to the MySQL monitor
mysql>
* On précise le nom de cette base aussi dans la ligne de commande, généralement à la fin
* exemple 1 : root veut ouvrir la base d'administration système mysql (sous-entendu à la machine localhost) puis interroger la table user :
# mysql -u root -p mysql
Enter password : ...
Welcome to the MySQL monitor
......
mysql> SELECT host, user, password FROM user;
On observe alors le mot de passe de root crypté !
* exemple 2 : jean est l'administrateur de la base profs, avec le mot de passe jeannot et il veut la gérer à distance en mode console. Supposons que le serveur mysql soit hébergé par la machine nommée apache et que jean se connecte à partir de la machine nommée station1
Il examine ensuite la liste des tables de la base profs :
[jean@station1 jean]$ mysql -h apache -u jean -pjeannot profs
.............
mysql> SHOW TABLES;
* Il est vivement recommandé de le supprimer ... pas vraiment pour une question de sécurité car ses priviléges sont très limités, mais pour éviter des confusions liees à la procédure d'authentification ( voir détermination des priviléges).
Pour le supprimer, root se connecte à la base mysql, et supprime logiquement de la table des utilisateurs mysql.user les enregistrements ou le champ user est vide.
# mysql -p mysql
mysql> DELETE FROM user WHERE user='';
* Ré-examen de la table des utilisateurs : elle ne doit contenir que les lignes concernant root
# mysql -p mysql
mysql> select host, user, password from user ;
localhost root mot-de-passe-crypté
Pour repérer les comptes sans mot de passe, il suffit d'utiliser la requête suivante :
select * from mysql.user where password='';
Et pour les supprimer:
delete * from mysql.user where password='';
flush privileges;
* root crée une nouvelle base de données nommée essais et vérifie sa présence dans la liste des bases
# mysql -u root -p
mysql> CREATE DATABASE essais;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
* La nouvelle base essais sera install�e dans un répertoire qui porte son nom, c'est-à-dire ici /var/lib/mysql/essais.
Pour le moment ce répertoire créé est vide. Il porte les droits de propriété 700 pour l'utilisateur mysql.
* En mode console, root passe la commande sans recours (attention !)
mysql> DROP DATABASE essais;
Query OK, 0 row affected (0.00 sec)
* C'est le privilége de root de gérer les utilisateurs des bases de données, et de leur accorder les droits au niveau d'une base ou d'une table.
Les commandes GRANT et REVOKE permettent d'attribuer et de retirer des droits d'accés
Il est possible de préciser si l'utilisateur aura droit d'accés à la base seulement localement (clause TO user@localhost) ou est permise à distance (TO 'user@%').
* Syntaxe générale :
|
mysql> GRANT [ALL PRIVILEGES | liste de priviléges] ON [base.table | base.*] TO [user@localhost | 'user@%' | 'user@%.domaine'] IDENTIFIED BY "mot-de-passe"; * Quelques exemples Création du nouvel utilisateur toto, de mot de passe toto à qui on accorde tous les droits sur les tables de la base essais (il en sera l'administrateur) mysql> GRANT ALL PRIVILEGES ON essais.* TO toto@localhost IDENTIFIED BY "toto"; Création du nouvel utilisateur jean, de mot de passe jeannot à qui on accorde tous les droits sur toutes les bases mysql> GRANT ALL PRIVILEGES ON *.* TO 'jean@%' IDENTIFIED BY "jeannot"; L'utilisateur admin, de mot de passe admin est le gestionnaire de la base cdi. Il y aura tous les privil�ves et pourra se connecter à distance mysql> GRANT ALL PRIVILEGES ON cdi.* TO 'admin@%' IDENTIFIED BY "admin"; Le nouveau utilisateur public sur la machine locale aura droit complet d'administration sur les tables de la base magasin vérifier en consultant la table db de la base système mysql (par exemple avec phpMySql) mysql> GRANT ALL PRIVILEGES ON essais.* TO public@localhost; |
Pour créer la table carnet dans la base essais, il faut se connecter au serveur, et passer la commande :
mysql> CREATE TABLE essais.carnet (num int, nom varchar(30), email varchar(30) );
# On constate que 3 fichiers portant le nom de la table sont créés dans le répertoire de la base /var/lib/mysql/essais
Il en sera de même pour nouvelle table incluse dans cette base.
| carnet.MYD | contient les données (vide à la création) |
| carnet.MYI | contient la descripton des index |
| carnet.frm | décrit la structure de la table |
* L'utiitaire mysqladmin est spécialisé dans la gestion interne du serveur (mais aussi des bases et des utilisateurs)
Ainsi, pour arrêter le serveur : mysqladmin shutdown
* Pour connaitre la charge de travail du serveur et des statistiques, option status :
# mysqladmin -p status
Enter password :
Uptime: 4153 Treads: 1 Questions 76 ......
Uptime donne le nombre de secondes écoulées depuis le lancement du serveur mysqld, Threads le nombre de processus fils, c'est-à-dire à peu prés le nombre de connexions ouvertes par des clients
* Pour connaitre le détail de chaque connexion cliente, option processlist
# mysqladmin -p processlist
Enter password :
Id User Host db Command Time State Info
* A la place de commandes de sauvegardes classiques comme tar, il est bien préférable d'utiliser un outil spécialisé mysqldump, qui génére le source écrit en commandes SQL. La restauration consiste alors à éxecuter ce fichier de commandes.
* Cet utilitaire possède de nombreuses options : voir man mysqldump
* Pour sauvegarder le contenu de la base essais dans un fichier essais.sql, situé dans /home/mysql.svg
(l'option -p pour faire demander le mot de passe )
# mkdir /home/mysql.svg
$ mysqldump -p essais > /home/mysql.svg/essais.sql
$ less essais.sql
* Pour restaurer la base essais, si nécessaire procéder d'abord à sa (re)création, puis importer le fichier sauvegardé précédemment essais.sql, en entrée de la commande mysql. La ligne suivante va alors produire l'exécution des commandes SQL qu'il contient, et donc reconstituer les structures des tables et y réinsérer tous leurs enregistrements
# mysql -p essais < /home/mysql.svg/essais.sql
* Ici, le gestionnaire admin ne sauvegarde que les structures des tables (option -d), et place le résultat dans son rép.personnel.
$ mysqldump -u admin -p -d essais > ~/essais.sql
$ less /home/admin/essais.sql
* On peut sauvegarder séparément la structure et les données de chaque table de la base essais, dans un répertoire /home/mysql.svg Pour chaque table de la base essais, 2 fichiers sont générés. Ainsi carnet.sql et carnet.txt contiennent respectivement les commandes de création de la table carnet, et ses enregistrements.
# mysqldump -p essais -T /home/mysql.svg
# cd /home/mysql.svg ; ll
* L'utilitaire myisamchk est surtout utilisé pour retrouver l'intégrité d'une table endommagée. Il doit etre lancé pendant un arret du serveur, et il faut indiquer le chemin.
# myisamchk -d /var/lib/mysql/cdi/eleves
ISAM files: eleves
Data records : 150 Deteted blocks: 0
.........
* L'option -r défragmente le fichier si nécessaire (en cas de nombreux Deteted blocks)
# myisamchk -r cdi.eleves
Ils sont inclus dans les 5 tables de la base de données mysql, dont la gestion est le privilége de root.
L'administrateur général root est le seul à pouvoir y accéder (et il doit demeurer le seul !), c'est donc le seul
* à créer des utilisateurs (login, mot de passe)
* à les supprimer
* à fixer leur droits (on dit dans le contexte "priviléges") sur les bases, et à les modifier.
Ce qui ne signifie pas qu'il soit impossible de déléguer des taches d'administration de bases à d'autres utilisateurs.
# La table mysql.user contient la liste des comptes pouvant acceder au serveur et determine les droits au niveau serveur sur l'ensemble des bases. Elle est consultee lors de chaque demande de connexion (essentiellement par l'utilitaire mysql, et par la fonction PHP mysql_connect()). Voici la structure de cette table
| Attribut | Valeur | Signification |
|---|---|---|
| Host | La machine de laquelle on tente la connexion (host=localhost par défaut) | |
| User | nom de connexion de l'utilisateur | |
| Password | mot de passe mysql de l'utilisateur | |
| Select_priv | Y/N | droit de sélection |
| Insert_priv | Y/N | droit d'insertion |
| Update_priv | Y/N | droit de modification |
| Delete_priv | Y/N | droit de suppression |
| Index_priv | Y/N | Indexation |
| Alter_priv | Y/N | droit de modification (table, champ) |
| Create_priv | Y/N | droit de création |
| Drop_priv | Y/N | Suppression |
| Grant_priv | Y/N | Permission |
| Reload_priv | Y/N | Relancer mysql |
| Shutdown_priv | Y/N | Arreter mysql |
| Process_priv | Y/N | Processus |
| File_priv | Y/N | Lecture et écriture de fichiers (import/export) |
La table mysql.db contient les priviléges d'un utilisateur (autre que root) sur chaque base de données créée (donc pas la table mysql). Elle est consultée à chaque commande SQL de cet utilisateur portant sur les tables de cette base, pour examiner s'il a le droit le "privilége" de pouvoir utiliser cette commande. Voici la structure cette table :
| Attribut | Valeur | Signification |
|---|---|---|
| Host | machine de laquelle on tente la connexion | |
| Db | Base de données | |
| User | Utilisateur | |
| Select_priv | Y/N | droit select, de passer des commandes sql SELECT |
| Insert_priv | Y/N | droit insert, de passer des commandes INSERT |
| Update_priv | Y/N | droit update, de mise à jour des enregistrements d'une table |
| Delete_priv | Y/N | droit delete, d'effacement des enregistrements d'une table |
| Index_priv | Y/N | droit d'utiliser INDEX pour créer ou supprimer des index |
| Alter_priv | Y/N | droit alter, pour utiliser ALTER TABLE pour modifier la structure d'une table (ou la renommer) |
| Create_priv | Y/N | droit create, d'utiliser CREATE pour créer de nouvelles bases ou tables |
| Drop_priv | Y/N | droit drop, d'utiliser DROP pour supprimer une base existante (ou une table) |
| Grant_priv | Y/N | droit grant, attribue à d'autres utilisateurs Mysql les permissions que l'on possède |
Les tables mysql.tables_priv et mysql.columns_priv déterminent des droits plus précis des utilisateurs respectivement sur une table d'une base et sur un champ d'une table, dont on ne parlera pas ici.
Root peut tout-à-fait intervenir par requéte SQL dans la base mysql afin d'administrer les comptes
Exemple en mode moniteur mysql :
Il s'agit de créer un utilisateur jean, de mot de passe jeannot qui doit posséder tous les priviléges (uniquement) sur les tables de la base etablissement. Puis on change son mot de passe pour lapin
root passe les commandes SQL suivantes à la base système mysql
mysql>USE mysql
mysql>INSERT INTO user (host, user, password) VALUES ('localhost', 'jean', PASSWORD('jeannot') );
mysql>INSERT INTO db VALUES ('localhost', 'etablissement', 'jean', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y' );
mysql>UPDATE user SET password = PASSWORD('lapin') WHERE user='jean' ;
# Ou root peut utiliser les commandes GRANT et REVOKE déjà présentées.
mysql>USE mysql
mysql>GRANT ALL PRIVILEGES ON etablissement.* TO jean IDENTIFIED BY 'jeannot' ;
Comment le moteur Mysql utilise t-il les tables précédentes pour déterminer les réponses à des requêtes de connexion d'un utilisateur à une base, puis face à une requête SQL portant sur les tables de cette base ?
Pour plus de détail, consulter dans la doc, la page manuel_Privileges.html
# Le problème
Toto est l'administrateur de la base de données appelée films, située sur la machine appelée serveur.bahut.fr. Il souhaite la gérer à l'aide du moniteur mysql, mais à distance, à partir de n'importe quelle station du réseau de l'établissement (dont le nom de domaine est supposé bahut.fr).
Pour le moment, il n'est répertorié dans la table d'administration mysql.user que comme l'utilisateur local toto@localhost
Quelle commande root devra t-il passer ?
# root crée un nouvel utilisateur de nom toto et d'hôte %.bahut.fr
Le symbole % est ici un caractère générique qui signifie "toute station du domaine"
$ mysql -u root -p
.....
mysql> GRANT ALL PRIVILEGES
ON films.*
TO 'toto@%.bahut.fr'
IDENTIFIED BY "toto";
# toto teste son nouveau privilége à partir de la station pc12. Quelle question pose t-il ?
On suppose que le nom de machine bahut est connue (par fichier /etc/hosts ou DNS)
[toto@pc12 toto] $ mysql -h serveur -u toto -p films
Welcome ...
mysql> SELECT nom_realisateur, duree, annee
FROM realisateur, mesFilmsPreferes
WHERE titre LIKE '%titanic%
AND mesFilmsPreferes.num_film = realisateur.num_film ;
phpMyAdmin est un ensemble de scripts PHP permettant de gérer complétement ses bases de données par le truchement d'une interface WEB distante.
* Attention ! Par défaut l'accés à la gestion des bases par phpMyAdmin n'est pas protégé. Donc tout utilisateur peut lancer l'URL vers phpMyAdmin, et à travers cette interface agir comme root
Il faut donc placer rapidement dans le répertoire un processus d'authentification par mot de passe.
* Pour cela, il faut effectuer une petite modification du paramétrage dans le fichier de configuration config.inc.php.
(explications détaillées dans le fichier Documentation.html accessible sur la page d'accueil)
Choisir l'authentification par le serveur http. A l'utilisation, une boite d'authentification s'ouvrira pour saisir login et mot de passe de l'utilisateur mysql :
$cfgServers[$i]['auth_type'] = 'http'
$cfgServers[$i]['user'] = 'root'
$cfgServers[$i]['password'] = ''
# accés réseau
# Il faut préciser l'URL absolue du répertoire d'accueil des scripts PHP de Phpmyadmin sur le serveur WEB
A partir du paramétrage par défaut à l'installation
$cfg['PmaAbsoluteUri'] = 'http://127.0.01/phpMyAdmin-2.4.0/';
remplacer 127.0.0.1 par l'ip ou le nom DNS du serveur Web qui l'h�berge
# Il n'y a aucune raison que le serveur MYSQL que Phpmyadmin doit gérer, se trouve sur la meme machine (ce qui est le cas d'une installation "globale" réalisée par un portage du type EASYPHP sur machine Windows, pratique pour une premiére prise en main et un apprentissage des langages PHP et SQL), Dans le cas général, il faut donc remplacer 'localhost' sur cette ligne :
$cfgServers[$i]['host'] = 'nom_ou_ip_mysql'