Einzelne Benutzer mit unterschiedlichen Profilen

AppArmor selbst ist nicht in der Lage zwischen unterschiedlichen Benutzern zu unterscheiden. Es gibt jedoch häufig Bedarf für einen Schutz des Systems vor den Benutzern und der Benutzer untereinander. Im letzten Abschnitt (siehe 12.2.2) wurde eine alternative Vorgehensweise besprochen. Welche der beiden Vorgehensweisen Sie wählen, hängt sicherlich von dem Einsatzzweck und der Umgebung ab. Eine klassische Anwendung ist ein Shared-Hosting-Webserver auf dem unterschiedliche Kunden ihre Webpräsenz hosten. Jeder Kunde soll sich mit der Secure-Shell auf dem System anmelden können und seine Webpräsenz administrieren können. Das System und vor allem auch die Webpräsenzen der anderen Kunden sollen vor seinem Zugriff jedoch geschützt werden.

Dies kann nur erfolgen, indem Sie jedem Benutzer eine eigene Shell zuweisen und entsprechende Profile für die Shell erzeugen. Über die Datei /etc/passwd weisen Sie dann jedem Benutzer seine eigene Shell zu.

Erzeugen Sie zunächst ein Verzeichnis, in dem Sie die Shells sämtlicher Benutzer anlegen. Kopieren Sie dann als erstes die von Ihnen ausgewählte Shell in das Verzeichnis. Anschließend legen Sie für jeden Benutzer einen Hardlink auf die Shell an und weisen dem Benutzer die entsprechende Shell zu.

# mkdir /opt/shells/
# cp /bin/bash /opt/shells
# ln /opt/shells/bash /opt/shells/ralf-bash
# ln /opt/shells/bash /opt/shells/claudia-bash
# usermod -s /opt/shells/ralf-bash ralf
# usermod -s /opt/shells/claudia-bash claudia
Legen Sie nach diesem Muster für jeden Benutzer einen Hardlink an. Wenn verschiedene Benutzer über identische Zugriffsrechte verfügen sollen, genügt natürlich eine Shell für diese Gruppe. Diese Shell nennen Sie dann vielleicht /opt/shells/$ <$ group$ >$ -shell und erzeugen hierfür das Profil. Dann müssen Sie natürlich das Profil anpassen, so dass der Zugriff auf die Heimatverzeichnisse gewährleistet ist. Nun müssen Sie die Profile erzeugen. Ein einfaches Grundgerüst für diese Profile kann das folgende Listing[*] sein:
# vim:syntax=apparmor
# Last Modified: Tue Aug  8 17:51:36 2006

@{USER}=ralf
@{HOMEDIRS}=/home/
@{HOME}=@{HOMEDIRS}/@{USER}/

/opt/shells/ralf-bash {
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/consoles>
  #include <abstractions/nameservice>
  #include <abstractions/user-manpages>
  #include <abstractions/user-tmp>

  /bin/grep ixr,
  /bin/uname ixr,
  /bin/vim ixr,
  /usr/bin/manpath ixr,
  /usr/bin/tty ixr,
  /usr/bin/wget ixr,
  /bin/hostname ixr,
  /etc/vimrc r,
  /etc/manpath r,
  /etc/nntpserver r,
  /home/@{USER} r,
  /home/@{USER}/** rwl,
  /opt/shells/@{USER}-bash r,
  /usr r,
  /usr/share/** r,
}
Dieses Profil erlaubt der Bash den Aufruf der üblichen Befehle grep, vim, wget, etc. Dabei darf der Benutzer nur die Dateien in seinem eigenen Verzeichnis betrachten und verändern. Die Abstraction abstractions/user-tmp erlaubt auch noch den Zugriff auf die temporären Verzeichnisse. Bei einem Zugriff auf andere Verzeichnisse wird der Zugriff verweigert:
samson:/home/ralf$ cd /var
samson:/var$ ls
/bin/ls: .: Operation not permitted
Dieses Profil ist natürlich sehr eingeschränkt. Selbst das Umbenennen von Dateien ist nicht erlaubt. Hierzu muss der Benutzer den Befehl /bin/mv aufrufen dürfen. Die Anpassung des Profils in dieser Beziehung ist aber sehr einfach. Fügen Sie einfach eine Zeile hinzu:
  /bin/mv   ixr,
Sie können so sehr einfach die Privilegien der angemeldeten Benutzer verwalten und ihren Zugriff überwachen.

Das abgebildete Profil verwendet für die einfache Anpassung des Benutzernamens Variablen. Leider kann bei den aktuellen Versionen von AppArmor die Variable nicht in dem Namen des überwachten Programmes verwendet werden. Dieser Name muss ohne Verwendung von Variablen mit seinem absoluten Pfad angegeben werden

Gruppieren Sie die Befehle, die Sie den verschiedenen Benutzern zur Verfügung stellen möchten in einzelnen Dateien. Sie können dann diese mit Include-Direktiven einlesen. Erzeugen Sie zum Beispiel eine Datei abstractions/dateizugriff. In dieser Datei hinterlegen Sie alle Befehle, die für den Dateizugriff benötigt werden:

# abstractions/dateizugriff
# Uebliche Befehle fuer den Dateizugriff


  /bin/awk      ixr,
  /bin/basename ixr,
  /bin/cat      ixr,
  /bin/chmod    ixr,
  /bin/cp       ixr,
  /bin/date     ixr,
  /bin/df       ixr,
  /bin/echo     ixr,
  /bin/egrep    ixr,
  /bin/fgrep    ixr,
  /bin/gawk     ixr,
  /bin/grep     ixr,
  /bin/gunzip   ixr,
  /bin/gzip     ixr,
  /bin/hostname ixr,
  /bin/ls       ixr,
  /bin/mkdir    ixr,
  /bin/more     ixr,
  /bin/mv       ixr,
  /bin/rm       ixr,
  /bin/rmdir    ixr,
  /bin/sed      ixr,
  /bin/sort     ixr,
  /bin/tar      ixr,
  /bin/touch    ixr,
  /bin/vim      ixr,
  /bin/vi       ixr,
  /bin/zcat     ixr,
Genauso können Sie eine Datei abstractions/prozessverwaltung anlegen, in der Sie den Zugriff auf die Befehle ps, top, kill, nice, renice und pidof erlauben. Dann können Sie einfach durch Auswahl der Abstraction den Benutzern unterschiedliche Funktionen zuweisen.

Hiermit ist es auch möglich, mehreren Benutzern die UserID 0 zuzuweisen und gewisse Aufgaben als root auszuführen. Die Tragweite ihrer Aktionen wird von dem Profil eingeschränkt, wenn Sie eine spezielle Shell bei ihrem Login zugewiesen bekommen und diese auch nicht ändern dürfen! Ein schreibender Zugriff auf die Datei /etc/passwd muss für diese Benutzer natürlich unterbunden werden!

Ralf Spenneberg 2007-11-13