sécurité mysql

26
Sécurité MySQL Forum PHP 2007 22 Novembre 2007

Upload: damien-seguy-

Post on 21-Jun-2015

3.275 views

Category:

Technology


1 download

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

Page 1: Sécurité MySQL

Sécurité MySQL

Forum PHP 200722 Novembre 2007

Page 2: Sécurité MySQL

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é

Page 3: Sécurité MySQL

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/

Page 4: Sécurité MySQL

Les risques

Usurpation du compte root

Effacement des données

Modification de données

Divulgations de données

Ridicule...

Page 5: Sécurité MySQL

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

Page 6: Sécurité MySQL

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

Page 7: Sécurité MySQL

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=’’;

Page 8: Sécurité MySQL

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

Page 9: Sécurité MySQL

Le droit de GRANT

Possibilité de donner ses propres droits

Escalade dans les droits

Compléments par échange dans les droits

Page 10: Sécurité MySQL

Configuration serveur

--skip-grant-tables--old-password--secure-auth--skip-show-databases

Page 11: Sécurité MySQL

Configuration serveur (2)

--port=3306

--skip-name-resolve

--skip-networking

--bind-address

--skip-symbolic-links

Page 12: Sécurité MySQL

Configuration serveur (3)

--local-infile=0

--secure-file-priv

--chroot

--open-files-limit

--safe-user-create

--allow-suspicous-udf

Page 13: Sécurité MySQL

Configuration client

--secure-auth

--safe-updates

aussi appelée : --i-am-a-dummy

--select_limit=1000

--max_join_size

Page 14: Sécurité MySQL

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

Page 15: Sécurité MySQL

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

Page 16: Sécurité MySQL

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');

Page 17: Sécurité MySQL

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

Page 18: Sécurité MySQL

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

Page 19: Sécurité MySQL

Protections

Commandes préparées

Préparation de la commande

Affectation des variables

Exécution de la commande

Page 20: Sécurité MySQL

/* 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();

Page 21: Sécurité MySQL

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!!

Page 22: Sécurité MySQL

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,

Page 23: Sécurité MySQL

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

Page 24: Sécurité MySQL

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

Page 25: Sécurité MySQL

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)