SELinux: So erstellen Sie einen neuen Dateityp

7

Unter RHEL / CentOS 7 versuche ich, einen neuen SELinux-Sicherheitskontext für Dateien zu erstellen, um einen neuen Dienst zu unterstützen, den ich schreibe.

Ich habe eine Typdurchsetzungsdatei für meinen neuen Dienst erstellt, kann jedoch keinen neuen Typ erstellen, den das System als Dateityp erkennt.

Ich arbeite basierend auf diesem CentOS 5-Dokument " Erstellen eines lokalen Richtlinienmoduls" , das mich anweist, eine TE-Datei zu erstellen, diese dann zu verwenden checkmoduleund semodule_packagezu kompilieren.

Wenn ich nur in meine TE-Datei schreibe:

type myservice_spool_t;

dann kompiliert der TE gut, aber wenn ich es versuche, semanage fcontextbekomme ich folgendes:

$ sudo semanage fcontext -a -t myservice_spool_t "/var/spool/myservice(/.*)?" 
ValueError: Type myservice_spool_t is invalid, must be a file or device type

Ich habe verschiedene Tutorials gelesen, aber kein Beispiel gefunden, das funktioniert - alles, was ich mir ansehe, ist entweder:

  • veraltet - zB Diese RHEL 4 SELinux-Dokumentationsseite sagt, dass man verwenden sollte type myservice_spool_t, file_type;, checkmodulesagt aber :ERROR 'attribute file_type is not declared'
  • unvollständig - zB diese Antwort lässt mich das Makro verwenden file_type(), checkmodulesagt aber :ERROR 'This block has no require section.' at token 'files_type'
  • oder vollständig fehlen - z. B. enthält das neue SELinux-Handbuch für RHEL 7 keine Informationen zum Erstellen neuer Richtlinien, außer zur Verwendung audit2allow.

Die SELinux-Projektwebsite ist völlig nutzlos, da ich kein einziges funktionierendes Beispiel gefunden habe

Ich würde mich über ein einfaches, prägnantes Beispiel für das Schreiben einer TE-Datei freuen, in der ein neuer Typ eingeführt semanage fcontextwird, der genehmigt wird.

[Aktualisieren]

Ich habe diese Gentoo-Dokumentation zum Erstellen von Richtliniendateien gefunden , die einige nützliche Erklärungen und Beispiele enthält.

Guss
quelle
Versuchen Sie es mit fedoraproject.org/wiki/PackagingDrafts/… oder mit Dan Walshs Blog danwalsh.livejournal.com .
user9517

Antworten:

2

Ich habe herausgefunden, dass das Problem darin besteht, dass ich das Modul nicht richtig kompiliert habe. Infolgedessen haben die Makros wahrscheinlich nicht "genommen", und die checkmoduleFehlermeldungen des Richtlinien-Compilers haben nicht wirklich dazu beigetragen, dies zu verstehen.

Damit alle diese Makros ordnungsgemäß erweitert werden können, muss die Richtlinie mithilfe der von SELinux bereitgestellten Makefiles kompiliert werden. Mit einer TE-Datei namens myservice_spool.te sollte Folgendes ausgeführt werden:

make -f /usr/share/selinux/devel/Makefile myservice_spool.pp

Dadurch wird eine temporäre TE-Datei mit allen erweiterten Makros erstellt und anschließend die entsprechenden Compiler zum Erstellen aufgerufen myservice_spool.pp.

Die im OP verknüpfte Gentoo-Dokumentation enthält etwas mehr Informationen, obwohl die Dateipfade für CentOS-Systeme nicht korrekt sind.

Wenn Sie die generierte TE-Vorlage in dem tmpVerzeichnis überprüfen (das das SELinux-Makefile hilfreich belässt), können Sie feststellen, dass "Attribute" in der Tat die richtige Methode sind, um die Angabe eines Typs als Datei zu handhaben, aber wir müssen requiresie verwenden, damit sie funktionieren - Die Art und Weise, wie SELinux TE-Dateien zu funktionieren scheinen, ist, dass Sie keine Symbole erhalten, die auf magische Weise in die Konfigurationsdatei importiert wurden. Sie müssen requirealles verwenden , was Sie verwenden.

Die korrekte, nicht makroorganisierte Methode zum Einrichten eines neuen Dateityps ist ungefähr so ​​(kopiert aus der von TE generierten Vorlage):

type myservice_spool_t;
require {
    attribute spoolfile;
    attribute file_type, non_security_file_type, non_auth_file_type;
} # end require
typeattribute myservice_spool_t file_type, non_security_file_type, non_auth_file_type, spoolfile;
Guss
quelle
Das hat nicht funktioniert. # make -f /usr/share/selinux/devel/Makefile mailcaptcha.pp Compiling targeted mailcaptcha module /usr/bin/checkmodule: loading policy configuration from tmp/mailcaptcha.tmp mailcaptcha.te":2:ERROR 'Building a policy module, but no module specification found.
Chloe
Es hört sich so an, als hätten Sie keine teDatei oder sie ist nicht richtig formatiert. Haben Sie etwas dagegen, Ihre Datei zu teilen?
Guss
Ich habe nicht die Originaldatei, die ich versucht habe, aber hier ist mein letzter Versuch und der letzte Fehler: pastebin.com/JyEEi6dP
Chloe
Das Problem liegt in Ihrem Code in Zeile 9, nicht wie im Fehlerbericht angegeben. Ich bin mir nicht sicher, warum es sich so verhält, es könnte sich um die Reihenfolge der Typdeklaration handeln und das requireist in meinem Beispiel anders. Trotzdem schlage ich vor, dass Sie mein Beispiel nicht verwenden, da es - wie ich geschrieben habe - kein Code ist, sondern eine Ausgabe des Vorprozessors. Sie sollten ein Makro verwenden, wie es Mathew in seinem Kommentar zu Ihrer Frage beantwortet hat.
Guss
Oh mein Gott, vielen Dank. Ich hatte genau das gleiche Problem wie Sie und konnte keine Dokumentation zu benutzerdefinierten Selinux-Modulen und -Typen finden, die nicht schrecklich veraltet war.
Jayhendren
1

Sie müssen es als Mitglied des files-Attributs deklarieren, damit es über Relabel-Berechtigungen verfügt.

Versuchen

type myservice_spool_t;
files_type(myservice_spool_t)

Oder besser in deinem Fall ..

type myservice_spool_t;
files_spool_file(myservice_spool_t)

Vorausgesetzt, Sie erstellen tatsächlich eine Spooldatei. Dies gibt anderen Makros die Möglichkeit, mit diesem Spool zu arbeiten, wenn sie in ihrer Richtlinie über die Berechtigung zum Verwalten von Spools verfügen.

Hier ist ein vollständiges Beispiel für ein Richtlinienmodul.

policy_module(`myservice', 1.0.0)

type myservice_spool_t;
files_spool_file(myservice_spool_t)

Dies würde funktionieren, aber nur den Typ deklarieren und das ist es. Sie benötigen einige Zulassungsregeln, damit sich etwas lohnt.

Matthew Ife
quelle
2
Wie ich in der Frage erwähnt habe, habe ich das versucht und es funktioniert nicht. Mit dem neuen Makro bekomme ich immer noch diesen Fehler:myservice_spool.te:4:ERROR 'This block has no require section.' at token 'files_spool_file' on line 4:
Guss
3
Übrigens: Wo kann man Dokumentation für all diese Makros oder sogar die Quelle finden? Wenn ich nach dem sehr Spezifischen google, erhalte files_spool_fileich nur eine Handvoll Ergebnisse, die entweder Quell-Dumps von Skripten, Fehlerberichte oder Mailinglisten-Posts sind. Es scheint, als ob SELinux-Richtlinien eine Sammlung magischer Beschwörungsformeln sind, die von Spitballs, Klebeband und "es funktioniert, nicht anfassen" zusammengehalten werden.
Guss
Ich habe mein Problem gefunden - es ging nicht darum, welches Makro geschrieben werden soll, sondern wie das Modul kompiliert werden soll.
Guss
1
Das hat nicht funktioniert. # checkmodule mailcaptcha.te checkmodule: loading policy configuration from mailcaptcha.te mailcaptcha.te:1:ERROR 'syntax error' at token 'type' on line 1: checkmodule: error(s) encountered while parsing configuration # cat mailcaptcha.te type mailcaptcha_t; files_type(mailcaptcha_t);
Chloe
Da Sie es nicht als Richtlinienmodul deklariert haben, wundert es mich nicht. Sie müssen die Typ-Durchsetzungsdatei gemäß den normalen Standards ausfüllen und hinzufügen.
Matthew Ife
-1

https://selinuxproject.org/page/TypeStatements hat die richtige Antwort:

# Using the typeattribute statement to associate a type of
# setroubleshootd_exec_t to two attributes file_type and 
# non_security_file_type. 

# These are the previously declared attributes:
attribute file_type;
attribute non_security_file_type;

# The previously declared type:
type setroubleshootd_exec_t;

# These are the associations using the typeattribute statement:
typeattribute setroubleshootd_exec_t file_type, non_security_file_type;

Aber ja, Ihre Frage wirft einen interessanten Punkt auf.

SELinux kennt drei Sprachen, und es gibt eine Abstraktionssprache eines Drittanbieters namens "Referenzrichtlinie".

  1. Monolitische Richtliniensprache (checkpolicy wird zum Kompilieren von policy.conf - man checkpolicy verwendet)
  2. Modulrichtliniensprache (checkmodule wird zum Kompilieren von $ MODULE verwendet. {Te.fc} - man checkmodule)
  3. Common Intermediate Language (secilc wird zum Kompilieren von $ MODULE.cil - man secilc verwendet)

Jede der oben genannten Muttersprachen hat ihre eigenen spezifischen Eigenschaften und kann verwirrend sein.

Die Referenzrichtlinie ist im Grunde ein Wrapper um die "Modulrichtliniensprache" mit dem Ziel, die Richtlinienpflege zu vereinfachen.

dac.override
quelle
Mein Missverständnis bestand hauptsächlich darin, dass die Tatsache, dass etwas im System definiert wurde, wie z. B. das file_typeAttribut, nicht bedeutet, dass es für meine Richtliniendatei definiert ist - ich muss es in meiner Richtlinie grundsätzlich neu definieren (oder ist es "referenzieren") Datei, damit ich es verwenden kann. Und das habe ich nirgendwo erklärt gesehen, auch nicht in Stack Exchange-Antworten.
Guss
Dies erklärt nicht, wie man es kompiliert. Weder makenoch checkmodulefunktioniert. # make -f /usr/share/selinux/devel/Makefile \n mailcaptcha.pp Compiling targeted mailcaptcha module /usr/bin/checkmodule: loading policy configuration from tmp/mailcaptcha.tmp mailcaptcha.te":2:ERROR 'Building a policy module, but no module specification found.
Chloe