Skip to main content

Gefälschte Sicherheitsdaten mit Python und faker-security generieren

Artikel von

Michael Aquilina

feature python code purple

26. April 2022

0 Min. Lesezeit

Snyk hat kürzlich unser Python-Paket faker-security als Open Source veröffentlicht, um allen zu helfen, die mit Sicherheitsdaten arbeiten. In diesem Blogbeitrag erklären wir kurz, worum es bei diesem Python-Paket geht und wie Sie es verwenden. Doch zunächst sehen wir uns an, wie sich das Python-Paket factory_boy in Kombination mit faker-security einsetzen lässt, um das Schreiben von Tests während der Entwicklung zu verbessern.

Hinweis: Grundkenntnisse in Python sind hilfreich, um diesen Beitrag optimal nutzen zu können.

Testen mit Faker und factory_boy

Bevor wir uns faker-security näher ansehen, empfiehlt es sich, zunächst zu klären, was factory_boy und Faker sind und wie wir sie bei Snyk einsetzen.

Snyk ist fest davon überzeugt, dass automatisierte Tests unseren Code wartbar machen. Tests ermöglichen es uns, schnell zu iterieren und Funktionen zu entwickeln sowie Änderungen an unserem Code sicher vorzunehmen, ohne befürchten zu müssen, dabei versehentlich bestehende Funktionen zu beeinträchtigen.

Unser Engagement für Tests spornt uns an, neue Wege zu finden, um das Testerlebnis für diejenigen zu vereinfachen, die Tests in unseren Teams schreiben und lesen. Faker und factory_boy sind zwei unserer bevorzugten Pakete zum Testen von Python-Projekten. Zusammen erzeugen sie Testinstanzen der Modelle, die wir verwenden.

Faker ist ein Python-Paket, mit dem Sie für viele verschiedene Arten von Feldern wie Benutzernamen, Datumsangaben und URLs fiktive Daten generieren können. factory_boy ist ein weiteres Python-Paket, das die Integration der Datengenerierung von Faker in Ihren Code erleichtert, indem es Factory-Klassen definiert.

Besonders an factory_boy gefällt uns, dass Testautorinnen und -autoren damit die Daten festlegen können, auf die es in ihren Tests ankommt, während Faker alle übrigen Daten generiert, die für den Test keine Rolle spielen. Das verbessert die Lesbarkeit von Tests erheblich: Der erforderliche Code wird kürzer und unnötige Felder, um die Sie sich nicht kümmern müssen, entfallen.

Um den Unterschied in der Praxis zu sehen, vergleichen Sie in den folgenden Beispielen einen mit factory_boy geschriebenen Test mit einem Test ohne dieses Framework.

Ohne Factories:

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

Mit Factories:

from tests.factories import UserFactory

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

Der Test, der UserFactory importiert, ist exakt gleichwertig mit dem Test ohne diesen Import. Er ist jedoch kürzer, leichter zu lesen und macht deutlich, welche Felder für den Test relevant sind. Im Vergleich dazu ist der Test ohne Factory länger, und es ist schwieriger zu erkennen, auf welche Felder es für den Test tatsächlich ankommt. Dieses Beispiel ist recht einfach, doch mit zunehmender Komplexität der Tests wird der Unterschied noch deutlicher.

Die Klasse UserFactory kann einmalig in tests/factories.py definiert und in all Ihren Tests wiederverwendet werden:

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

Bei Sicherheitsdaten müssen wir häufig Daten für Sicherheitsfelder wie CVSSv3-Vektoren und CVE-Kennungen generieren. Faker bietet diese Daten standardmäßig nicht direkt an. Sie können jedoch eigene Provider hinzufügen – und genau hier kommt faker-security ins Spiel.

Was ist faker-security?

faker-security ist ein Python-Paket, das als Provider für Faker fungiert und es Ihnen ermöglicht, zufällige sicherheitsbezogene Daten für Ihre Projekte zu generieren. Derzeit unterstützt faker-security die Datengenerierung für:

  • CVSSv3-Vektoren

  • CVSSv2-Vektoren

  • semver-Versionen

  • NPM-semver-Versionsbereiche

  • CVEs

  • CWEs

Künftig möchten wir weitere Generierungsmethoden und Arten von Versionsbereichen unterstützen – zum Beispiel semver für Maven.

Aufbauend auf unseren vorherigen Beispielen würden wir eine VulnerabilityFactory erstellen, um fiktive Daten zu generieren, und sie wie folgt definieren:

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")

So verwenden Sie faker-security

faker-security lässt sich über pip installieren:

pip install faker-security

Wenn Sie das Paket in Ihrem Projekt verwenden möchten, fügen Sie es der Abhängigkeitsdatei Ihrer Wahl hinzu. In der Regel ist dies die Datei requirements.txt Ihres Projekts. Wenn Sie einen Paketmanager auf höherer Ebene wie poetry oder pipenv verwenden, folgen Sie dessen Anweisungen zum Hinzufügen neuer Pakete.

Nach der Installation müssen Sie nur noch Faker oder factory_boy so konfigurieren, dass faker-security verwendet wird.

Wenn Sie Tests mit pytest ausführen, empfehlen wir, faker-security für factory_boy wie folgt in Ihrer Datei conftest.py einzurichten:

import factory
from faker_security.providers import SecurityProvider

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

So geht es mit faker-security weiter

Mit factory_boy und Faker lassen sich Tests vereinfachen. Und mit faker-security steht Ihnen jetzt eine schnelle und einfache Möglichkeit zur Verfügung, um fiktive Sicherheitsdaten für all Ihre Projekte zu generieren!

Wir hoffen, dass Sie dieses Paket ebenso nützlich finden wie wir, und freuen uns über Ihre Beiträge! Geben Sie unserem GitHub-Repository einen Stern und senden Sie Pull Requests und Beiträge. Viel Spaß beim Testen!

Gepostet in: