Erlauben Sie in SELinux auf sichere Weise ein bestimmtes Risikoverhalten eines einzelnen Programms

8

Ich habe ein Programm in einem Docker-Container, das eine .so-Datei lädt, die das Verhalten des Programms durch Hooking und Speichermanipulation ändert. Dieses Verhalten wird von SELinux mit der folgenden Meldung im Überwachungsprotokoll blockiert:

type = AVC msg = audit (1548166862.066: 2419): avc: verweigert {execheap} für pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = Prozess zulässig = 0

Ich zögere sehr, dies nur durchzugehen, audit2allowda ich dieses spezifische Verhalten nirgendwo anders zulassen möchte (da dies ziemlich riskant wäre).

  • Wie kann ich SELinux anweisen, dieses spezifische Verhalten so sicher wie möglich zuzulassen?
  • Kann ich dies so tun, dass ich in Zukunft mehr Docker-Container erzeugen kann, auf denen dasselbe Programm ausgeführt wird?
Thomas
quelle

Antworten:

4

audit2allowwahrscheinlich erzeugt eine Regel zu ermöglichen , execheapfür container_tTyp - Prozess. Sie können das Modul immer zuerst generieren und überprüfen, bevor Sie es laden.

Ein mögliches Problem ist, dass jetzt jedem Prozess mit container_tTyp dieselbe Operation gestattet ist. Um dies zu vermeiden, müssen Sie möglicherweise Ihren eigenen benutzerdefinierten Typ erstellen ( container_tals Vorlage verwenden) und nur execheapdiesen speziellen Typ berücksichtigen .

In diesem Blogbeitrag von Dan Walsh wird erklärt, wie solche benutzerdefinierten Richtlinien geschrieben werden. Sie können dies auch kombinieren audit2allow, um die tatsächlichen Regeln zu generieren. Die wesentlichen Schritte sind:

  1. Erstellen Sie eine grundlegende Containerrichtlinie, zum Beispiel container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateDas Makro erstellt den neuen Typ container_execheap_tund erstellt die erforderlichen Regeln für den Docker-Betrieb, damit der neue Typ als Containerdomäne verwendet werden kann.

  2. Kompilieren und laden Sie das Richtlinienmodul (die erforderlichen Entwicklungsdateien, einschließlich des Makefiles, sollten per selinux-policy-develPaket bereitgestellt werden ):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    Der neue Typ kann als zulässige Domäne konfiguriert werden:

    semanage permissive -a container_execheap_t
    

    Für zulässige Domänen werden AVC-Ablehnungen protokolliert, Regeln werden jedoch nicht durchgesetzt. Auf diese Weise ist es einfach, die fehlenden Regeln später mit zu generieren audit2allow.

  3. Führen Sie Ihren Container in diesem neuen Kontext aus docker run ... --security-opt label:type:container_execheap_t ...

  4. Generieren Sie erwartete Fehler. Führen Sie dann aus audit2allow, um Regeln zu generieren, die diese Vorgänge für zulassen container_execheap_t. Sie können dieselbe Moduldatei .te(denken Sie daran, die Versionsnummer zu erhöhen) mit den neuen Regeln aktualisieren . Kompilieren und installieren Sie das aktualisierte Modul.

  5. Wenn keine Fehler mehr generiert werden, versetzen Sie den benutzerdefinierten Containertyp wieder in den Erzwingungsmodus semanage -d container_execheap.

sebasth
quelle
Ihre Antwort scheint der richtige Weg zu sein - leider habe ich selbst keine Erfahrung mit der Erstellung von SELinux-Richtlinien. Dies habe ich mir ausgedacht, indem ich den Blog-Beitrag, auf den Sie verlinkt haben, und andere Dokumentationen durchgesehen habe. Ich habe das Gefühl, ich mache es nicht richtig ... könnten Sie mir vielleicht helfen, indem Sie mich in die richtige Richtung weisen? Ist meine Politik überhaupt sinnvoll?
Thomas
Danke, ich habe jetzt etwas, das zu funktionieren scheint! Damit bin ich gelandet. Ich habe jedoch während der Kompilierungszeit eine Reihe von Fehlern in Bezug auf Duplikate erhalten . Ich gehe davon aus, dass dies eher ein Problem in den enthaltenen Richtlinien als in meinen eigenen ist. Ich bin mir auch nicht ganz sicher, warum die Zeichenfolge in der Anweisung gen_require mit einem 'anstelle eines' abgeschlossen werden muss (letzteres hat einen Fehler ausgelöst). Trotzdem nochmals vielen Dank für die Hilfe!
Thomas
Ich denke, es ist sicher, diese spezifischen Fehler zu ignorieren, siehe Bugzilla . Das Zitieren mit `' funktioniert in der M4-Sprache , mit der Referenzrichtlinienmodule geschrieben werden. Sie können überprüfen (mithilfe ps axZusw.), ob Ihr Container im richtigen Kontext ausgeführt wird, wenn Sie nach der Installation und Konfiguration Ihrer benutzerdefinierten Richtlinie eine Überprüfung durchführen möchten.
25.