Überwachung von Shellskripten

Bereits in dem Abschnitt 12.3 wurde gezeigt, wie AppArmor unterschiedliche Benutzer an Hand der verwendeten Shell unterscheiden kann. Hier sollen nun Shellskripte überwacht werden. Auch das ist möglich. Sinnvoll ist das zum Beispiel bei Skripten, die automatisch durch den Benutzer root aufgerufen werden. Ein typisches Beispiel sind die Cron-Jobs, die von dem System automatisch über die Datei /etc/crontab gestartet werden:
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1
Diese Cron-Tabelle startet alle 15 Minuten den Befehl /usr/lib/cron/run-crons als Benutzer root. Dieser Befehl prüft, ob einer der Cron-Jobs in den Verzeichnissen /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly oder /etc/cron.monthly abgearbeitet werden muss. Auch diese werden dann mit dem Benutzer root gestartet.

In der Vergangenheit waren vor allem selbstgeschriebene Cron-Skripte häufig Einfallstore für lokale Angreifer, die durch Unterwanderung der Skripte auf root-Privilegien zugreifen konnten.

Die Überwachung von Shellskripten ist aber immer interessant, wenn diese Skripte automatisch auch durch andere Programme, wie Web-Server, Monitoring-Software (z.B. Nagios) oder remote per SSH gestartet werden.

Ein typisches Skript, welches im Interesse des Angreifers steht, ist das Skript /etc/cron.daily/suse.de-clean-tmp. Dieses Skript prüft täglich die Dateien in den verschiedenen temporären Verzeichnissen und löscht nach Ablauf einer Schonfrist die in diesen Verzeichnissen befindlichen Dateien. Ein Angreifer könnte versuchen dem Skript zusätzliche Verzeichnisse unterzuschieben. Daher ist es sinnvoll mit AppArmor den Dateizugriff zu überprüfen.

Hierzu starten Sie wieder den Profilassistenten Genprof auf der Kommandozeile oder mit Yast: genprof /etc/cron.daily/suse.de-clean-tmp. Anschließend rufen Sie als root das Skript auf. Nach seiner Arbeit überprüfen Sie mit Genprof die Zugriffe und erzeugen das Profil. Ein typisches Profil für das Skript könnte folgendermaßen aussehen:

# vim:syntax=apparmor
# Last Modified: Sat Aug 12 12:18:34 2006
#include <tunables/global>

/etc/cron.daily/suse.de-clean-tmp {
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/nameservice>

  / r,
  /bin/bash ix,
  /bin/pwd ixr,
  /bin/rm ixr,
  /etc/cron.daily/suse.de-clean-tmp r,
  /etc/sysconfig/cron r,
  /tmp r,
  /tmp/** wr,
  /usr/bin/find ixr,
  /usr/bin/safe-rm ixr,
}
Die Abstraction abstractions/nameservice wird benötigt, da das Skript es erlaubt, die Dateien bestimmter Benutzer nicht zu löschen. Hierfür benötigt das Skript Namensauflösung. So ist es mit AppArmor auch möglich, Skripte zu überwachen. Speziell bei Skripten aus eigener Entwicklung sollte über den Einsatz von AppArmor nachgedacht werden.

Ralf Spenneberg 2007-11-13