<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=SELinux_Praxis</id>
	<title>SELinux Praxis - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=SELinux_Praxis"/>
	<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=SELinux_Praxis&amp;action=history"/>
	<updated>2026-07-05T17:31:02Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.ixheim.de/index.php?title=SELinux_Praxis&amp;diff=71699&amp;oldid=prev</id>
		<title>Thomas.will: Die Seite wurde neu angelegt: „== SELinux – Grundlagen und Praxis ==  Kein Vollkurs, sondern das Rüstzeug, mit dem ein Admin im Alltag klarkommt: was SELinux macht, wie es entscheidet, un…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=SELinux_Praxis&amp;diff=71699&amp;oldid=prev"/>
		<updated>2026-07-05T07:43:38Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „== SELinux – Grundlagen und Praxis ==  Kein Vollkurs, sondern das Rüstzeug, mit dem ein Admin im Alltag klarkommt: was SELinux macht, wie es entscheidet, un…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== SELinux – Grundlagen und Praxis ==&lt;br /&gt;
&lt;br /&gt;
Kein Vollkurs, sondern das Rüstzeug, mit dem ein Admin im Alltag klarkommt: was SELinux macht, wie es entscheidet, und welche Befehle man wirklich braucht.&lt;br /&gt;
&lt;br /&gt;
== Grundkonzept: DAC vs. MAC ==&lt;br /&gt;
&lt;br /&gt;
;Klassische Unix-Rechte (DAC – Discretionary Access Control)&lt;br /&gt;
*Der '''Besitzer''' einer Datei entscheidet über Zugriffsrechte (rwx, Owner/Group/Other)&lt;br /&gt;
*Läuft ein Prozess als root, kann er '''alles''' – DAC schützt nicht gegen kompromittierte Root-Prozesse&lt;br /&gt;
&lt;br /&gt;
;SELinux (MAC – Mandatory Access Control)&lt;br /&gt;
*Zugriffsregeln werden '''zentral vom System''' vorgegeben, nicht vom Dateibesitzer&lt;br /&gt;
*Selbst root-Prozesse sind an die Policy gebunden&lt;br /&gt;
*Prinzip: '''Alles ist verboten, außer explizit erlaubt''' (Whitelist-Ansatz)&lt;br /&gt;
&lt;br /&gt;
'''Merksatz:''' DAC fragt &amp;quot;Wem gehört die Datei?&amp;quot;, MAC fragt &amp;quot;Darf dieser Prozesstyp auf diesen Ressourcentyp zugreifen?&amp;quot; – unabhängig vom Besitzer.&lt;br /&gt;
&lt;br /&gt;
== Die drei Modi ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Modus !! Verhalten&lt;br /&gt;
|-&lt;br /&gt;
| enforcing || Regeln werden durchgesetzt, Verstöße blockiert und geloggt&lt;br /&gt;
|-&lt;br /&gt;
| permissive || Verstöße werden nur geloggt, aber '''nicht''' blockiert – Standard für Troubleshooting&lt;br /&gt;
|-&lt;br /&gt;
| disabled || SELinux komplett aus (Reboot nötig zum Aktivieren)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# aktuellen Modus anzeigen&lt;br /&gt;
getenforce&lt;br /&gt;
&lt;br /&gt;
# temporär umschalten (bis zum Reboot)&lt;br /&gt;
setenforce 0    # permissive&lt;br /&gt;
setenforce 1    # enforcing&lt;br /&gt;
&lt;br /&gt;
# dauerhaft in /etc/selinux/config&lt;br /&gt;
SELINUX=enforcing&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Security Context – das Herzstück ==&lt;br /&gt;
&lt;br /&gt;
Jede Datei, jeder Prozess, jeder Port hat einen Kontext im Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user:role:type:level&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die tägliche Praxis relevant ist fast ausschließlich das '''type'''-Feld – dieses Prinzip heißt '''Type Enforcement (TE)''' und ist der Mechanismus, der 95% der Alltagsprobleme verursacht bzw. löst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph LR&lt;br /&gt;
    A[Prozess mit Domain-Type&amp;lt;br/&amp;gt;z.B. httpd_t] --&amp;gt;|darf zugreifen auf| B[Datei mit Type&amp;lt;br/&amp;gt;z.B. httpd_sys_content_t]&lt;br /&gt;
    A -.-&amp;gt;|blockiert, wenn Type nicht erlaubt| C[Datei mit Type&amp;lt;br/&amp;gt;z.B. user_home_t]&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Kontexte anzeigen&lt;br /&gt;
*&amp;lt;code&amp;gt;ls -Z /var/www/html&amp;lt;/code&amp;gt; – Dateikontexte&lt;br /&gt;
*&amp;lt;code&amp;gt;ps -Z&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;ps auxZ&amp;lt;/code&amp;gt; – Prozesskontexte&lt;br /&gt;
*&amp;lt;code&amp;gt;id -Z&amp;lt;/code&amp;gt; – eigener Kontext&lt;br /&gt;
&lt;br /&gt;
== Wie eine Zugriffsentscheidung getroffen wird ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
flowchart TD&lt;br /&gt;
    Start[Prozess versucht Zugriff] --&amp;gt; DAC{DAC-Check&amp;lt;br/&amp;gt;klassische Unix-Rechte}&lt;br /&gt;
    DAC --&amp;gt;|verweigert| Deny1[Zugriff verweigert]&lt;br /&gt;
    DAC --&amp;gt;|erlaubt| MAC{SELinux Policy-Check&amp;lt;br/&amp;gt;Type Enforcement}&lt;br /&gt;
    MAC --&amp;gt;|Regel erlaubt Zugriff| Allow[Zugriff gewährt]&lt;br /&gt;
    MAC --&amp;gt;|keine Regel vorhanden| Mode{Modus?}&lt;br /&gt;
    Mode --&amp;gt;|enforcing| Deny2[Zugriff verweigert + AVC-Log]&lt;br /&gt;
    Mode --&amp;gt;|permissive| Allow2[Zugriff gewährt + AVC-Log]&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' SELinux greift '''immer erst nach''' den klassischen DAC-Checks. Beide Ebenen müssen zustimmen.&lt;br /&gt;
&lt;br /&gt;
== Die häufigste Fehlerquelle: falscher Kontext nach Datei-Operationen ==&lt;br /&gt;
&lt;br /&gt;
Wird eine Datei kopiert, verschoben oder neu angelegt, bekommt sie oft den '''falschen''' Kontext (z. B. Datei aus dem Home-Verzeichnis nach &amp;lt;code&amp;gt;/var/www/html&amp;lt;/code&amp;gt; kopiert, behält aber &amp;lt;code&amp;gt;user_home_t&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Kontext auf den in der Policy definierten Standard zurücksetzen&lt;br /&gt;
restorecon -Rv /var/www/html&lt;br /&gt;
&lt;br /&gt;
# Kontext temporär manuell setzen (geht bei restorecon verloren!)&lt;br /&gt;
chcon -t httpd_sys_content_t /var/www/html/index.html&lt;br /&gt;
&lt;br /&gt;
# Kontext DAUERHAFT in der Policy-Datenbank hinterlegen (übersteht restorecon)&lt;br /&gt;
semanage fcontext -a -t httpd_sys_content_t &amp;quot;/var/www/html(/.*)?&amp;quot;&lt;br /&gt;
restorecon -Rv /var/www/html&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Merksatz:''' &amp;lt;code&amp;gt;chcon&amp;lt;/code&amp;gt; = Pflaster, geht beim nächsten &amp;lt;code&amp;gt;restorecon&amp;lt;/code&amp;gt; verloren. &amp;lt;code&amp;gt;semanage fcontext&amp;lt;/code&amp;gt; = dauerhafte Regel, danach &amp;lt;code&amp;gt;restorecon&amp;lt;/code&amp;gt; anwenden, damit sie greift.&lt;br /&gt;
&lt;br /&gt;
== Booleans – Verhalten umschalten ohne eigene Policy ==&lt;br /&gt;
&lt;br /&gt;
Booleans sind vorgefertigte Schalter für häufige Szenarien (z. B. darf Apache auf Netzwerk-Freigaben zugreifen?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# alle Booleans mit Beschreibung auflisten&lt;br /&gt;
getsebool -a&lt;br /&gt;
semanage boolean -l&lt;br /&gt;
&lt;br /&gt;
# einen Boolean dauerhaft setzen&lt;br /&gt;
setsebool -P httpd_can_network_connect on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' Ohne &amp;lt;code&amp;gt;-P&amp;lt;/code&amp;gt; gilt die Änderung nur bis zum Reboot.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting-Workflow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
flowchart LR&lt;br /&gt;
    A[Zugriff schlägt fehl] --&amp;gt; B[AVC-Denial im Log suchen]&lt;br /&gt;
    B --&amp;gt; C[ausearch -m avc -ts recent]&lt;br /&gt;
    C --&amp;gt; D[audit2allow -w -a&amp;lt;br/&amp;gt;Klartext-Erklärung]&lt;br /&gt;
    D --&amp;gt; E{Regel sinnvoll?}&lt;br /&gt;
    E --&amp;gt;|ja, Standardfall| F[Boolean oder semanage fcontext nutzen]&lt;br /&gt;
    E --&amp;gt;|nein, Spezialfall| G[Eigenes Modul bauen]&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Logs durchsuchen&lt;br /&gt;
*&amp;lt;code&amp;gt;ausearch -m avc -ts recent&amp;lt;/code&amp;gt; – aktuelle AVC-Denials&lt;br /&gt;
*&amp;lt;code&amp;gt;ausearch -m avc -ts today&amp;lt;/code&amp;gt; – alle Denials von heute&lt;br /&gt;
*&amp;lt;code&amp;gt;sealert -a /var/log/audit/audit.log&amp;lt;/code&amp;gt; – lesbare Erklärung inkl. Lösungsvorschlag (falls &amp;lt;code&amp;gt;setroubleshoot&amp;lt;/code&amp;gt; installiert)&lt;br /&gt;
&lt;br /&gt;
== Eigene Module bauen ==&lt;br /&gt;
&lt;br /&gt;
Wenn kein passender Boolean existiert und &amp;lt;code&amp;gt;semanage fcontext&amp;lt;/code&amp;gt; nicht ausreicht (z. B. eigene Anwendung mit ungewöhnlichem Zugriffsmuster):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Denials sammeln (im permissive-Modus testen, damit nichts blockiert wird)&lt;br /&gt;
setenforce 0&lt;br /&gt;
# Anwendung normal nutzen, alle Denials provozieren&lt;br /&gt;
&lt;br /&gt;
# 2. Aus den Denials ein Modul generieren lassen&lt;br /&gt;
ausearch -m avc -ts recent | audit2allow -M meinmodul&lt;br /&gt;
&lt;br /&gt;
# 3. Erzeugtes .te-File VOR dem Laden prüfen und ggf. per Hand kürzen&lt;br /&gt;
cat meinmodul.te&lt;br /&gt;
&lt;br /&gt;
# 4. Modul kompilieren und laden&lt;br /&gt;
semodule -i meinmodul.pp&lt;br /&gt;
&lt;br /&gt;
# 5. zurück auf enforcing und testen&lt;br /&gt;
setenforce 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Bestehende Module verwalten&lt;br /&gt;
*&amp;lt;code&amp;gt;semodule -l&amp;lt;/code&amp;gt; – geladene Module auflisten&lt;br /&gt;
*&amp;lt;code&amp;gt;semodule -r meinmodul&amp;lt;/code&amp;gt; – Modul entfernen&lt;br /&gt;
*&amp;lt;code&amp;gt;semodule -i meinmodul.pp&amp;lt;/code&amp;gt; – Modul (neu) laden&lt;br /&gt;
&lt;br /&gt;
'''Praxis-Hinweis:''' &amp;lt;code&amp;gt;audit2allow&amp;lt;/code&amp;gt; generiert oft '''zu großzügige''' Regeln (nimmt jede geloggte Aktion als &amp;quot;erlauben&amp;quot;). Das &amp;lt;code&amp;gt;.te&amp;lt;/code&amp;gt;-File vor dem Laden immer durchsehen und unnötige &amp;lt;code&amp;gt;allow&amp;lt;/code&amp;gt;-Zeilen streichen – sonst hebelt man den Sinn von SELinux graduell aus.&lt;br /&gt;
&lt;br /&gt;
== Kontext bei Nicht-Standard-Ports ==&lt;br /&gt;
&lt;br /&gt;
Läuft ein Dienst auf einem Port, der nicht in der Policy hinterlegt ist (z. B. Apache auf Port 8080 statt 80/443):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# aktuelle Port-Zuordnungen anzeigen&lt;br /&gt;
semanage port -l | grep http&lt;br /&gt;
&lt;br /&gt;
# neuen Port zu einem bestehenden Type hinzufügen&lt;br /&gt;
semanage port -a -t http_port_t -p tcp 8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kurzreferenz der wichtigsten Befehle ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Zweck&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getenforce&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setenforce&amp;lt;/code&amp;gt; || aktuellen Modus anzeigen / temporär ändern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ls -Z&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ps -Z&amp;lt;/code&amp;gt; || Datei-/Prozesskontext anzeigen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;restorecon -Rv&amp;lt;/code&amp;gt; || Kontext auf Policy-Standard zurücksetzen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chcon -t&amp;lt;/code&amp;gt; || Kontext temporär setzen (übersteht restorecon nicht)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;semanage fcontext -a&amp;lt;/code&amp;gt; || Kontext-Regel dauerhaft in Policy-DB eintragen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getsebool -a&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setsebool -P&amp;lt;/code&amp;gt; || Booleans anzeigen / dauerhaft setzen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ausearch -m avc&amp;lt;/code&amp;gt; || AVC-Denials im Audit-Log suchen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audit2allow&amp;lt;/code&amp;gt; || aus Denials eine Regel/Modul generieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;semodule -i/-l/-r&amp;lt;/code&amp;gt; || eigenes Modul laden/auflisten/entfernen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;semanage port -a&amp;lt;/code&amp;gt; || Port einem Type zuordnen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Rocky Linux Kurs]]&lt;/div&gt;</summary>
		<author><name>Thomas.will</name></author>
	</entry>
</feed>