Sécurité des Bases de Données

Sommaire


Introduction:

La sécurité des bases de données est une préoccupation majeure dans le monde numérique d’aujourd’hui. Avec la montée des cyberattaques et des menaces d’intrusion, il est essentiel que les organisations adoptent des mesures rigoureuses pour protéger leurs données. Voici un guide détaillé sur quelques-unes des meilleures pratiques à adopter pour garantir la sécurité de vos bases de données.


Bonnes pratiques:

  1. Utilisez des requêtes paramétrées fortement typées. Les requêtes paramétrées permettent de garder la structure de la requête séparée des données en utilisant des espaces réservés. Cela évite les injections SQL car la structure de la requête est définie indépendamment des données.
  2. Mise en œuvre de la validation des entrées. Avant d’exécuter une commande de base de données, il est crucial de valider les données entrantes. Si la validation échoue, la commande ne doit pas être exécutée.
  3. Évitez les mots-clés SQL non intentionnels. Assurez-vous que les entrées ne contiennent pas de mots-clés SQL qui pourraient modifier la requête et causer des dommages.
  4. Assurez-vous que les variables sont fortement typées. Cela empêche les entrées inappropriées qui pourraient être utilisées pour exploiter les vulnérabilités.
  5. Échappez aux métacaractères dans les instructions SQL. Cela évite qu’ils soient interprétés comme des commandes, limitant ainsi les risques d’injections SQL.
  6. Accédez à la base de données avec le niveau de privilège le plus bas. Les applications devraient avoir juste les droits nécessaires pour accomplir une tâche, pas plus.
  7. Utilisez des identifiants sécurisés pour accéder à la base de données. Évitez les mots de passe faibles ou facilement devinables.
  8. Ne fournissez pas directement les chaînes de connexion ou les identifiants au client. Si cela est inévitable, assurez-vous qu’ils soient cryptés pour protéger contre toute interception malveillante.
  9. Utilisez des procédures stockées pour abstraire l’accès aux données. Elles permettent de centraliser et de contrôler les requêtes, réduisant le risque d’exploitation.
  10. Désactivez toute fonctionnalité de base de données inutile. Minimisez les points d’entrée potentiels pour les attaquants en désactivant les procédures stockées ou les services non utilisés.
  11. Éliminez le contenu par défaut. Les configurations et les contenus par défaut peuvent présenter des vulnérabilités, il est donc préférable de les supprimer.
  12. Désactivez les comptes par défaut inutiles. Ces comptes peuvent être des cibles faciles pour les attaquants, donc s’ils ne sont pas nécessaires, désactivez-les.
  13. Fermez la connexion dès que possible. Une connexion ouverte est une invitation aux problèmes. Fermez toujours les connexions dès qu’elles ne sont plus nécessaires.
  14. Connectez-vous à la base de données avec des identifiants distincts selon le niveau de confiance. Par exemple, les utilisateurs, les administrateurs, les invités devraient tous avoir des identifiants différents, réduisant ainsi les risques associés à une éventuelle compromission.

La sécurité des bases de données nécessite une attention constante et l’adoption de meilleures pratiques. En suivant ces recommandations, vous pouvez considérablement renforcer la sécurité de vos bases de données et protéger vos précieuses données contre les menaces.


Exemples:


Prenons un exemple courant d’une vulnérabilité liée à la base de données : l’injection SQL. Voici un morceau de code écrit en PHP qui interagit avec une base de données MySQL et qui ne respecte pas les directives mentionnées précédemment :

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "maBaseDeDonnees";

// Création de la connexion
$conn = new mysqli($servername, $username, $password, $dbname);

// Vérification de la connexion
if ($conn->connect_error) {
    die("Connection échouée: " . $conn->connect_error);
}

// Récupération du nom d'utilisateur et du mot de passe depuis un formulaire
$username = $_GET['username'];
$password = $_GET['password'];

$sql = "SELECT * FROM utilisateurs WHERE username='" . $username . "' AND password='" . $password . "'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    echo "Connexion réussie!";
} else {
    echo "Échec de la connexion!";
}

$conn->close();
?>

Pourquoi ce code ne respecte pas les directives :

  1. Requêtes non paramétrées : Le code utilise la concaténation pour insérer des données utilisateur directement dans la requête SQL. Cela rend le code vulnérable aux injections SQL.
  2. Pas de validation des entrées : Le code ne valide pas les entrées (username et password). Un attaquant peut donc injecter du SQL malveillant.
  3. Mot de passe en clair : Le mot de passe est récupéré et traité en clair, ce qui est une mauvaise pratique. Il aurait dû être haché et comparé à une version hachée stockée dans la base de données.
  4. Identifiants en dur dans le code : Les identifiants de la base de données sont écrits en dur dans le code, ce qui est une mauvaise pratique. Ils devraient être stockés de manière sécurisée et récupérés de manière sécurisée.
  5. Utilisation d’un compte à privilèges élevés : L’exemple utilise le compte « root » pour se connecter à la base de données, ce qui donne un accès complet. Il vaut mieux utiliser un compte avec des droits limités.
  6. Connexion non fermée explicitement : Même si dans cet exemple, la connexion est fermée à la fin du script grâce à $conn->close();, il est bon de noter qu’il est essentiel de fermer la connexion dès qu’elle n’est plus nécessaire.

Cet exemple de code est typique de ce que l’on peut trouver dans des applications web plus anciennes ou mal conçues. C’est un exemple classique de ce qu’il ne faut pas faire en matière de sécurité des bases de données.

Pour corriger ces problèmes, le code pourrait être réécrit comme suit :

<?php
$servername = "localhost";
$dbname = "maBaseDeDonnees";

// Utilisez des identifiants de connexion sécurisés et distincts
$username = "utilisateur_limited";
$password = "mot_de_passe_complex";

// Création de la connexion avec PDO pour faciliter l'utilisation des requêtes paramétrées
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

// Récupération du nom d'utilisateur et du mot de passe depuis un formulaire
// Note : Il est préférable d'utiliser POST pour des informations sensibles comme le mot de passe
$username = $_POST['username'];
$password = $_POST['password'];

// Utilisation de requêtes paramétrées pour éviter les injections SQL
$sql = "SELECT * FROM utilisateurs WHERE username=:username AND password=:password_hash";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':username', $username);

// Hachage du mot de passe pour la comparaison avec celui stocké dans la base de données
$password_hash = hash('sha256', $password);
$stmt->bindParam(':password_hash', $password_hash);

$stmt->execute();

if ($stmt->rowCount() > 0) {
    echo "Connexion réussie!";
} else {
    echo "Échec de la connexion!";
}

$conn = null; // Fermeture de la connexion
?>

Explications sur les corrections :

  1. Utilisation de PDO: Le code utilise maintenant PDO (PHP Data Objects), qui facilite l’utilisation de requêtes paramétrées et offre une meilleure protection contre les injections SQL.
  2. Requêtes paramétrées : Les données de l’utilisateur ne sont plus insérées directement dans la requête. À la place, nous utilisons des placeholders (comme :username) qui sont ensuite liés à des variables.
  3. Hachage du mot de passe: Plutôt que de stocker et de comparer des mots de passe en clair, nous utilisons une fonction de hachage (hash('sha256', $password)) pour sécuriser le mot de passe.
  4. Utilisation d’un compte à privilèges limités : Le compte utilisateur_limited aurait, dans un contexte réel, des privilèges restreints, suffisants pour les opérations nécessaires, et rien de plus.
  5. Fermeture explicite de la connexion : En mettant $conn à null, nous nous assurons que la connexion est fermée proprement.

Conclusion:

La sécurité des bases de données ne doit jamais être prise à la légère. De simples erreurs peuvent entraîner des conséquences catastrophiques, notamment des fuites de données ou des compromissions de systèmes entiers. Il est donc essentiel d’adopter des pratiques solides et éprouvées, comme celles présentées dans cet article.

En veillant à ce que chaque interaction avec votre base de données soit effectuée de manière sécurisée, vous construisez un environnement numérique plus sûr pour vos utilisateurs et pour votre organisation.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *