Der ADMIN 05/13 wirft einen Blick auf die frei verfügbaren Cloud-Frameworks von Eucalyptus über OpenNebula bis OpenStack. Gute Aussichten für skalierbare ... (mehr)

Fenster zur Welt

Viele Dienstprogramme und Werkzeuge müssen Zugriff auf bestimmte Ressourcen Zugriff erhalten. Ein Beispiel wurde im Zusammenhang mit Tcpdump bereits angesprochen. Dieses Tool benötigt Zugriff auf den Domain Nameserver, um IP-Adressen in Hostnamen umzuwandeln. Innerhalb des Programms wird dazu der Name-Service-Switch (NSS) aufgerufen. Da Capsicum solche Zugriffe allerdings unterbindet, musste eine andere Lösung gefunden werden. Es entstand das Tool Casper (Capsicum Service), das die Möglichkeit bietet, als Daemon-Prozess kontrolliert Ausnahmeregeln zuzulassen.

Die Funktionsweise von Casper ist anhand Abbildung 4 schnell erklärt. Casper startet ein Programm wie das in diesem Beispiel genannte »tcpdump« , das in einer Sandbox eingeschlossen ist. Bevor alle Überwachungsmechanismen scharf geschaltet werden, meldet das Programm die Ausnahmeregeln beim Casper-Daemon an und aktiviert anschließend die Schutzmechanismen.

Abbildung 4: Kommunikationsweg von Tcpdump und Casper bei einer DNS-Anfrage.

Eine solche Aktion muss vorher erledigt werden, da nach der Aktivierung von Capsicum keinerlei Kommunikation mit Systemdiensten und auch nicht mit Casper möglich ist. Im Beispiel wurde dies wie in Listing 3 realisiert. Der vollständige Code findet sich unter [7].

Listing 3

Casper

[...]
#ifdef HAVE_LIBCAPSICUM
if (nflag) {
 capcas = NULL;
 capdns = NULL;
} else {
 capcas = cap_init();
 if (capcas == NULL)
  error("unable to contact Casper");
 capdns = cap_service_open(capcas,
  "system.dns");
 if (capdns == NULL)
  error("unable to open \\
   system.dns service");
/*Limit system.dns to rev. DNS lookups.*/
 limits = nvlist_create(0);
 nvlist_add_string(limits,
  "type", "ADDR");
 nvlist_add_number(limits,
  "family", (uint64_t)AF_INET);
 nvlist_add_number(limits,
  "family", (uint64_t)AF_INET6);
 if (cap_limit_set(capdns, limits) < 0)
  error(
   "unable to limit access to \\
   system.dns service");
 nvlist_destroy(limits);
/*Casper capability no longer needed.*/
 cap_close(capcas);
}
#endif  /* HAVE_LIBCAPSICUM */
[...]

Zunächst wird mit »cap_init()« der Casper-Daemon kontaktiert und das Programm registriert. Im nächsten Schritt meldet die Funktion »cap_service_open(...)« die gewünschte Ausnahme beim Daemon an. In diesem Beispiel sind es DNS-Anfragen, was durch die Option »system.dns« gekennzeichnet ist. Der Daemon erwartet eine durch »limits = nvlist_create(...)« bezeichnete Liste mit der genauen Funktionalität. Das erste Element beschreibt, dass es sich um eine Umwandlung von IP-Adressen in Hostnamen handelt, was durch »type« und »ADDR« angezeigt wird. Die beiden nächsten Einträge beschreiben die IP-Adressfamilie. In diesem Beispiel sind es IPv4- und IPv6-Adressen (AF_INET und AF_INET6).

Diese Liste übergibt man mit »cap_limit_set(...)« an den Daemon Casper und löscht sie anschließend, da sie vom Programm Tcpdump nicht mehr benötigt wird. Ab diesem Zeitpunkt hat Casper alle Informationen, um dem Tool einen Zugriff auf den Domain Name Service zu gestatten.

Gezielt geöffnet

Man kann sich die Frage stellen, ob damit nicht das Sandbox-Konzept ausgehebelt wird. Casper erteilt nicht uneingeschränkt Zugriff auf die Ressource, sondern nutzt auch hier die unter Capsicum bereitgestellte feine Granulierung der Rechtevergabe. Außerdem legt der Autor des Programms fest, wie die Kommunikation mit der Außenwelt stattfinden darf und nicht irgendein externes Programm.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019