Verzeichnis „/.well-known/“ überwachen

In einem bei heise online veröffentlichten Artikel ist zu lesen, dass das Verzeichnis „/.well-known/“ ein beliebtes Malware-Versteck auf gehackten Webservern ist. Der heise-Artikel empfiehlt Admins, den Inhalt von „/.well-known/“ und ggf. weiterer Unterverzeichnisse von Zeit zu Zeit zu prüfen. Um dies nicht manuell tun zu müssen, biete ich mit diesem Artikel ein Tutorial, das beschreibt, wie man diese Aufgabe mit Hilfe von systemd.path-Units automatisieren kann.

Ziel ist es, dass das System in dem Fall, dass sich der Verzeichnisinhalt von „/.well-known/“ oder eines darin enthaltenen Unterverzeichnisses ändert, eine E-Mail mit einem aktuellen Verzeichnis-Listing an eine konfigurierte E-Mail-Adresse sendet.

Update 2019-06-20: Neuen Abschnitt eingefügt

Voraussetzungen

Um diesem Tutorial folgen zu können, muss das betrachtete System

  • systemd als Init-System verwenden und
  • in der Lage sein, E-Mails zu versenden.

Darüber hinaus werden Kenntnisse in der Bearbeitung von Dateien mit einem Texteditor im Terminal vorausgesetzt.

Hinweis: Das Tutorial wurde mehrfach erfolgreich unter Ubuntu Bionic getestet. Der Leser Daniel hat versucht es unter Ubuntu Xenial nachzuvollziehen, was jedoch nicht geglückt ist. Details dazu finden sich in den Kommentaren zum Artikel.

Erstellung der Path-Unit

Im Verzeichnis /etc/systemd/system/ wird die Datei beispiel.path mit folgendem Inhalt erstellt. Der Dateiname kann selbstverständlich frei gewählt werden. Er muss lediglich auf .path enden.

[Unit]
Description="Meine '/.well-known/' Verzeichnisse auf Änderungen hin überwachen"

[Path]
PathModified=/var/www/site1/public/.well-known/
PathModified=/var/www/site1/public/.well-known/acme-challenge/
PathModified=/var/www/site2/public/.well-known/
PathModified=/var/www/site2/.well-known/acme-challenge/
PathModified=/var/www/site3/public/.well-known/
PathModified=/var/www/site3/public/.well-known/acme-challenge/
Unit=beispiel.service

[Install]
WantedBy=multi-user.target

In obigem Beispiel wird davon ausgegangen, dass der Webserver drei verschiedene Seiten ausliefert, die jeweils über ein eigenes „/.well-known/“-Verzeichnis mit jeweils einem Unterverzeichnis verfügen.

In der Sektion [Path] wird mit PathModified= der absolute Pfad zu den zu überwachenden Verzeichnissen spezifiziert, während Unit= angibt, welche Service-Unit ausgeführt werden soll, wenn sich der Inhalt eines der spezifizierten Verzeichnisse ändert. Diese Unit soll gestartet werden, wenn sich das System im Multi-User-Mode befindet.

Erstellung der Service-Unit

Als nächstes wird die auszuführende Service-Unit erstellt. Diese sollte den gleichen Namen wie die Path-Unit haben, im Unterschied zu dieser jedoch auf .service enden. Die Datei beispiel.service wird ebenfalls im Verzeichnis /etc/systemd/system/ erstellt.

[Unit]
Description="Führt Skript aus, wenn eine Datei sich geändert hat."

[Service]
Type=simple
ExecStart=/home/oglattermann/skript.sh

[Install]
WantedBy=multi-user.target

In der Service-Unit wird definiert, was getan werden soll, wenn die dazugehörige Path-Unit ausgelöst wird. In diesem Beispiel soll das hinter ExecStart= angegebene Skript ausgeführt werden.

Erstellung des auszuführenden Skripts

Findet eine Änderung in einem der überwachten Verzeichnisse statt, wird folgendes Skript ausgeführt:

#!/bin/bash
MAIL_TEXT="/tmp/well-known"
MAIL_RCP="foo@example.com"
create_mail() {
cat >"${MAIL_TEXT}" <<EOF
Achtung, der Inhalt der '/.well-known/'-Verzeichnisse wurde verändert. Die Verzeichnisse haben aktuell folgenden Inhalt:

$(find /var/www/ -type d -name ".well-known" -exec ls -lRa {} \;)
EOF
}

send_mail() {
    /usr/bin/mailx -s 'Achtung: Inhalt von /.well-known/ geändert' ${MAIL_RCP} <"${MAIL_TEXT}"
}

create_mail
send_mail

Das obige Skript ist abends auf dem Sofa entstanden und erhebt nicht den Anspruch schön oder perfekt zu sein. Es erfüllt jedoch seinen Zweck und sendet eine E-Mail an eine angegebe Empfangsadresse. In der Mail werden alle „/.well-known/“-Verzeichnisse inkl. enthaltener Dateien und Unterverzeichnisse aufgelistet, welche sich innerhalb des Suchpfads /var/www befinden.

Die Überwachung scharf schalten

Um die Überwachung zu aktivieren, sind noch die folgenden Schritte mit root-Rechten auszuführen:

  1. Die Units zu aktivieren
  2. Die Path-Unit zu starten
sudo systemctl enable beispiel.path beispiel.service
sudo systemctl start beispiel.path

Zum Test kann man nun eine neue Datei oder ein Verzeichnis in einem der überwachten Pfade erstellen. Daraufhin, sollte man eine E-Mail erhalten, welche über die Änderung informiert.

Update 2019-06-20: Auffälliges Verhalten erkannt

In den letzten Tagen habe ich sporadisch eine E-Mail von meinem Server bekommen, welche mich über eine Änderung in den überwachten Verzeichnissen informieren sollte. Jedoch konnte ich im Inhalt der E-Mail keinerlei Änderung an den Verzeichnisinhalten erkennen. Diese waren wie erwartet leer.

Meine Hypothese warum ich dennoch eine E-Mail bekam war, dass die erfolgte Änderung umgehend rückgängig gemacht wurde. So dass die Verzeichnisse bereits wieder leer waren, als die Service-Unit ausgeführt wurde, welche mir die Verzeichnisinhalte per E-Mail sendet. Um diese Hypothese zu prüfen, habe ich folgendes Kommando ausgeführt:

# touch /var/www/site1/public/.well-known/test && rm /var/www/site1/public/.well-known/test

Der kurze Test bestätigte meine Hypothese. Es wurde wie erwartet eine Datei erstellt und direkt wieder entfernt. Die Path-Unit aktivierte die verknüpfte Service-Unit und ich erhielt eine E-Mail nach welcher der Inhalt von /var/www/site1/public/.well-known/ leer war.

Das beobachtete Verhalten empfinde ich als unschön, da ich so nicht mehr feststellen kann, was für eine Änderung stattgefunden hat und die E-Mail-Benachrichtigung damit nicht zum gewünschten Erkenntnisgewinn führt.

Noch ist unklar, ob dies einer fehlerhaften Konfiguration meinerseits, einem Bug, oder dem Design geschuldet ist. Falls jemand von euch einen besseren Einblick in diese Thematik besitzt, freue ich mich über euren Kommentar.

Ein Hinweis zum Schluss

Erwähnt werden muss, dass nur Änderungen signalisiert werden können, die vom Kernel ausgeführt werden. Führen andere Maschinen auf per Netzwerk eingebundenen Pfaden Änderungen durch, wird das nicht signalisiert.

https://www.my-it-brain.de/wordpress/unit-typ-systemd-path-kurz-vorgestellt/#comment-1624

Quellen und weiterführende Links

9 Gedanken zu „Verzeichnis „/.well-known/“ überwachen

  1. Daniel

    Hallo und danke für deine Anleitung!
    Leider funktioniert der automatische Mailversand oder die Änderungserkennung nicht.
    Mein Server erfüllt deine genannten Vorraussetzungen und das Skript versendet eine Mail mit plausiblem Inhalt, wenn ich es manuell starte. Wenn ich aber eine Datei im well-known Verzeichnis erstelle, wird keine Mail gesendet. Kann es an irgendwelchen Rechten liegen? Habe alle deine Befehle als root ausgeführt.

    Vielen Dank und viele Grüße,
    Daniel

    Antworten
    1. Jörg

      Hallo Daniel,

      wenn das Shell-Skript bei einer manuellen Ausführung eine E-Mail versendet, ist der Mailversand in Ordnung. Das Problem scheint dann eher bei der Erkennung der Änderung zu liegen.

      Hast du beide Units aktiviert und die Path-Unit gestartet? Wenn du möchtest kannst du hier einmal die Ausgabe von `sudo systemctl status .{path,service}` posten.

      Hast du nochmal kontrolliert, ob wirklich der korrekte Pfad in der Path-Unit eingetragen ist und sich nicht vielleicht ein Tippfehler eingeschlichen hat?

      LG
      Jörg

      Antworten
      1. Daniel

        danke für deine Antwort! Bisher konnte ich noch nichts erreichen. Habe auch keine Tippfehler gefunden… Hier die Ausgaben der Statusmeldungen:

        systemctl status wellknown-change-check.path
        wellknown-change-check.path – „Meine ‚/.well-known/‘ Verzeichnisse auf Änderungen hin überwachen“
        Loaded: loaded (/etc/systemd/system/wellknown-change-check.path; enabled; vendor preset: enabled)
        Active: active (waiting) since Sun 2019-04-07 20:00:45 CEST; 7s ago

        und
        wellknown-change-check.service – Führt Skript aus, wenn eine Datei sich geändert hat.
        Loaded: loaded (/etc/systemd/system/wellknown-change-check.service; enabled; vendor preset: enabled)
        Active: inactive (dead) since Sun 2019-04-07 20:00:41 CEST; 25s ago
        Process: 4150 ExecStart=/root/wellknown-change-check.sh (code=exited, status=0/SUCCESS)
        Main PID: 4150 (code=exited, status=0/SUCCESS)

        Apr 07 20:00:41 mail systemd[1]: Started Führt Skript aus, wenn eine Datei sich geändert hat..

        Antworten
        1. Jörg

          Hi,

          folgende Zeilen deines Postings belegen, dass deine Service-Unit heute um 20:00:41 erfolgreich ausgeführt wurde:

          > Active: inactive (dead) since Sun 2019-04-07 20:00:41 CEST; 25s ago
          > Process: 4150 ExecStart=/root/wellknown-change-check.sh (code=exited, status=0/SUCCESS)
          > Main PID: 4150 (code=exited, status=0/SUCCESS)

          Meine nächste Vermutung ist, dass die Service-Unit das Shell-Skript nicht korrekt triggert. Es kann jedoch auch ein Problem im Postfix geben, da ein anderer User die Mail versendet, wenn die Service-Unit das Skript ausführt, als wenn du es manuell startest.

          Was siehst du in `/var/log/mail.log`, nachdem die Service-Unit aktiviert wurde? Evtl. siehst du hier, dass es ein Problem beim Mailversand gibt.

          MfG
          Jörg

          Antworten
          1. Daniel

            Hmm im mail.log taucht gar nichts auf, wenn ich den service starte, oder wenn ich eine Testdatei im well-known ordner erstelle.

            Ich poste vorsichtshalber mal den Inhalt der .path und .service sowie vom Skript:

            /etc/systemd/system/wellknown-change-check.path
            [Unit]
            Description=“Meine ‚/.well-known/‘ Verzeichnisse auf Änderungen hin überwachen“

            [Path]
            PathModified=/var/www/html/.well-known/
            Unit=wellknown-change-check.service

            [Install]
            WantedBy=multi-user.target


            /etc/systemd/system/wellknown-change-check.path
            [Unit]
            Description=Führt Skript aus, wenn eine Datei sich geändert hat.

            [Service]
            Type=simple
            ExecStart=/root/wellknown-change-check.sh

            [Install]
            WantedBy=multi-user.target

            nano /root/wellknown-change-check.sh
            #!/bin/bash
            MAIL_TEXT=“/root/well-known“
            MAIL_RCP=“xxx@xxx.xxx“
            create_mail() {
            cat >“${MAIL_TEXT}“ <<EOF
            Achtung, der Inhalt der '/.well-known/'-Verzeichnisse wurde verändert. Die Verzeichnisse haben aktuell folgenden Inhalt:

            $(find /var/www/ -type d -name ".well-known" -exec ls -lRa {} \;)
            EOF
            }

            send_mail() {
            /usr/bin/mailx -s 'Achtung: Inhalt von /.well-known/ geändert' ${MAIL_RCP} <"${MAIL_TEXT}"
            }

            create_mail
            send_mail

          2. Jörg Kastning Beitragsautor

            Ok, wenn keine E-Mail versendet wird, wenn du die Service-Unit manuell startest, scheint irgendwo in dieser ein Fehler zu stecken. Zum Test habe ich auf meinem System die Service-Unit gestartet und es wurde eine E-Mail versendet.

            Bitte ändere in deiner Service-Unit die Zeile, welche mit Description beginnt, so dass sie wie folgt lautet:
            Description="Führt Skript aus, wenn eine Datei sich geändert hat."

            In meiner Service-Unit verwende ich ebenfalls doppelte Anführungszeichen, welche ich im obigen Tutorial jedoch unterschlagen habe. Hier könnte der Fehler liegen.

            Bitte teste dies und gib mir eine Rückmeldung.

            LG
            Jörg

  2. Daniel

    Lieber Jörg, danke für deine Mühen. Leider hat es mit den doppelten Anführungszeichen auch nicht geklappt.
    Sollte die Änderung sofort bemerkt werden? Oder gibt es ein Zeitintervall, in dem der Ordner auf Änderungen geprüft wird? Könnte es an irgendwelchen Rechten liegen? Habe alle Befehle unter root ausgeführt und auch das Skript im /root/ Verzeichnis gespeichert und ausführbar gemacht.
    Ich verwende Ubuntu 16.04. mit einem funktionierenden Postfix/Dovecot/Mysql-Mailserver und diversen WordPress-Seiten.

    Antworten
    1. Jörg Kastning Beitragsautor

      Hallo Daniel,

      nach Änderungen an einer Unit-Datei, musst du diese Unit neu laden. Dies geht mit folgendem Befehl:

      sudo systemctl daemon-reload

      Erst danach greifen die Änderungen. Probier das bitte noch einmal aus. Die Überprüfung passiert nicht zeitgesteuert. Der Kernel registriert die Änderung sofort, wenn sie passiert.

      Falls es nach dem Reload der Units noch nicht geht, sende mir bitte noch die Ausgaben der folgenden Kommandos. Diese kannst du mir auch gern per E-Mail an ‚webmaster(ett)my-it-brain(Punkt)de‘ senden, wenn dir das lieber ist.

      Interessante Ausgaben:


      :~$ cat /etc/*-release
      :~$ uname -r
      :~$ dpkg -l systemd

      Antworten
  3. Jörg Kastning Beitragsautor

    Zur allgemeinen Information
    ===========================

    Ich habe das Tutorial unter Ubuntu 18.04 Server mit Kernel 4.15.0-47-generic und systemd 237-3ubuntu10.17 erfolgreich getestet. Daniel verwendet Ubuntu 16.04 Server mit Kernel 4.4.0-145-generic und systemd 229-
    4ubuntu21.19. Ob sein Problem mit der eingesetzten Version oder seiner Konfiguration zusammenhängt, versuchen wir gerade via E-Mail zu erörtern.

    Update 2019-04-10: Daniel hat das Tutorial erfolgreich auf einem System mit Ubuntu 18.04 nachvollziehen können. Auf dem System mit 16.04 konnten wir hingegen die Ursache, warum keine E-Mail versendet wird, nicht finden.

    Daniel und ich haben das weitere Troubleshooting mit Daniels Zustimmung aus Zeitmangel beendet. Ich freue mich dennoch, wenn sich jemand findet, der versucht das Tutorial auch mit 16.04 umzusetzen.

    Viele Grüße
    Jörg

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.