sécurité mysql
DESCRIPTION
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.TRANSCRIPT
Sécurité MySQL
Forum PHP 200722 Novembre 2007
AgendaPourquoi 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é
http://farm3.static.flickr.com/2158/1924153003_cd98db929a_m_d.jpg
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/
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 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
Les droits par défautCompte 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
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=’’;
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
Le droit de GRANT
Possibilité de donner ses propres droits
Escalade dans les droits
Compléments par échange dans les droits
Configuration serveur
--skip-grant-tables--old-password--secure-auth--skip-show-databases
Configuration serveur (2)
--port=3306
--skip-name-resolve
--skip-networking
--bind-address
--skip-symbolic-links
Configuration serveur (3)
--local-infile=0
--secure-file-priv
--chroot
--open-files-limit
--safe-user-create
--allow-suspicous-udf
Configuration client
--secure-auth
--safe-updates
aussi appelée : --i-am-a-dummy
--select_limit=1000
--max_join_size
Limiter les consommations
+-----------------------+------+| Field | Null |+-----------------------+------+| max_questions | NO || max_updates | NO || max_connections | NO || max_user_connections | NO |+-----------------------+------+
Dans la table User
Max_connections
Max_user_connections
Max_questions
Max_updates
Désactivé par défaut
Valables sur une heure
Injections SQLConstruction dynamique de la requête SQL
$requete = “SELECT COUNT(*) FROM users WHERE login=’".$_GET['login']."‘ AND motdepasse=’".$_GET['password']."‘ “;
Mélange des données et de la commande
Il est possible d’échapper à l’encadrement, et perturber la requête SQL
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');
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
Protection des caractères
Appelé échappement (barbarisme)
en PHP : mysqli_real_escape_string() ET délimiteurs
$sql = "SELECT * FROM table WHERE id = '".mysqli_escape_string($mid, $_GET['id'])."'";
Forcer le type avant la mise en requête SQL : cas des entiers
Protections
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 = "INSERT INTO ma_ville (Nom, Pays, Region) VALUES (?,?,?)";$stmt = $mysqli->prepare($query);
$val1 = 'Bordeaux';$val2 = 'FRA';$val3 = 'Aquitaine';
$stmt->bind_param("sss", $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();
Protections
Procédures stockées
Variables MySQL
Plus facile à lire et à sécuriser
$sql = "CALL ma_proc('".$_GET['id']."');
$sql = "SET @id := '".$_GET['id']."'";mysqli_query($mid, $sql);$sql = "SELECT * FROM table WHERE id = @id"; mysqli_query($mid, $sql);
Les injections sont toujours possibles!!
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,
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
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
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
Norme PCI (traduction libre)
http://www.nexen.net/conferences.php