4.2 Règles de sécurité et droits d'accès au serveur MySQL
4 Administration du serveur
Manuel de Référence MySQL 4.1 : Version Française
->Instructions générales de sécurité . Comment protéger MySQL contre les pirates . Options de démarrage qui concernent la sécurité . Problèmes de sécurité avec LOAD DATA LOCAL . Rôle du système de privilèges . Comment fonctionne le système de droits . Droits fournis par MySQL . Se connecter au serveur MySQL . Contrôle d'accès, étape 1 : Vérification de la connexion . Contrôle d'accès, étape 2 : Vérification de la requête . Causes des erreurs Access denied
|
4.2.1 Instructions générales de sécurité Tous ceux qui utilisent MySQL avec un serveur connecté à l'internet
doivent lire cette section, pour éviter les erreurs de sécurité les plus
courantes.
En parlant de sécurité, nous mettons l'accent sur la nécessité de protéger
la totalité du serveur (et non pas seulement le serveur MySQL), contre
tous les types d'attaques possibles : cheval de troye, virus, dénis de services,
écoute électronique. Nous ne couvrirons pas la totalité des aspects et des
pannes ici.
MySQL utilise un système de sécurité basé sur les listes de
contrôle d'accès (Access Control Lists; ACLs) pour toutes les
connexions, requêtes et autres opérations qu'un utilisateur peut
tenter d'exécuter. Il y a aussi le support des connexions chiffrées
par mode SSL, entre le client et le serveur. De nombreux concepts
sont présentés ici, et ne sont pas spécifiques à MySQL. Les mêmes
concepts s'appliquent à de nombreuses applications.
Lorsque vous faîtes fonctionner MySQL, suivez ces règles le plus
souvent possible :
-
Ne jamais donner à quiconque (hormis l'utilisateur mysql root) l'accès
à la table
user
dans la base
mysql
!
Cette table est primordiale.
Le mot de passe chiffré stocké dans la table est le véritable mot de passe
MySQL
.
Quiconque connaît le mot de passe stocké dans la table
user
et
a accès à la liste des hôtes d'un compte
peut facilement se
connecter avec cet utilisateur
.
-
Connaissez à fond le système de droits de MySQL. Les commandes
GRANT
et
REVOKE
sont utilisées pour contrôler les accès à MySQL. Ne donnez pas
plus de droits que nécessaire. Ne donnez jamais des droits à tous les hôtes. Liste de points à vérifier :
-
Essayez
mysql -u root
. Si vous êtes capable de vous connecter avec
succès au serveur sans qu'un mot de passe n'ai été demandé, vous avez un
problème. Toute personne peut se connecter au serveur MySQL en tant qu'utilisateur
root
avec tous les droits !
Passez en revue votre installation MySQL, en faisant attention aux mots
de passe
root
.
-
Utilisez la commande
SHOW GRANTS
et vérifiez qui a accès à quoi.
Supprimez les droits qui ne sont pas nécessaires avec la commande
REVOKE
.
-
Ne gardez par de mot de passe en clair dans vos tables. Lorsque votre
ordinateur est infiltré, l'intrus pourra alors obtenir la liste complète
des mots de passe, et les utiliser. Au lieu de cela, utilisez les fonctions
MD5()
,
SHA1()
ou une autre fonction de hash.
-
Ne choisissez pas vos mots de passe dans un dictionnaire. Il y a des programmes
spéciaux qui sont capable de les casser. Même des mots de passe comme
``xfish98'' sont très faibles. Bien meilleur est
``duag98'' qui contient aussi le mot ``fish'' mais tapé avec une touche à gauche
sur le clavier standard QWERTY. Une autre méthode est d'utiliser ``Pfspeb'' qui
est un mot créé à partir des premières lettres de la phrase ``Papa fume sa pipe en bois''.
C'est un mot de passe facile à retenir, difficile à deviner pour une personne
qui ne le connaît pas.
-
Investissez dans un pare-feu. Cela vous protège de presque 50 % de tous les
types de trous de sécurité des logiciels. Placez MySQL derrière un pare-feu,
ou dans une zone démilitarisée (DMZ).Liste de points à vérifier :
-
Essayez de scanner vos ports depuis Internet, en utilisant des
outils comme
nmap
. MySQL utilise le port 3306 par défaut. Ce port
doit être inaccessible depuis des hôtes indus. Un autre moyen simple
de tester si votre port MySQL est accessible ou pas, est d'essayer
la commande suivante depuis une machine distante, où
server_host
est
l'hôte de votre serveur MySQL :
shell> telnet server_host 3306
|
Si vous obtenez une connexion et des caractères étranges, c'est que le
port est ouvert, et qu'il devrait être fermé par votre routeur ou votre
pare-feu, à moins que vous n'ayez une bonne raison de le garder ouvert.
Si
telnet
attend ou que la connexion est refusée, c'est que tout
est bon : le port est bloqué.
-
Ne faites jamais aucune confiance aux données des utilisateurs. Ils peuvent
essayer de nombreux trucs pour vous envoyer du code spécial ou faire
passer des séquences de caractères protégés via des formulaires web, ou
n'importe quel outil que votre application utilise. Soyez certain que
votre application reste sécurisée même si un utilisateur obtient du code
comme ``
; DROP DATABASE mysql;
''. Ceci est un exemple extrême, mais
de grosse fuites de données ou des pertes peuvent survenir si un pirate
utilise des techniques similaires, et que vous n'êtes pas préparé pour.
Vérifiez aussi toutes les données numériques. Une erreur commune est de
protéger uniquement les chaînes. Certains pensent que si une base contient
des données publiques, elle ne doit pas être protégée. C'est totalement
faux. Au minimum, un attaque en dénis de service peut être pratiquée sur
ces bases. Le plus simple moyen pour vous protéger contre ce type d'attaque
est d'utiliser des apostrophes autour des constantes numériques :
SELECT * FROM table WHERE ID='234'
plutôt que
SELECT * FROM table WHERE ID=234
.
MySQL convertit automatiquement la chaîne en nombre et supprime tous les caractères
non numériques avant insertion.
Point à vérifier :
-
Toutes les applications web :
-
Essayez d'entrer des guillemets
'''
et
'"'
dans tous vos formulaires
web. Si vous obtenez une erreur MySQL, alors étudiez le problème immédiatement.
-
Essayez de modifier toute URL dynamique en ajoutant les codes
%22
(
'"'
),
%23
(
'#'
) et
%27
(
'''
) dedans.
-
Essayez de modifier les types de données des URL dynamiques, de numérique
en chaîne, grâce aux exemples ci-dessus. Votre application doit être
sécurisée contre ce type d'attaques.
-
Essayez d'entrer des caractères comme des espaces ou des symboles spéciaux
au lieu des nombres, dans les champs numériques. Votre application doit les supprimer
avant de le passer à MySQL, ou votre application doit générer une erreur.
Passer des valeurs non vérifiées à MySQL est très dangereux.
-
Vérifiez la taille des données avant de les passer à MySQL.
-
Donnez un autre nom d'utilisateur et un autre mot de passe à votre
application que votre nom d'utilisateur d'administration. Ne donnez pas
à votre application plus de droits que nécessaire.
-
Utilisateurs de PHP :
- Etudiez la fonction
addslashes()
.
Depuis PHP 4.0.3, la fonction
mysql_escape_string()
est disponible
avec la même fonctionnalité que son alter ego en API MySQL C.
-
Utilisateurs de l'API MySQL C :
- Vérifiez les appels à
mysql_real_escape_string()
.
-
Utilisateurs de MySQL++ :
- Vérifiez les options
escape
et
quote
des requêtes.
-
Utilisateurs Perl DBI :
- Vérifiez la méthode
quote()
ou utilisez des variables liées.
-
Utilisateurs de Java JDBC :
- Utilisez l'objet
PreparedStatement
et les variables liées.
-
Ne transmettez aucunes données non chiffrées via Internet. Ces données peuvent
être accessibles à quiconque a le temps et la capacité d'intercepter des données
et de les utiliser pour son propre usage. Au lieu de cela, utilisez un protocole
chiffré tel que SSL ou SSH. MySQL supporte les connexions SSL en interne, depuis
la version 4.0.0.
Le forward de port de SSH peut être utilisé pour créer un tunnel chiffré et
compressé pour les communications.
-
Apprenez à utiliser les utilitaires
tcpdump
et
strings
. Pour la plupart
des cas, vous pouvez vérifier si les flux de données MySQL sont chiffrés
en utilisant une commande telle que celle ci :
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
|
(Cela fonctionne sous Linux et devrait aussi fonctionner sous les autres
systèmes avec de légères adaptations). Attention : si vous ne voyez pas
de données, cela ne signifie pas que vous avez des données chiffrées.
Si vous avez besoin de forte sécurité, vous devriez consulter un
expert de la sécurité.
|