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.
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. 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. Les risques
Usurpation du compte root
Effacement des données
Modification de données
Divulgations de données
Ridicule...
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. 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. 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. 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. Le droit de
GRANT
Possibilité de donner ses
propres droits
Escalade dans les droits
Compléments par échange
dans les droits
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. 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. 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. 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. 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
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. 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. 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. 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. 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. 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