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:
- Die Units zu aktivieren
- 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
- https://www.my-it-brain.de/wordpress/unit-typ-systemd-path-kurz-vorgestellt/
- systemd.unit(5)
- systemd.path(5)
- systemd.service(5)