So erstellen Sie ein benutzerdefiniertes SELinux-Label

11

Ich habe eine Dienst- / Einzel-Binär-App geschrieben, die ich auf Fedora 24 ausführen möchte. Sie wird mit systemd ausgeführt, für die die Binärdatei bereitgestellt wird /srv/bot

Dieser Dienst / diese App, die ich geschrieben habe, muss Dateien in diesem Verzeichnis erstellen / öffnen / lesen und umbenennen.

Ich habe zuerst begonnen, eine neue Richtlinie basierend auf SELinux zu erstellen: Erlaube einem Prozess, eine beliebige Datei in einem bestimmten Verzeichnis zu erstellen

Aber als meine App umbenannt werden musste, hatte die Ausgabe eine Warnung:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Ich habe herumgegoogelt und herausgefunden, dass ich ein spezifischeres SELinux-Label als einen Basistyp verwenden sollte, aber alle Online-Beispiele zeigen Ihnen vorhandene Labels von httpd / nginx / etc.

Gibt es eine Möglichkeit, ein benutzerdefiniertes Etikett nur für meine eigene App zu erstellen?

Meine Idee ist es, so etwas wie myapp_var_t zu erstellen, verwenden

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

und eine benutzerdefinierte .ppDatei, die diesen benutzerdefinierten Typ verwendet

Wenn es einen besseren Weg gibt, das zu lösen, funktioniert das auch.

Vielen Dank

Aktualisieren

Nach eingehender Suche denke ich, dass der richtige Begriff für das, was ich tun möchte, darin besteht, neue zu erstellen types, die mich zu https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916 führten

was im Grunde sagt, laufen

sepolgen /path/to/binary

und ich konnte eine Vorlage erhalten, die ich dann in eine pp-Datei kompilieren und laden kann. Es werden immer noch einige Fehler angezeigt, aber es sieht so aus, als wäre ich näher an dem, was ich tun möchte.

Wenn es funktioniert, werde ich diesen Beitrag aktualisieren

fmpwizard
quelle

Antworten:

11

Mit dem Startpunkt des Laufens

sepolgen /path/to/binary

was dir gibt:

app.fc
app.sh
app.if
app.spec
app.te

Um ein neues SELinux file contextVerzeichnis zu erstellen , das auf ein übergeordnetes Verzeichnis angewendet werden soll, das Dateien enthält, die Ihr Programm / Dämon ändert, bearbeiten Sie die Datei app.te und fügen Folgendes hinzu:

type app_var_t;
files_type(app_var_t)

Die erste Zeile deklariert den neuen Typ und die zweite Zeile ruft ein Makro , das etwas Magie tut und macht es einen Dateityp, siehe (fällt Sie keinen Prozesskontext Linie app_exec_t auf eine Datei oder ein Verzeichnis verwenden können) „SELinux Typen Revisited“ für mehr Infos zu den verschiedenen Typen

Sobald Sie den Typ deklariert haben, müssen Sie SELinux mitteilen, dass Ihre App ihn verwenden darf, in meinem Fall habe ich hinzugefügt

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Diese beiden Zeilen besagen im Grunde, dass der Typ app_t, der die Domäne meiner App ist, Verzeichnisse mit dem Kontext schreiben / suchen / etc app_var_tund Dateien mit dem Kontext app_var_t erstellen / öffnen / löschen / etc-Dateien erstellen darf

Der letzte Teil des Puzzles besteht darin, SELinux irgendwie mitzuteilen, welche Ordner und Dateien die einzelnen Typen erhalten sollen. Dazu bearbeiten Sie die app.fcDatei (fc => Dateikontext).

Diese Datei hat in meinem Fall nur zwei Zeilen:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

Die erste Zeile zeigt direkt auf die auf meinen Servern bereitgestellte Binärdatei, sodass diese den Kontext app_exec_t erhält.

Die zweite Zeile bedeutet:

Wenden Sie app_var_t auf das Verzeichnis / srv / bot sowie auf alle Dateien im Verzeichnis / srv / bot an

Beachten Sie, wie die erste Zeile --zwischen dem Pfad und dem Aufruf von liegt gen_context. --bedeutet, dies nur auf Dateien anzuwenden. Im zweiten Fall haben wir nichts (nur Leerzeichen), was bedeutet, dass auf alle übereinstimmenden Verzeichnisse und Dateien angewendet wird, was ich wollte. Eine andere Option besteht -ddarin, nur Verzeichnisse anwenden zu müssen .

Ich habe jetzt eine funktionierende Richtlinie, ich kann meine App mit einer benutzerdefinierten Richtlinie bereitstellen und alles funktioniert. (Meine Richtlinie enthält viel mehr Einträge in der .teDatei, liegt jedoch außerhalb des Bereichs dieser Frage.)

Zusätzliches Lesematerial, das mir geholfen hat, zu dieser Lösung zu gelangen:

Mit sepolgen die Dinge einfacher machen

Denken Sie nach, bevor Sie nur blind audit2allow -M mydomain

SELinux FÜR ROTE HUTENTWICKLER (Long PDF)

Ein SElinux-Modul (1): Typen und Regeln

Beispielrichtlinie (speziell die postgresql)

Grundlegendes zu den Dateikontexten Dateien

fmpwizard
quelle
Oder verwenden Sie CIL
Jakuje
sepolgen /path/to/binaryspuckt einen Syntaxfehler für mich aus. Ich bin auf RHEL 7.6. Ich denke, sepolgen --application /path/to/binaryist die richtige Syntax, wenn Ihr Ziel ist, eine Richtlinie für eine bestimmte Anwendung zu schreiben?
Jayhendren
Ihre .teDatei wirft beim Kompilieren des Moduls auch einen Syntaxfehler für mich auf : app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. Und wenn ich einen requireAbschnitt hinzufüge , bekomme ich:ERROR 'syntax error' at token 'files_type' on line 13:
Jayhendren
Entschuldigung, ich habe keinen Zugriff mehr auf einen Fedora-Computer, um ihn zu testen, aber es könnte sein, dass sie seit Version 24 die Syntax geändert haben.
fmpwizard