Matomo - Load Data Infile

  • So, nach gefühlt 2 Jahren habe ich es endlich hinbekommen, dass in Matomo auch Load Data Infile funktioniert. Ein bisschen mehr Anleitung seitens Matomo hätte ich mir da schon gewünscht als der recht einfache Hinweis "Datenbankfähigkeit fehlt", denn das Forum ist ja nicht gerade leer von derartigen Fragen.

    Der Witz an der Sache ist, das wird durch mehrere Sicherheitseinstellungen erst mal verhindert und mehrere eben gemeint als "in verschiedenen Diensten" und Stellen.

    Als Erstes braucht es einen Datenbank-User mit File-Zugriffsrechten. Wenn man nicht gerade mit Root arbeitet, dann muss man die in der Regel erst mal vergeben. Dazu reicht im PHPMyAdmin folgendes:

    Code
    GRANT FILE ON *.* TO 'matomo_user'@'localhost'

    Der Username ist natürlich entsprechend anzupassen.

    Dann muss man MySQL oder eben Maria-DB noch beibringen, dass es die Funktion überhaupt nutzen darf. Dazu in der Datei "/etc/mysql/my.cnf" in den Abschnitten [mysqld] und [mysql] jeweils folgende Anweisung hinzufügen.

    Code
    local-infile = 1

    Den MySQL-Server nun neu starten. Fertig ist es aber noch nicht. Der User "mysql" hat in der Regel keinen Zugriff auf Dateien im public_html-Dir, denn das gehört je nach Umsetzung entweder einem PHP-FPM-User oder Apache als "www-data". Also muss der MySQL-User in die entsprechende Gruppe des vHosts hinzugefügt werden. Wenn die Gruppe www-data ist, dann entsprechend so:

    Code
    usermod -a -G www-data mysql

    Empfehlenswert ist aber, gerade wenn man PHP-FPM verwendet, dem Piwik-Host eine eigene Gruppe zu heben und MySQL entsprechend in diese hinzuzufügen.

    So, Sache erledigt? Nein, leider nicht, aber genau hier dachte ich das auch immer. Matomo meldet aber weiterhin: Fehler, nicht möglich :evil: Ich weiß nicht, wann das genau hinzugekommen ist, aber die nächste Schutzfunktion ist in PHP! Wer kommt schon auf die Idee, dass wenn mit der Datenbank was nicht geht, man an PHP heran muss? Genauer gesagt ist diese im PHP-eigenen MySQLi-Modul.

    Arbeitet man nun mit PHP-FPM, dann könnte man meinen, man vergibt die Berechtigung einfach für den einen Pool für Matomo und versucht es mit so was hier:

    Code
    php_admin_flag[mysqli.allow_local_infile] = On

    Das liefert nach einem Neustart zwar keinen Fehler, bringt aber auch nichts, Load Data Infile geht weiterhin nicht. Diese Einstellung "mysqli.allow_local_infile" lässt sich, warum auch immer, nicht über die Konfiguration des Pooles steuern, sie muss zwingend in die php.ini bzw. ist da schon drinnen, nur eben deaktiviert. Ansonsten würde das im Pool auch nicht viel Sinn ergeben, denn der ist ja nur für den normalen Webzugriff, also PHP-FPM. Cronjobs zur Archivierung von Matomo oder eben Updates per Console laufen aber per CLI.

    Also muss diese Datei bearbeitet werden: /etc/php/7.3/cli/php.ini

    Darin befindet sich recht weit unten der Abschnitt [MySQLi]. Dort steht die entsprechende Anweisung als

    Code
    ;mysqli.allow_local_infile = On

    Diese entsprechend wieder einkommentieren, also das ";" am Anfang entfernen. Ein Neustart ist nicht erforderlich, da PHP-CLI kein Dämon ist und ohnehin jedes mal selbst neu startet.

    Anschließend meldet der Systemprüfbericht von Matomo aber einen Erfolg :)

    Ganz schön kompliziert und aufwändig, für so eine Kleinigkeit. Archivierungen laufen nun aber gefühlt dreimal so schnell wie vorher.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Danke Dicker. Aber das Problem also eigentlich Problemchen dürften bei der Rechtevergabe sein. Per INI würde ich das hier oder Kundenservern gar nicht zulassen. Ist dann ein Sicherheitsrisiko. So wie du das beschrieben hast, sollte es aber keine Probleme geben. SSD, NVME ist geiler, bringt mehr und ist im Zweifel sicherer.

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!

  • Naja, würde ich so jetzt nicht stehen lassen wollen. Ich kaufe mir ja auch keinen Porsche, nur weil im Auspuff vom Golf eine Banane steckt ;)

    Wo genau siehst Du denn Sicherheitsprobleme? Klar, es wurden mögliche Schwachstellen geöffnet, bzw. Fremdzugriffe erleichtert, aber wo genau ist das Problem?

    Das größte "Problem" ist ja, dass man dem MySQL-User der Web-Gruppe hinzufügen muss. Also das der MySQL-User auch alles lesen, was der Web-User so hat. Lesen, nicht schreiben.

    Um da aber was zu machen, muss der Angreifer erst mal eine Schwachstelle in Matomo finden, denn nur über den Host kommt er ja an LOADFILE ran. Damit könnte er dann auch alle anderen Daten auslesen, auch Configs, Passwörter etc. Aber.... Wenn der ohnehin schon Zugriff auf Matomo hat, dann hat der auch Zugriff auf den Pool, denn Matomo hat ja selbst ohnehin Vollzugriff als USER.

    Hat er eine Schwachstelle in Matomo gefunden, dann muss er erst mal noch MySQL finden. Sagt ja keiner, dass der Dienst auf Port 3306 läuft ;) Ebenso braucht er dann dort erst mal eine Schwachstelle. Aber auch wenn er das hat, dann beißt sich die Katze in den Schwanz. Was kann oder will er dann machen? Er hat lesenden Zugriff auf alle Pool-Daten aus diesem einen Host. Die hätte er auch über Matomo selbst und da hätte er auch noch Schreibrechte. An der Datenbank kann er auch nix machen. Ok, löschen, aber das war es auch schon. Löschen kann er sie aber auch über Matomo selbst.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(