Skip to main content

Gerando dados de segurança fictícios com Python e faker-security

Escrito por

Michael Aquilina

feature python code purple

26 de abril de 2022

0 minutos de leitura

Recentemente, a Snyk tornou público o código do pacote Python faker-security para ajudar quem trabalha com dados de segurança. Neste post, vamos explicar brevemente o que é esse pacote e como usá-lo. Mas, antes, vamos entender como o pacote Python factory_boy pode ser usado em conjunto com o faker-security para facilitar a criação de testes durante o desenvolvimento.

Observação: Ter conhecimentos de Python ajuda a aproveitar melhor este post.

Testes com Faker e factory_boy

Antes de conhecer o faker-security, vale começar entendendo o que são factory_boy e Faker e como os usamos na Snyk.

A Snyk acredita muito no potencial dos testes automatizados para manter nosso código sustentável. Os testes nos permitem desenvolver funcionalidades e iterar rapidamente, além de fazer alterações no código com confiança, sem receio de quebrar acidentalmente funcionalidades existentes.

Nosso compromisso com os testes nos leva a buscar novas maneiras de simplificar essa experiência para quem escreve e lê testes nas nossas equipes. Faker e factory_boy são dois dos nossos pacotes favoritos para testar projetos Python. Juntos, eles geram instâncias fictícias dos modelos que usamos nos testes.

Faker é um pacote Python que permite gerar dados fictícios para muitos tipos de campos, como nomes de usuário, datas e URLs. factory_boy é outro pacote Python que ajuda a integrar a geração de dados do Faker ao seu código por meio da definição de classes de fábrica.

O que gostamos especialmente no factory_boy é que ele permite que quem escreve os testes se concentre nos dados relevantes, deixando o Faker gerar todos os outros dados que não importam para o teste. Isso melhora muito a legibilidade dos testes, reduzindo o número de linhas de código necessárias e eliminando o ruído de campos com os quais você não precisa se preocupar.

Para ver essa diferença na prática, compare os exemplos a seguir: um teste escrito com factory_boy e outro sem ele.

Sem fábricas:

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

Com fábricas:

from tests.factories import UserFactory

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

O teste que importa UserFactory é exatamente equivalente ao que não a utiliza. No entanto, é mais curto, mais fácil de ler e mostra claramente os campos importantes para o teste. Já o teste sem fábrica é mais longo e dificulta a identificação dos campos que realmente importam. Este é um exemplo simples, mas a diferença fica ainda mais evidente à medida que os testes se tornam mais complexos.

A classe UserFactory pode ser definida uma única vez em tests/factories.py e reutilizada em todos os seus testes:

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

Ao trabalhar com dados de segurança, muitas vezes precisamos gerar dados para campos como vetores CVSSv3 e identificadores CVE. Por padrão, o Faker não oferece uma maneira direta de gerar esses dados, mas permite adicionar seus próprios provedores — é aí que entra o faker-security.

O que é faker-security?

faker-security é um pacote Python que funciona como provedor do Faker e permite gerar dados relacionados à segurança aleatoriamente para seus projetos. Atualmente, o faker-security permite gerar:

  • Vetores CVSSv3

  • Vetores CVSSv2

  • Versões semver

  • Intervalos de versões semver do NPM

  • CVEs

  • CWEs

No futuro, esperamos incluir mais métodos de geração e tipos de intervalos de versões, como o semver do Maven.

Com base nos exemplos anteriores, se quisermos criar algum tipo de VulnerabilityFactory para gerar dados fictícios, podemos defini-la assim:

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

Como usar o faker-security

O faker-security pode ser instalado com o pip:

pip install faker-security

Se quiser usá-lo no seu projeto, adicione-o ao arquivo de dependências de sua preferência. Normalmente, esse é o arquivo requirements.txt do projeto. Se você usa um gerenciador de pacotes de nível mais alto, como poetry ou pipenv, siga as instruções dele para adicionar novos pacotes.

Depois de instalar, basta configurar o Faker ou o factory_boy para usar o faker-security.

Se você executa testes com pytest, recomendamos configurar o faker-security para o factory_boy no arquivo conftest.py, da seguinte forma:

import factory
from faker_security.providers import SecurityProvider

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

Próximos passos com faker-security

Usar o factory_boy e o Faker é uma ótima maneira de simplificar seus testes. Com o faker-security, você também tem uma forma rápida e fácil de gerar dados de segurança fictícios para todos os seus projetos!

Esperamos que este pacote seja tão útil para você quanto é para nós e adoraríamos contar com a sua contribuição! Dê uma estrela ao nosso repositório no GitHub e envie pull requests e contribuições. Bons testes!

Publicado em: