Mancher, der die Verwaltung seiner Unix-, Linux- oder Windows-Systeme gerne einem Tool für automatisiertes Konfigurationsmanagement überlässt, greift zu Cfengine. Auf vielfachen Wunsch erbt die neue Version 3.4.0 auch ein Feature der kommerziellen Version: Posix-ACLs unter Unix, Linux und Windows.
Bereits zum vierten Mal jährt sich im kommenden Januar die Release der Version 3 von Cfengine ([1], [2]). Nach derart langer Wartezeit steht jetzt die Ausgabe 3.4 der Community-Edition an, eine Beta ist bereits unter [3] erhältlich und liegt auch auf der DELUG-DVD.
ACL-Request erfüllt
Die kommerzielle Version glänzt zwar mit erweiterten Reportingfeatures sowie nativer LDAP-, Datenbank- und Virtualisierungs-Unterstützung, doch reicht die freie Version vielen Systembetreuern in kleinen und mittleren Unternehmen voll aus. Verzichten mussten die Community-Anwender aber bisher auf den Support für die Windows-Registry und das automatische Setzen von Posix-ACLs.
Vor allem Letzteres sorgte bei den Anwendern für Unmut, auf den das Cfengine-Team jetzt reagiert hat: Ab der kommenden Version 3.4.0 übernehmen die Cfengine-Macher in Oslo das ACL-Feature aus der kostenpflichtigen in die kostenfreie Variante. Dieser Artikel zeigt, welche Klimmzüge Admins bisher machen mussten und wie die neue Version den Umgang mit ACLs vereinfacht.

Abbildung 1: Die Ausgabe von »/var/cfengine/bin/cf-agent -vf /etc/cfengine3/acl_example_Posix.cf« zeigt detailreich an der Kommandozeile, wie Cfengine 3 die Posix-ACLs erfolgreich setzt.
Das Setzen von ACLs unter Unix, Linux und Windows war in Cfengine 3 bisher nur mit dem umständlichen Aufrufen von Tools wie Setfacl möglich. Listing 1 zeigt eine mögliche Vorgehensweise. Erfahrene Admins werden die hässlichen Passagen schnell erkennen. Das ist weder sauber, noch entspricht es den Empfehlungen der Cfengine-Macher.
Listing 1
Setfacl-Aufruf
01 body common control {
02 bundlesequence => { "set_acls" };
03 }
04
05 bundle agent set_acls {
06 vars:
07 "shared_directories" slist => { "/home/shared", "/home/archive" };
08
09 files:
10 "$(shared_directories)/."
11 create => "true";
12
13 commands:
14 "/usr/bin/setfacl -m u:backup:rwx,g:games:rwx ${shared_directories}"
15 comment => "Setting ACLs on the shared directories.";
16 }
Nutzer der Community-Variante hatten bisher jedoch keine andere Wahl. Zunächst definierten sie die Sektion »body common control« , die Teil jedes Cfengine-Snippet ist. Dieser Control Body enthält im Listing lediglich einen Verweis auf das auszuführende Bundle, kann aber auch noch eine optionale Versionsnummer des Skripts beinhalten.
Bundles und Promises
Das anschließende Bundle des Typs »agent« mit der Bezeichnung »set_acls« enthält dann die eigentlichen Aktionen (Promises), die Cfengine für das Setzen der Zugriffsrechte ausführen muss. Das erste Promise vom Typ »vars« beinhaltet eine »slist« -Variable mit dem Namen »shared_directories« . Die legt, jeweils in Anführungszeichen und durch ein Komma getrennt, eine Liste an Verzeichnissen fest, die der Admin später bearbeitet wissen will. »slist« gibt den Datentyp vor – solche Variablen sind besonders nützlich, wenn später eine Iteration durch die einzelnen Werte erfolgen soll.
Das Promise vom Typ »files« enthält im Normalfall den Namen der zu bearbeitenden Datei. Da dieses Beispiel jedoch eine Liste von Verzeichnissen abarbeiten soll, gibt das Skript einfach den entsprechenden Variablennamen mit vorangestelltem Dollarzeichen und umschließenden Klammern an. Wichtig ist der abschließende Slash samt Punkt (»/.« ): Mit dieser Zeichenkette teilt der Anwender Cfengine mit, dass es sich um Verzeichnisse und nicht um Dateien handelt.
Intelligenter
Cfengine 3 ist an dieser Stelle intelligent genug, den Inhalt der Slist-Variablen zu erkennen, und iteriert durch die einzelnen Werte. Für jedes Verzeichnis in »shared_directories« führt es also die Aktion »create« aus. Dieses Promise könnte der Admin auch weglassen, wenn er sicher ist, dass die zu bearbeitenden Verzeichnisse immer existieren. In diesem Beispiel soll der Anwender jedoch kein Risiko eingehen, daher lässt er Cfengine die Ordner sicherheitshalber anlegen.
Im Commands-Promise steht das Setfacl-Kommando, das die ACLs setzt. Das Beispiel lässt sich noch verbessern, wenn auch die anderen Parameter von Setfacl in Variablen landen. Als einfache Demonstration reicht diese Form aber aus.
Der Aufruf von Setfacl kann übrigens nur erfolgreich sein, wenn das Paket »acl« bereits auf dem System installiert ist und die Partition unter »/home« mit ACL-Support hängt, zum Beispiel über Mount-Optionen in »/etc/fstab« .
Der folgenden Befehl prüft, ob das frisch erstellte Cfengine-Snippet Syntaxfehler enthält:
/var/cfengine/bin/cf-promises -f /etc/cfengine3/acl_example_obsolete.cf
Bringt er keine Fehlermeldung, dann kann der Admin das Skript als Root oder via Sudo ausführen:
/var/cfengine/bin/cf-agent -f /etc/cfengine3/acl_example_obsolete.cf
Ein Blick mit »getfacl« auf »/home/archive« zeigt den Erfolg (Listing 2).
Listing 2
getfacl /home/archive
01 getfacl: Removing leading '/' from absolute path names 02 # file: home/archive/ 03 # owner: root 04 # group: root 05 user::rwx 06 user:backup:rwx 07 group::r-x 08 group:games:rwx 09 mask::rwx 10 other::r-x
Native ACLs in 3.4
Wer sich bereits an die Beta von Cfengine 3.4.0 traut, muss sich zunächst das Sourcen-Paket ([3] oder DELUG-DVD) herunterladen und kompilieren. Hilfe dabei liefert die Datei »INSTALL« . Achtung: Die Cfengine-Macher weisen leider nicht darauf hin, dass vor dem Kompilieren das Paket »libacl1-dev« bereits vorhanden sein sollte, sonst installiert sich Cfengine ohne ACL-Support und der Tester sucht sich einen Wolf. Richtig gebaut unterstützt Cfengine 3.4.0b2 die Posix-ACLs nativ, was sich mit Listing 3 sogleich auf die Probe stellen lässt.
Listing 3
Cfengine-native Posix-ACLs
01 body common control {
02 bundlesequence => { "set_Posix_acls" };
03 }
04
05 bundle agent set_Posix_acls {
06 vars:
07 "shared_directories" slist => { "/home/shared", "/home/archive" };
08
09 files:
10 "$(shared_directories)/."
11 acl => crazy_acls;
12 }
13
14 body acl crazy_acls {
15 acl_type => "Posix";
16 aces => {"user:backup:rwx", "group:games:rx"};
17 }
Im überarbeiteten Beispiel ersetzt ein Verweis auf eine eigene »acl« -Sektion das »commands« -Promise. In »body acl« definiert der Admin zunächst den ACL-Typ, hier hat er die Wahl zwischen Posix, Ntfs und »generic« . Anschließend kann er die einzelnen ACL-Einträge (Access Control Entries, ACE) angeben.
Während das Beispiel aus Listing 2 noch der Gruppe »games« die vollen Rechte auf die festgelegten Ordner »/home/shared« und »/home/archive« gewährt, findet sich nach Listing 3 (Zeile 16) nur noch ein Lese- und Ausführungsrecht. Um den Code möglichst schlank zu halten, setzt das Skript jetzt im ACL-Body nur zwei Promiser, also Definitionen.
Tatsächlich bietet Cfengine 3.4.0 jedoch eine Fülle weiterer Einstellungsmöglichkeiten [5]. Im Beispiel nützlich wäre etwa die Funktion »acl_method« , die festlegt, ob die neuen ACLs sich anhängen (»append« ) oder alle bisher gesetzten ACLs vollständig entfernen und überschreiben sollen (»overwrite« ).
XML-Support für Libvirt-Dateien
Auch eine weitere Neuerung in Cfengine 3 dürfte so manchen Systemadministrator dafür entschädigen, dass dessen Entwickler bisher Libvirtd und die automatisierte Verwaltung von virtuellen Maschinen nur in der Enterprise-Variante anboten. Libvirt hinterlegt seine Konfigurationsdateien in Form von XML-Dateien – und mit der Cfengine-Version 3.4.0 ist es erstmals möglich, auch diese Files direkt zu bearbeiten.
Das erleichtert das Verwalten von VMs deutlich, zumindest für den Admin, der die Libxml2-Pakete installiert hat. Dazu kommen zahlreiche Bugfixes und weitere Verbesserungen. Außen vor bleiben jetzt allerdings Anwender einiger älterer Plattformen. Sun OS 3 und 4 sowie Digital Unix unterstützt Cfengine ab sofort nicht mehr.
Wer intensiver einsteigen will, findet auf den Webseiten des Cfengine Design Center (Abbildung 2) ein von der Community gepflegtes Github-Repository [6] mit fertigen Snippets und umfangreichem Anschauungsmaterial. (mfe)
Infos
- Cfengine: http://www.cfengine.org
- Version 3 freigegeben: https://cfengine.org/pipermail/help-cfengine/2008-December/004502.html
- Cfengine 3.4 Beta: https://cfengine.com/forum/read.php?1,27608
- Andreas Putzo, “Aktiver Urahn”: Linux-Magazin 10/08, S. 64
- Cfengine-Enterprise-Handbuch: http://cfengine.com/manuals/novaownersmanual/
- Cfengine-Snippet-Repository: https://github.com/cfengine/design-center/






