Sécurité MySQL

   Forum PHP 2007
  22 Novembre 2007
Agenda
Pourquoi la sécurité est
importante
La gestion des droits
Les directives de
configuration
La sécurité sur le Web
Les...
Qui parle?
Damien Séguy
 Qui reçoit la lettre hebdo?

 Accompagnements
 des projets LAMP

 ‘Sécurité PHP 5 et MySQL’
 avec...
Les risques
Usurpation du compte root
Effacement des données
Modification de données
Divulgations de données
Ridicule...
Les vulnérabilités avérées

1) Insuffisance des tests de sécurité
2)Configuration par défaut
3) Pas de chiffrement des données...
Les droits par défaut
  Compte root, sans mot de passe
    Mettre un mot de passe

    Changer root en ‘chef ’?

  Les uti...
Configurations de
  la table user
 Utilisateur anonyme
   SELECT count(*) FROM users
   WHERE user=’’;

 Eviter les % dans ...
Le droit de FILE

  Exportation de données
  vers un fichier
  Importation de données
  depuis un fichier
  Importations de ...
Le droit de
  GRANT

Possibilité de donner ses
propres droits
Escalade dans les droits
  Compléments par échange
  dans le...
Configuration serveur



--skip-grant-tables
--old-password
--secure-auth
--skip-show-databases
Configuration serveur (2)


               --port=3306
               --skip-name-resolve
               --skip-networking
...
Configuration serveur (3)


--local-infile=0
--secure-file-priv
--chroot
--open-files-limit
--safe-user-create
--allow-suspico...
Configuration client


            --secure-auth
            --safe-updates
              aussi appelée :
              --i...
Limiter les consommations

Dans la table User
  Max_connections        +-----------------------+------+
                  ...
Construction dynamique de la requête SQL
             Injections SQL
$requete = “SELECT COUNT(*) FROM users
WHERE login=’q...
Formes d’injections

Suppression de clause WHERE
  WHERE login = '' or 1 or ''

Sous-requête
  WHERE id=(SELECT BENCHMARK(...
Caractères spéciaux
    de MySQL
   ‘ et “ : délimiteur de chaîne
   () : sous-requêtes
   % et _ : regex avec LIKE
   REG...
Protections

Protection des caractères
  Appelé échappement (barbarisme)
  en PHP : mysqli_real_escape_string() ET délimit...
Protections

Commandes préparées
  Préparation de la commande
  Affectation des variables
  Exécution de la commande
/* Préparation de la commande d'insertion */
$query = quot;INSERT INTO ma_ville (Nom, Pays, Region)
          VALUES (?,?,...
Protections

   Procédures stockées
    $sql = quot;CALL ma_proc('quot;.$_GET['id'].quot;');

   Variables MySQL
     Plus...
Les portes
 dérobées
Les logs
(binaire, lent, général)
SHOW PROCESSLIST
SHOW CREATE TABLE
Le dossier de données
Les sauveg...
Autres outils

          Jetez ce qui ne sert pas
          Chiffrez les données
          Empoisonnez vos données
        ...
Vers des standards
   de sécurité?
  Sarbanes-Oxley, SOX
  Health Insurance
  Portability and
  Accountability Act
  (HIPA...
Norme PCI (traduction libre)

1. Entretenir un fire-wall pour protéger les données
2. Ne pas utiliser les valeurs par défa...
http://www.nexen.net/
    conferences.php
damien.seguy@nexen.net
Prochain SlideShare
Chargement dans…5
×

Sécurité MySQL

3 747 vues

Publié le

La sécurité des bases de données est une condition critique à leur exploitation. Effacement, falsification ou simplement divulgation sont les menaces les plus sérieuses qui rôdent et attendent le premier faux-pas des administrateurs. Il est primordial de bien connaître les aspects sécurité de MySQL, et de faire des choix éclairés parmi les protections natives.Durant cette présentation nous examinerons le système de droits, les directives de configurations, les techniques d'intrusion et les vulnérabilités sur le Web : pour chaque menace, nous verrons quels sont les défenses disponibles pour se protéger efficacement.

Publié dans : Technologie
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 747
Sur SlideShare
0
Issues des intégrations
0
Intégrations
36
Actions
Partages
0
Téléchargements
156
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Sécurité MySQL

  1. 1. Sécurité MySQL Forum PHP 2007 22 Novembre 2007
  2. 2. Agenda Pourquoi la sécurité est importante La gestion des droits Les directives de configuration La sécurité sur le Web Les prochains défis de la sécurité
  3. 3. Qui parle? Damien Séguy Qui reçoit la lettre hebdo? Accompagnements des projets LAMP ‘Sécurité PHP 5 et MySQL’ avec Philippe Gamache chez Eyrolles http://www.nexen.net/
  4. 4. Les risques Usurpation du compte root Effacement des données Modification de données Divulgations de données Ridicule...
  5. 5. Les vulnérabilités avérées 1) Insuffisance des tests de sécurité 2)Configuration par défaut 3) Pas de chiffrement des données sensibles 4)Pas mises à jour du système 5) La sécurité apparaît lors des catastrophes 6)Surveillance inefficace 7)Contrôle insuffisant de l’accès par des tiers
  6. 6. Les droits par défaut Compte root, sans mot de passe Mettre un mot de passe Changer root en ‘chef ’? Les utilisateurs et bases de test Les utilisateurs sans mot de passe Les utilisateurs sans restriction d’IP Les utilisateurs anonymes
  7. 7. Configurations de la table user Utilisateur anonyme SELECT count(*) FROM users WHERE user=’’; Eviter les % dans les adresses SELECT count(*) FROM users WHERE host LIKE ‘%%%’; Toujours mettre un mot de passe SELECT count(*) FROM users WHERE password=’’;
  8. 8. Le droit de FILE Exportation de données vers un fichier Importation de données depuis un fichier Importations de données depuis le client
  9. 9. Le droit de GRANT Possibilité de donner ses propres droits Escalade dans les droits Compléments par échange dans les droits
  10. 10. Configuration serveur --skip-grant-tables --old-password --secure-auth --skip-show-databases
  11. 11. Configuration serveur (2) --port=3306 --skip-name-resolve --skip-networking --bind-address --skip-symbolic-links
  12. 12. Configuration serveur (3) --local-infile=0 --secure-file-priv --chroot --open-files-limit --safe-user-create --allow-suspicous-udf
  13. 13. Configuration client --secure-auth --safe-updates aussi appelée : --i-am-a-dummy --select_limit=1000 --max_join_size
  14. 14. Limiter les consommations Dans la table User Max_connections +-----------------------+------+ | Field | Null | Max_user_connections +-----------------------+------+ | max_questions | NO | | max_updates | NO | Max_questions | max_connections | NO | | max_user_connections | NO | Max_updates +-----------------------+------+ Désactivé par défaut Valables sur une heure
  15. 15. Construction dynamique de la requête SQL Injections SQL $requete = “SELECT COUNT(*) FROM users WHERE login=’quot;.$_GET['login'].quot;‘ AND motdepasse=’quot;.$_GET['password'].quot;‘ “; Mélange des données et de la commande Il est possible d’échapper à l’encadrement, et perturber la requête SQL
  16. 16. Formes d’injections Suppression de clause WHERE WHERE login = '' or 1 or '' Sous-requête WHERE id=(SELECT BENCHMARK(md5(1),1000)); UNION WHERE id=1 UNION SELECT * FROM table; Insertions multiples VALUES ('login'),('admin');
  17. 17. Caractères spéciaux de MySQL ‘ et “ : délimiteur de chaîne () : sous-requêtes % et _ : regex avec LIKE REGEXP ; g G : délimiteur de fin de commande --, # et /* .... */ commentaires
  18. 18. Protections Protection des caractères Appelé échappement (barbarisme) en PHP : mysqli_real_escape_string() ET délimiteurs $sql = quot;SELECT * FROM table WHERE id = 'quot; .mysqli_escape_string($mid, $_GET['id']). quot;'quot;; Forcer le type avant la mise en requête SQL : cas des entiers
  19. 19. Protections Commandes préparées Préparation de la commande Affectation des variables Exécution de la commande
  20. 20. /* Préparation de la commande d'insertion */ $query = quot;INSERT INTO ma_ville (Nom, Pays, Region) VALUES (?,?,?)quot;; $stmt = $mysqli->prepare($query); $val1 = 'Bordeaux'; $val2 = 'FRA'; $val3 = 'Aquitaine'; $stmt->bind_param(quot;sssquot;, $val1, $val2, $val3); /* Exécution de la commande */ $stmt->execute(); $val1 = 'Montréal'; $val2 = 'CAN'; $val3 = 'Québec'; /* Exécution de la commande */ $stmt->execute(); /* Fermeture de la commande */ $stmt->close();
  21. 21. Protections Procédures stockées $sql = quot;CALL ma_proc('quot;.$_GET['id'].quot;'); Variables MySQL Plus facile à lire et à sécuriser $sql = quot;SET @id := 'quot;.$_GET['id'].quot;'quot;; mysqli_query($mid, $sql); $sql = quot;SELECT * FROM table WHERE id = @idquot;; mysqli_query($mid, $sql); Les injections sont toujours possibles!!
  22. 22. Les portes dérobées Les logs (binaire, lent, général) SHOW PROCESSLIST SHOW CREATE TABLE Le dossier de données Les sauvegardes (media, fichiers) La réplication Les clients (historique,
  23. 23. Autres outils Jetez ce qui ne sert pas Chiffrez les données Empoisonnez vos données Auditez tout ce qui se passe Sauvegardez Outils : MySQL Enterprise Security Advisor
  24. 24. Vers des standards de sécurité? Sarbanes-Oxley, SOX Health Insurance Portability and Accountability Act (HIPAA) Payment Card Industry Gramm-Leachy Bliley Act SB 1386 BASEL II
  25. 25. Norme PCI (traduction libre) 1. Entretenir un fire-wall pour protéger les données 2. Ne pas utiliser les valeurs par défaut des paramètres de sécurité 3. Protéger les données stockées 4. Chiffrer les transmissions sur les réseaux ouverts 5. Utiliser régulièrement un anti-virus 6. Développer et entretenir des systèmes sécurisés 7. Implémenter des contrôles d'accès stricts 8. Assigner un identifiant unique à tout utilisateur du système 9. Restreindre l'accès physique aux données 10.Noter et surveiller tous les accès aux données 11.Tester régulièrement les systèmes de sécurité 12.Établir une politique de sécurité pour les sous-traitants et employés
  26. 26. http://www.nexen.net/ conferences.php damien.seguy@nexen.net

×