PAM und pam_apparmor

Mit diesem Modul, welches noch nicht mit SuSE Linux Enterprise Server 9 oder SuSE Linux Professional 10.1 ausgeliefert wird, kann jede PAM-fähige Applikation bei dem Wechsel eines Benutzer in ein Subprofil wechseln. Eine typische Anwendung hierfür ist zum Beispiel die Secure-Shell oder auch der Login-Befehl. Bei der Anmeldung können diese Befehle direkt ein Subprofil aktivieren. Wenn die anschließend aufgerufene Shell das Profil erbt (ixr), ist gewährleistet, dass der Benutzer während seiner Arbeit von AppArmor überwacht wird.

Hierfür müssen Sie zunächst pam_apparmor installieren, falls dies auf Ihrer Distribution noch nicht der Fall ist. Hierzu laden Sie zunächst das Quelltextpaket pam_apparmor-2.0.tar.gz von der Homepage http://forge.novell.com/modules/xfmod/project/?apparmor. Für die erfolgreiche Übersetzung müssen Sie noch das pam-devel-Paket installieren. Dann können Sie das Quelltext-Archiv auspacken und mit make und make install übersetzen. Nun müssen Sie das PAM-Modul noch in der Konfiguration aktivieren. Editieren Sie hierzu unter SuSE die Datei /etc/pam.d/common-session und fügen Sie die folgende Zeile hinzu:

session required pam_apparmor.so
Modernere Versionen von pam_apparmor erlauben die Auswahl der Eigenschaft, die für die Bestimmung des Profils verwendet werden soll. Während die alte Version 2.0 nach einem Profil entsprechend dem Benutzernamen sucht, suchen modernere Versionen per Default nach einem Profil entsprechend der primären Gruppe. Sie können das aber auch bei diesen Versionen einstellen und zunächst nach einem Profil für den Benutzer und dann einem Profil für die primäre Gruppe suchen. Wenn beides nicht gefunden wird, können Sie zusätzlich ein Default-Profil angeben. Auf anderen Distributionen editieren Sie bitte die entsprechende Datei und fügen die Zeile hinzu. Sie können auch ein RPM-Paket erzeugen. Dann können Sie später die Installation leichter nachvollziehen und die PAM-Konfigurationsdatei wird automatisch angepasst. Hierzu kopieren Sie das Quelltextarchiv nach /usr/src/packages/SOURCES[*]. Dann können Sie nach dem Entpacken des Archives die Befehle make und rpmbuild -bb pam_apparmor.spec aufrufen. Der letztere Befehl baut das RPM-Paket und legt es in dem Verzeichnis /usr/src/packages/RPMS/i586/ ab. Das Paket können Sie mit rpm -i pam_apparmor-2.0-1.i586.rpm installieren.

Um nun pam_apparmor mit der Secure-Shell zu benutzen, müssen Sie für die Secure-Shell ein Profil erzeugen. Dies kann manuell erfolgen, ist aber am leichtesten mit Hilfe des Befehls genprof. Hierzu geben Sie auf dem AppArmor-System den Befehl genprof /usr/sbin/sshd ein. So erzeugt der Genprof-Befehl (siehe 10.3.6) ein minimales Profil für die Secure-Shell und aktiviert dieses im Lernmodus. Nun können Sie sich per SSH mit unterschiedlichen Benutzern anmelden und verschiedene Aktivitäten ausführen. Denken Sie daran, auch der Benutzer root ist von der Überwachung betroffen. Sie können so also zum Beispiel per SSH einen Zugang als root erlauben, der lediglich den Apache 2.0 Webserver neu starten darf.

Nachdem Sie sich wieder per SSH von dem System abgemeldet haben, werten Sie mit Genprof die im Lernmodus aufgezeichneten Ereignisse aus. Dabei erzeugt Genprof dann das Profil für die Secure-Shell. Ein mögliches Profil ist im folgenden abgedruckt und befindet sich auch auf der CD im Verzeichnis /Listings/.

# vim:syntax=apparmor
# Last Modified: Thu Aug 10 13:00:13 2006
#include <tunables/global>

/usr/sbin/sshd {
  #include <abstractions/authentication>
  #include <abstractions/base>
  #include <abstractions/consoles>
  #include <abstractions/nameservice>
  #include <abstractions/wutmp>

  capability chown,
  capability net_bind_service,
  capability setgid,
  capability setuid,
  capability sys_chroot,
  capability sys_tty_config,

  /dev/ptmx rw,
  /etc/environment r,
  /etc/hosts.allow r,
  /etc/hosts.deny r,
  /etc/motd r,
  /etc/ssh/* r,
  /proc/*/fd r,
  /usr/sbin/sshd ixr,
  /var/run/sshd.init.pid w,

  ^AUTHENTICATED {
  }

  ^EXEC {
  }

  ^PRIVSEP {
  }

  ^PRIVSEP_MONITOR {
  }

  ^ralf {
    #include <abstractions/authentication>
    #include <abstractions/base>
    #include <abstractions/bash>
    #include <abstractions/consoles>
    #include <abstractions/nameservice>

    capability setuid,

    /bin/bash ixr,
    /bin/grep ixr,
    /bin/hostname ixr,
    /bin/sed ixr,
    /bin/sort ixr,
    /bin/uname ixr,
    /dev/ptmx rw,
    /etc/environment r,
    /etc/manpath.config r,
    /etc/motd r,
    /etc/nntpserver r,
    /etc/profile.d r,
    /etc/sysconfig/* r,
    /home/ralf r,
    /home/ralf/* rw,
    /lib/ld-2.4.so ixr,
    /sbin/yast2 ixr,
    /usr/bin/getopt ixr,
    /usr/bin/manpath ixr,
    /usr/bin/tty ixr,
    /usr/lib/YaST2/bin/yast2-funcs r,
    /usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/bin/java ixr,
    /usr/share/applications/YaST2 r,
    /usr/share/applications/YaST2/* r,
    /var/log/Xorg.0.log r,
  }

  ^root {
    #include <abstractions/authentication>
    #include <abstractions/base>
    #include <abstractions/bash>
    #include <abstractions/consoles>
    #include <abstractions/nameservice>
    #include <abstractions/php5>
    #include <abstractions/wutmp>

    capability dac_override,
    capability net_bind_service,
    capability setgid,
    capability setuid,

    / r,
    /bin/basename ixr,
    /bin/bash ix,
    /bin/grep ixr,
    /bin/hostname ixr,
    /bin/ln ixr,
    /bin/sed ixr,
    /bin/sort ixr,
    /bin/stty ixr,
    /bin/uname ixr,
    /bin/usleep ixr,
    /dev/blog w,
    /etc r,
    /etc/apache2/sysconfig.d/* w,
    /etc/environment r,
    /etc/init.d r,
    /etc/init.d/apache2 ixr,
    /etc/manpath.config r,
    /etc/nntpserver r,
    /etc/profile.d r,
    /etc/rc.status r,
    /etc/sysconfig/* r,
    /proc r,
    /proc/*/stat r,
    /proc/*/statm r,
    /sbin/startproc ixr,
    /sbin/yast2 ixr,
    /usr/bin/getopt ixr,
    /usr/bin/manpath ixr,
    /usr/bin/readlink ixr,
    /usr/bin/tty ixr,
    /usr/lib/YaST2/bin/* r,
    /usr/sbin r,
    /usr/sbin/httpd2 w,
    /usr/sbin/httpd2-prefork pxr,
    /usr/share/apache2/* r,
    /usr/share/apache2/find_mpm ixr,
    /usr/share/apache2/get_includes ixr,
    /usr/share/apache2/get_module_list ixr,
    /usr/share/applications/YaST2 r,
    /usr/share/applications/YaST2/* r,
    /var/log/Xorg.0.log r,
    /var/log/apache2/rcapache2.out w,
    /var/run/httpd2.pid r,
  }
}
Eine kurze Erläuterung des Profils ist sicherlich angebracht. Zunächst handelt es sich um ein ganz einfaches AppArmor-Profil mit einigen Subprofilen. Die folgenden Subprofile sind Relikte der AppArmor-Entwicklung als eine ChangeHat-fähige Secure-Shell entwickelt werden sollte.
  ^AUTHENTICATED {
  }

  ^PRIVSEP {
  }

  ^PRIVSEP_MONITOR {
  }
Ob diese Entwicklung jemals abgeschlossen wird, ist heute noch nicht klar. Dennoch fügt Genprof diese Hats grundsätzlich in ein Secure-Shell-Profil ein. Aktuell kann man diese einfach ignorieren und nach Belieben auch löschen. Ob zukünftige Versionen diese nutzen, bleibt abzuwarten. Möglicherweise werden dann die Hats auch umbenannt.

Anschließend erkennen Sie jeweils einen Hat für den Benutzer ralf und root. Der Benutzer ralf darf nur sehr wenige Funktionen ausüben. Bei allen Befehlen, die der Benutzer ralf aufrufen darf, wurde darauf geachtet, dass diese Befehle das Subprofil erben. Hierzu wurden die AppArmor-Rechte ixr zugewiesen.

Ähnlich verhält es sich mit dem Benutzer root. Auch dieser Benutzer darf nur einen begrenzten Satz an Befehlen aufrufen. Alle Befehle erben das Subprofil (ixr). Einzige Ausnahme ist der Webserver Apache 2.0. Für den Aufruf dieses Programmes wird die Existenz eines eigenen Profils gefordert:

    /usr/sbin/httpd2-prefork pxr,
So läuft der Webserver immer in seinem eigenen Profil. Existiert dieses Profil nicht, so kann der Webserver nicht gestartet werden. Außerdem benötigt der Benutzer root nun keinen Lese- und Schreibzugriff auf die Dateien des Webservers. Diese Zugriffe werden in dem Profil des Webservers verwaltet.

Möchten Sie nur für bestimmte Benutzer ein eigenes Subprofil anlegen und alle weiteren Benutzer in einem Profil zusammenfassen oder gar ohne AppArmor-Schutz Zugriff auf das System gewähren, so können Sie manuell einen Hat mit dem Namen ^DEFAULT anlegen. Hier können Sie entweder ein Default-Profil für alle Benutzer definieren oder auch die Ausführung der Bash-Shell ohne Einschränkung (/bin/bash uxr) erlauben. Leider legt die aktuelle Version von Genprof das Default-Profil bei der Secure-Shell fälschlicherweise unter dem Namen ^EXEC an, während das PAM-Modul, falls es kein Subprofil mit dem entsprechenden Namen findet, das Subprofil mit dem Namen ^DEFAULT verwendet.

Ralf Spenneberg 2007-11-13