MySQL est un des bases de données libres de référence. Au niveau sécurité, elle ne nécessite pas grandes modifications mais néanmoins fortement nécessaires.
Une base de données ne doit JAMAIS être visible depuis Internet. La protéger des attaques est extrêmement difficile si on la laisse visible. Si possible, synchronisez vos bases en rsync et non via un utilitaire qui vous obligerait à ouvrir une connexion réseau SQL en écoute.
Pour bloquer les accès distants à votre base, ouvrez le fichier /etc/mysql/my.cnf et éditez l’attribut bind-address
bind-address = 127.0.0.1
Il peut être judicieux dans un système d’informations immense de limiter le nombre de connexion simultanées à la base afin d’éviter que celle-ci croule sous le nombre de requêtes qu’elle subit. Utiliser la directive max_connections permettra d’obtenir ce résultat :
max_connections = 1024;
Vous pouvez tout aussi bien utiliser le firewall iptables pour limiter ces transactions et optimiser la bande passante, ceci dit je ne vous le recommande pas.
Si jamais votre base n’est pas bindée sur localhost mais sur 0.0.0.0 ou une adresse réseau, il faudra avoir des utilisateurs privilégiés sélectifs. Qu’entendons nous par là ? il s’agit d’utilisateur en provenance d’hôtes spécifiques et non autorisés ailleurs.
Lors de la création d’un utilisateur vous avez sûrement tapé la commande suivante:
CREATE USER 'machin' IDENTIFIED BY 'mdp';
Ceci créée un utilisateur machin qui peut être situé sur n’importe quelle machine dans le monde et donc est une faille très importante ! Pour spécifier l’hôte autorisé, précisez le nom DNS ou l’IP de la manière suivante :
CREATE USER 'machin'@'example.org' IDENTIFIED BY 'mdp';
et ainsi seul machin en provenance de la machine example.org pourra accéder à la base.
Comme dans tout Système d’Informations, un utilisateur a des droits sur quelque chose mais pas tout, seul le root le peut.
Pour donner des droits à une utilisateurs, il faut utiliser la commande GRANT suivie de la liste des autorisations et de l’utilisateur. Par exemple, pour donner le droit INSERT,DELETE à un utilisateur sur la base de données BDD entière :
GRANT INSERT,DELETE on bdd.* to 'machin'@'example.org';
On peut pousser plus loin, et c’est mieux, en autorisant uniquement sur une table :
GRANT INSERT,DELETE on bdd.table1 to 'machin'@'example.org';
Voire même un champ (pour la méthode UPDATE en revanche) :
GRANT UPDATE on BDD.table1.champ2 to 'machin'@'example.org';
Plus vous pousserez loin vos utilisateurs et plus vous en aurez pour tel ou tel type de transaction spécifique, moins vous aurez de risque d’être corrompu ou altéré lors d’une attaque.
PHPMyAdmin est un outil d’administration qui permet de simplifier nettement le travail SQL. Je vous déconseille fortement d’utiliser cette outil qui ajoute une faille de sécurité majeure sur vos bases de données.
Si aucun utilisateur classique n’a à avoir ce genre d’accès, ne l’installez pas et faites une formation SQL ou regardez les quelques tutoriaux présent sur notre site afin d’améliorer vos compétences. N’hésitez pas à rajouter un .htaccess en plus de l’authentification utilisateur de PHPMyAdmin afin d’améliorer la sécurité si vous ne souhaitez pas suivre notre conseil.