Skip to main content

Générer des données de sécurité fictives avec Python et faker-security

Écrit par

Michael Aquilina

feature python code purple

26 avril 2022

0 minutes de lecture

Snyk a récemment publié en open source son package Python faker-security pour aider toutes les personnes qui travaillent avec des données de sécurité. Dans cet article, nous présentons brièvement ce package Python et expliquons comment l’utiliser. Mais avant cela, voyons comment le package Python factory_boy peut être utilisé avec faker-security pour améliorer votre expérience de rédaction de tests pendant le développement.

Remarque : Quelques connaissances en Python vous aideront à tirer le meilleur parti de cet article.

Tester avec Faker et factory_boy

Avant d’aborder faker-security, commençons par découvrir factory_boy et Faker, ainsi que la manière dont nous les utilisons chez Snyk.

Chez Snyk, nous sommes convaincus que les tests automatisés contribuent à la maintenabilité de notre code. Ils nous permettent de développer et de faire évoluer rapidement des fonctionnalités, et d’apporter des modifications à notre code en toute confiance, sans craindre de casser involontairement des fonctionnalités existantes.

Notre engagement en faveur des tests nous pousse à chercher de nouvelles façons de simplifier leur rédaction et leur lecture au sein de nos équipes. Faker et factory_boy comptent parmi nos packages préférés pour tester des projets Python. Ensemble, ils génèrent de fausses instances des modèles que nous utilisons dans nos tests.

Faker est un package Python qui permet de générer des données fictives pour de nombreux types de champs, comme les noms d’utilisateur, les dates et les URL. factory_boy est un autre package Python qui facilite l’intégration de la génération de données de Faker dans votre code en définissant des classes de fabrique.

Ce que nous apprécions particulièrement avec factory_boy, c’est qu’il permet à la personne qui écrit un test de se concentrer sur les données importantes pour ce test, tout en laissant Faker générer les autres données, qui n’ont pas d’importance pour celui-ci. Les tests gagnent ainsi considérablement en lisibilité : le code comporte moins de lignes et les champs dont vous n’avez pas à vous soucier ne viennent plus l’encombrer.

Pour voir concrètement la différence, comparez dans les exemples suivants un test écrit avec factory_boy à un test qui ne l’utilise pas.

Sans fabriques :

from django.contrib.auth.models import User

def test_correct_email_address():
    user = User(
        first_name="Sherlock",
        last_name="Holmes", 
        username="sherlock.holmes",
        email="sherlock.holmes@baker.street",
        is_admin=False,
    )

    assert has_valid_email(user) is True

Avec des fabriques :

from tests.factories import UserFactory

def test_correct_email_address():
    user = UserFactory(email="sherlock.holmes@baker.street")
    assert has_valid_email(user) is True

Le test qui importe UserFactory est exactement équivalent à celui qui ne l’importe pas. Il est toutefois plus court, plus facile à lire et met clairement en évidence les champs importants pour le test. À l’inverse, le test sans fabrique est plus long et rend difficile l’identification des champs qui comptent vraiment pour le test. L’exemple est assez simple, mais l’écart devient encore plus marqué à mesure que la complexité des tests augmente.

La classe UserFactory peut être définie une seule fois dans tests/factories.py, puis réutilisée dans tous vos tests :

import factory
from django.contrib.auth.models import User
from factory.django import DjangoModelFactory

class UserFactory(DjangoModelFactory):
    class Meta:
        model = User

    username = factory.Faker("slug")
    first_name = factory.Faker("first_name")
    last_name = factory.Faker("last_name")
    email = factory.Faker("email")
    is_admin = False

Lorsqu’il s’agit de données de sécurité, nous devons souvent générer des données pour des champs comme les vecteurs CVSSv3 et les identifiants CVE. Par défaut, Faker ne permet pas de générer directement ces données. En revanche, il vous permet d’ajouter vos propres fournisseurs, ce qui est précisément le rôle de faker-security.

Qu’est-ce que faker-security ?

faker-security est un package Python qui sert de fournisseur pour Faker et vous permet de générer aléatoirement des données liées à la sécurité pour vos projets. À l’heure actuelle, faker-security prend en charge la génération des données suivantes :

  • Vecteurs CVSSv3

  • Vecteurs CVSSv2

  • Versions semver

  • Plages de versions semver NPM

  • CVE

  • CWE

À l’avenir, nous espérons prendre en charge d’autres méthodes de génération et types de plages de versions, comme le semver de Maven.

En reprenant nos exemples précédents, si nous voulons créer une classe VulnerabilityFactory pour générer des données fictives, nous la définirions comme suit :

import factory
from factory.django import DjangoModelFactory
from faker_security.providers import SecurityProvider
from myproject.models import Vulnerability

factory.Faker.add_provider(SecurityProvider)

class VulnerabilityFactory(DjangoModelFatory):
    class Meta:
        model = Vulnerability

    cvss_v3_vector = factory.Faker("cvssv3")
    cve_id = factory.Faker("cve")
    cwe_id = factory.Faker("cwe")

Comment utiliser faker-security

Vous pouvez installer faker-security avec pip :

pip install faker-security

Pour l’utiliser dans votre projet, ajoutez-le au fichier de dépendances de votre choix. Il s’agit généralement du fichier requirements.txt de votre projet. Si vous utilisez un gestionnaire de packages de plus haut niveau, comme poetry ou pipenv, suivez ses instructions pour ajouter de nouveaux packages.

Une fois faker-security installé, il vous suffit de configurer Faker ou factory_boy pour l’utiliser.

Si vous exécutez vos tests avec pytest, nous vous recommandons de configurer faker-security pour factory_boy dans votre fichier conftest.py comme suit :

import factory
from faker_security.providers import SecurityProvider

def pytest_configure():
    factory.Faker.add_provider(SecurityProvider)

La suite pour faker-security

Utiliser factory_boy et Faker est un excellent moyen de simplifier vos tests. Avec faker-security, vous disposez désormais d’une solution simple et rapide pour générer des données de sécurité fictives dans tous vos projets !

Nous espérons que ce package vous sera aussi utile qu’à nous, et nous serions ravis de vous compter parmi nos contributeurs ! Ajoutez une étoile à notre dépôt GitHub et envoyez-nous vos demandes de fusion et vos contributions. Bon courage pour vos tests !

Publié dans: