Services webmasters
Partenaires
Jeux concours gratuits
 
Administration du serveur
<<<
Instructions générales de sécurité Comment protéger MySQL contre les pirates
>>>

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é.

<< Instructions générales de sécurité >>
Administration du serveur Règles de sécurité et droits d'accès au serveur MySQL Comment protéger MySQL contre les pirates
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -