Türchen 12: Anonymisierung von Kundendaten in Magento

Viele werden die Situation kennen: Als Basis für die lokale Entwicklungs-Instanz von Magento dient ein Datenbank-Dump des Live-Systems. Dies erspart einem das Anlegen von Beispieldaten und ist vor allem bei der Fehlersuche unerlässlich. Denn wie soll man einen Fehler finden, der mit den Beispieldaten gar nicht auftritt? Leider ist dieses Vorgehen bedenklich, was den Datenschutz angeht. Besonders problematisch wird es auch, wenn zum Beispiel versehentlich Emails an Kunden ausgelöst werden. Um dies zu vermeiden, sollten auf allen Entwicklungssystemen alle Kundendaten anonymisiert oder komplett entfernt werden.

Löschen oder Anonymisieren?

Wenn man 100% sicher sein will, keine Kundendaten im System zu haben, sollte man diese Daten erst gar nicht in den Datenbank-Dump einschließen. Am einfachsten geht das mit dem Kommandozeilen-Tool n98-magerun von Christian Münch, das (neben vielen anderen) diese Funktion integriert. Selbstverständlich kann man die entsprechenden Datenbank-Tabellen auch im Nachhinein leeren.
Sollte man hingegen Kunden- und/oder Bestelldaten zum Testen benötigen, ist es häufig sehr aufwändig, eine ausreichende Anzahl Kunden oder Bestellungen manuell oder mit einem Skript anzulegen. Spätestens, wenn es um die Entwicklung von Statistikfunktionen oder um die Analyse eines einzelnen Kunden- oder Bestellungsdatensatzes geht, genügt dieser Ansatz nicht mehr. An dieser Stelle sollte man stattdessen die bestehenden Datensätze verwenden und anonymisieren.

Die richtigen Daten anonymisieren

Neben den offensichtlichen Kunden- und Bestellunsgdaten gibt es noch eine Reihe zusätzlicher Datensätze, die ebenfalls anonymisiert werden sollten:

  • Kundenadressen
  • Bestelladressen
  • Quotes (Warenkörbe)
  • Quote-Adressen
  • Newsletter-Abonnenten
Eine weitere interessante Frage: Welche Attribute sollten anonymisiert werden? Wählt man zu wenige, werden möglicherweise Rückschlüsse auf den Original-Kunden ermöglicht - in diesem Fall ist die Anonymisierung nicht ausreichend. Werden hingegen zu viele gewählt, Erzeugt man möglicherweise Inkonsistenzen in den Datensätzen. Ein Beispiel wäre das Land oder die Postleitzahl des Kunden: anhand dieser Daten werden Versandkosten, verfügbare Zahlungsarten etc. in Magento bestimmt. Bei der Nachstellung einer bestimmten Bestellung erhält man so möglicherweise ein falsches Ergebnis. Bei der Erstellung meines Anonymisierungs-Moduls habe ich mich für die Anonymisierung der folgenden Felder entschieden:
  • prefix
  • firstname
  • middlename*
  • lastname
  • suffix*
  • email
  • company
  • street
  • telephone
  • fax*
  • taxvat*
  • remote_ip
Alle weiteren Felder sind nicht personenbezogen - aus dem Wohnort und den bestellten Produkten lassen sich normalerweise keine Rückschlüsse auf die bestellende Person ziehen. Die mit einem Sternchen markierten Feldinhalte werden dabei einfach gelöscht, da sie selten systemrelevant sind. Alle anderen werden sinnvoll ersetzt.

Vorgehen bei der Ersetzung

Der einfachste Ansatz bei der Ersetzung wäre, Zufallszeichen einzufügen. Während dies den Zweck des Anonymisierens erfüllt, werden die Datensätze anschließend unlesbar. Um das zu vermeiden, können echte Daten eingesetzt werden, die aber natürlich keinen echten Personen entsprechen sollten. In meinem Modul nutze ich hierfür den Webservice fakester.biz, der Personendaten auch in größeren Mengen bereitstellt. Ein Datensatz sieht z.B. wie folgt aus (JSON-Format):
{
    "name":"Prohaska-McLaughlin",
    "first_name":"Manuela",
    "last_name":"Raynor",
    "prefix":"Mrs.",
    "suffix":"LLC",
    "city":"South Tristianview",
    "city_prefix":"New",
    "city_suffix":"stad",
    "country":"Armenia",
    "secondary_address":"Apt. 971",
    "state":"Louisiana",
    "state_abbr":"FL",
    "street_address":"235 Wolf Vista",
    "street_name":"Heathcote Ridge",
    "street_suffix":"Knolls",
    "zip_code":"45097",
    "bs":"enhance proactive technologies",
    "catch_phrase":"Balanced well-modulated focus group",
    "domain_name":"durgan.info",
    "domain_suffix":"org",
    "domain_word":"hamill",
    "email":"stewart.bauch@marvin.biz",
    "free_email":"gianni.bosco@gmail.com",
    "ip_v4_address":"180.229.218.93",
    "ip_v6_address":"a70c:b72c:6de:e671:f03c:a8b6:25c6:d74c",
    "user_name":"bret_borer"
}
Für die oben genannten Felder sind also entsprechende Datenfelder vorhanden. Schön wäre es natürlich noch, wenn in den einzelnen Datensätzen, die zusammen gehören, auch die gleichen Daten zum Ersetzen verwendet würden. Als Beispiel: Ein Kunde trägt üblicherweise den gleichen Namen in den Kundendaten, in seiner Kundendadresse im Adressebuch und in seiner Liefer- oder Rechnungsadresse bei Bestellungen ein. Dieser Name wird anschließend auch in die Bestellung und die Bestelladresse übernommen. Hier sollte also auch nach der Anonymisierung überall der gleiche Name stehen.

Das Modul: IntegerNet_Anonymizer

Zu den aufgelisteten Anforderungen habe ich ein Modul gebaut, das unter https://github.com/integer-net/Anonymizer auf GitHub bereit steht und kostenlos genutzt werden kann. Nach der Installation kann es wie folgt aufgerufen werden:
  • Im Admin-Bereich von Magento unter System -> Werkzeuge -> Anonymizer
  • Per Kommandozeile: php -f shell/anonymizer.php (empfohlen)
Es geht dabei (etwas vereinfacht) wie folgt vor:
  • Anonymisiere Kundendaten
    • Anonymisiere zugehörige Newsletter-Empfänger
    • Anonymisiere zugehörige Warenkörbe
    • Anonymisiere zugehörige Bestellungen
    • Anonymisiere zugehörige Kundenadressen
      • Anonymisiere zugehörige Warenkorbadressen
      • Anonymisiere zugehörige Bestelladressen
  • Anonymisiere verbleibende Newsletter-Empfänger
  • Anonymisiere verbleibende Bestellungen
    • Anonymisiere zugehörige Bestelladressen
  • Anonymisiere verbleibende Warenkörbe
    • Anonymisiere zugehörige Warenkorbadressen
  • Anonymisiere verbleibende Bestellungadressen
    • Anonymisiere zugehörige Warenkorbadressen
  • Anonymisiere verbleibende Warenkorbadressen
Sofern vorher Daten zusammengehörig waren, sind sie das auch nach der Anonymisierung noch. Die Nachteile dieser Lösung sollen natürlich nicht verschwiegen werden. Wegen der komplexen Zusammenhänge ist es in der aktuellen Version des Moduls nicht möglich, einen einmal begonnenen Anonymisierungsprozess zu einem späteren Zeitpunkt fortzusetzen. Da die Magento-eigenen Models verwendet werden, ist die Performance des Moduls nicht so, wie sie bei einem reinen Datenbank-Tool sein könnte. Bei größeren Datenmengen kann das Modul daher durchaus an seine Grenzen stoßen.

Fazit

Mit dem Anonymizer lassen sich alle Kundendaten und zugehörige Datensätze wie Adressen und Bestellungen einfach anonymisieren, sodass auch Zusammenhänge bestehen bleiben und "schöne" Beispieldaten im System verbleiben. Über Rückmeldungen zum Beitrag oder zum Modul oder über Interesse bei der Mitarbeit würde ich mich sehr freuen.


Ein Beitrag von Andreas von Studnitz
Andreas's avatar

Andreas von Studnitz (Twitter: @avstudnitz) ist Magento Certified Developer und Geschäftsführer der 2012 gegründeten Magento-Agentur integer_net in Aachen. Seit 2008 arbeitet er mit Magento und ist Autor des Moduls Mage Setup (als Mitglied des Teams FireGento) und des Importmoduls FastSimpleImport. Sein privater Magento-Blog befindet sich unter www.avs-webentwicklung.de/magento-blog.html.

Alle Beiträge von Andreas

Kommentare
Cyrill Schumacher am

Anonygento ist soweit fertig: https://github.com/SchumacherFM/Anonygento

Kann natürlich auch österreichische Fake Daten ;-)

Manuel am

Vielen Dank für den Artikel. Die Extension klingt sehr nützlich, werde ich auf jeden Fall mal ausprobieren.

In den Fake-Daten sind ja auch E-Mail Adressen enthalten, wie wird denn gewährleistet, das die nicht doch existieren?

Für den oben zitierten Fall "wenn zum Beispiel versehentlich Emails an Kunden ausgelöst werden"

Danke

Matthias Zeis am

Schöne Idee und Extension, Andreas. Ich hätte ja gerne deutschsprachige Fake-Daten: kennt jemand einen vernünftigen Dienst dafür?

Christian Münch am

Hi,

danke für den interessanten Artikel. Die geniale n98-magerun “strip db dump“ Funktion stammt aber nicht von mir sondern von Alexander Menk.

Gruß

Christian

Dein Kommentar