Linux/SELinux/04/06 Booleane: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| Zeile 4: | Zeile 4: | ||
== Werkzeuge == | == Werkzeuge == | ||
=== | === ''getsebool'' === | ||
Wird verwendet, um den '''aktuellen Zustand eines Boolean''' anzuzeigen. | Wird verwendet, um den '''aktuellen Zustand eines Boolean''' anzuzeigen. | ||
* Alle aktuellen Booleans anzeigen: | * Alle aktuellen Booleans anzeigen: | ||
''getsebool -a'' | |||
* Einen einzelnen Boolean anzeigen: | * Einen einzelnen Boolean anzeigen: | ||
''getsebool httpd_use_nfs'' | |||
=== | === ''setsebool'' === | ||
Wird verwendet, um den '''Zustand eines Boolean zu ändern'''. | Wird verwendet, um den '''Zustand eines Boolean zu ändern'''. | ||
* Boolean einschalten (temporär): | * Boolean einschalten (temporär): | ||
''setsebool ftpd_anon_write on'' | |||
* Boolean einschalten (persistent): | * Boolean einschalten (persistent): | ||
''setsebool -P ftpd_anon_write on'' | |||
* Wenn mehrere Booleans gesetzt werden, müssen sie in der Form | * Wenn mehrere Booleans gesetzt werden, müssen sie in der Form ''parameter=wert'' angegeben werden: | ||
''setsebool ftpd_anon_write=on ftpd_use_passive_mode=on'' | |||
=== | === ''semanage boolean'' === | ||
Wird verwendet, um '''Boolean-Einstellungen als Teil der Policy-Konfiguration''' zu verwalten. Außerdem lassen sich damit eine menschenlesbare Beschreibung jedes Schalters sowie dessen Standardwert anzeigen. | Wird verwendet, um '''Boolean-Einstellungen als Teil der Policy-Konfiguration''' zu verwalten. Außerdem lassen sich damit eine menschenlesbare Beschreibung jedes Schalters sowie dessen Standardwert anzeigen. | ||
* Alle Booleans mit Beschreibung und Werten anzeigen (aktuell und Standard): | * Alle Booleans mit Beschreibung und Werten anzeigen (aktuell und Standard): | ||
''semanage boolean -l'' | |||
* Beschreibung eines bestimmten Boolean suchen: | * Beschreibung eines bestimmten Boolean suchen: | ||
''semanage boolean -l | grep httpd'' | |||
* Zustand eines Boolean ändern (funktional ähnlich zu | * Zustand eines Boolean ändern (funktional ähnlich zu ''setsebool -P''): | ||
''semanage boolean -m --on ftpd_anon_write'' | |||
== Praktisches Beispiel == | == Praktisches Beispiel == | ||
=== Aufgabe === | === Aufgabe === | ||
Es soll erreicht werden, dass die Web-Anfrage mit | Es soll erreicht werden, dass die Web-Anfrage mit ''curl'' eine Datei lesen kann, die als auf NFS liegend gelabelt ist – und zwar ausschließlich mithilfe des Boolean-Mechanismus. | ||
=== Lösung === | === Lösung === | ||
| Zeile 54: | Zeile 54: | ||
* Vorbereitung der Umgebung: | * Vorbereitung der Umgebung: | ||
''mkdir -p /var/www/html/nfs_test | |||
echo "Hello from NFS" > /var/www/html/nfs_test/index.html | echo "Hello from NFS" > /var/www/html/nfs_test/index.html | ||
chcon -R -t nfs_t /var/www/html/nfs_test | chcon -R -t nfs_t /var/www/html/nfs_test | ||
setenforce 1 # Enforcing-Modus aktivieren | setenforce 1 # Enforcing-Modus aktivieren'' | ||
* Versuch, die Seite aus dem NFS-Verzeichnis mit | * Versuch, die Seite aus dem NFS-Verzeichnis mit ''curl'' abzurufen: | ||
''curl -I <nowiki>http://localhost/nfs_test/index.html</nowiki>'' | |||
Ergebnis: | Ergebnis: | ||
''# curl -I <nowiki>http://localhost/nfs_test/index.html</nowiki> | |||
HTTP/1.1 403 Forbidden | HTTP/1.1 403 Forbidden | ||
... | ...'' | ||
* Relevante Rechte und zugehörige Booleans prüfen: | * Relevante Rechte und zugehörige Booleans prüfen: | ||
''semanage boolean -l | grep httpd | |||
semanage boolean -l | grep nfs | semanage boolean -l | grep nfs | ||
sesearch -A -s httpd_t -t nfs_t -c file -p read | sesearch -A -s httpd_t -t nfs_t -c file -p read'' | ||
Mithilfe von | Mithilfe von ''sesearch'' lässt sich der Lösungsweg bestimmen: | ||
''# sesearch -A -s httpd_t -t nfs_t -c file -p read | |||
allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ ( httpd_builtin_scripting && use_nfs_home_dirs && httpd_enable_homedirs ) ]:True | allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ ( httpd_builtin_scripting && use_nfs_home_dirs && httpd_enable_homedirs ) ]:True | ||
allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ httpd_builtin_scripting && httpd_use_nfs ]:True | allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ httpd_builtin_scripting && httpd_use_nfs ]:True | ||
allow httpd_t nfs_t:file { execute getattr ioctl map open read }; [ httpd_use_nfs && httpd_enable_cgi ]:True | allow httpd_t nfs_t:file { execute getattr ioctl map open read }; [ httpd_use_nfs && httpd_enable_cgi ]:True | ||
allow httpd_t nfs_t:file { getattr ioctl lock open read }; [ use_nfs_home_dirs && httpd_enable_homedirs ]:True | allow httpd_t nfs_t:file { getattr ioctl lock open read }; [ use_nfs_home_dirs && httpd_enable_homedirs ]:True'' | ||
Es ist zu erkennen, dass in der Liste unter anderem | Es ist zu erkennen, dass in der Liste unter anderem ''httpd_use_nfs'' vorkommt, dieses Boolean allein jedoch nicht ausreicht, damit eine passende Regel aktiv wird. Deshalb wird entschieden, ''httpd_builtin_scripting'' als zweiten Aktivierungsfaktor zu verwenden. | ||
* Den aktuellen Zustand von | * Den aktuellen Zustand von ''httpd_use_nfs'' und ''httpd_builtin_scripting'' prüfen: | ||
''getsebool httpd_use_nfs httpd_builtin_scripting'' | |||
* Beide Booleans testweise temporär aktivieren: | * Beide Booleans testweise temporär aktivieren: | ||
''setsebool httpd_use_nfs=on httpd_builtin_scripting=on'' | |||
* Erneute Prüfung: | * Erneute Prüfung: | ||
''curl -I <nowiki>http://localhost/nfs_test/index.html</nowiki>'' | |||
Ergebnis: | Ergebnis: | ||
''HTTP/1.1 200 OK | |||
... | ...'' | ||
'''Erfolgreich!''' | '''Erfolgreich!''' | ||
* Wenn das Verhalten den Erwartungen entspricht, können die Änderungen persistent gespeichert werden: | * Wenn das Verhalten den Erwartungen entspricht, können die Änderungen persistent gespeichert werden: | ||
''setsebool -P httpd_use_nfs=on httpd_builtin_scripting=on'' | |||
==== Auflisten von Booleanen ==== | ==== Auflisten von Booleanen ==== | ||
Version vom 28. März 2026, 12:27 Uhr
Booleane
Booleans sind in die Policy integrierte Schalter (on/off), mit denen bestimmte Regelblöcke (Conditional Rules) innerhalb der bereits kompilierten Policy aktiviert oder deaktiviert werden.
Werkzeuge
getsebool
Wird verwendet, um den aktuellen Zustand eines Boolean anzuzeigen.
- Alle aktuellen Booleans anzeigen:
getsebool -a
- Einen einzelnen Boolean anzeigen:
getsebool httpd_use_nfs
setsebool
Wird verwendet, um den Zustand eines Boolean zu ändern.
- Boolean einschalten (temporär):
setsebool ftpd_anon_write on
- Boolean einschalten (persistent):
setsebool -P ftpd_anon_write on
- Wenn mehrere Booleans gesetzt werden, müssen sie in der Form parameter=wert angegeben werden:
setsebool ftpd_anon_write=on ftpd_use_passive_mode=on
semanage boolean
Wird verwendet, um Boolean-Einstellungen als Teil der Policy-Konfiguration zu verwalten. Außerdem lassen sich damit eine menschenlesbare Beschreibung jedes Schalters sowie dessen Standardwert anzeigen.
- Alle Booleans mit Beschreibung und Werten anzeigen (aktuell und Standard):
semanage boolean -l
- Beschreibung eines bestimmten Boolean suchen:
semanage boolean -l | grep httpd
- Zustand eines Boolean ändern (funktional ähnlich zu setsebool -P):
semanage boolean -m --on ftpd_anon_write
Praktisches Beispiel
Aufgabe
Es soll erreicht werden, dass die Web-Anfrage mit curl eine Datei lesen kann, die als auf NFS liegend gelabelt ist – und zwar ausschließlich mithilfe des Boolean-Mechanismus.
Lösung
- Vorbereitung der Umgebung:
mkdir -p /var/www/html/nfs_test echo "Hello from NFS" > /var/www/html/nfs_test/index.html chcon -R -t nfs_t /var/www/html/nfs_test setenforce 1 # Enforcing-Modus aktivieren
- Versuch, die Seite aus dem NFS-Verzeichnis mit curl abzurufen:
curl -I http://localhost/nfs_test/index.html
Ergebnis:
# curl -I http://localhost/nfs_test/index.html HTTP/1.1 403 Forbidden ...
- Relevante Rechte und zugehörige Booleans prüfen:
semanage boolean -l | grep httpd semanage boolean -l | grep nfs sesearch -A -s httpd_t -t nfs_t -c file -p read
Mithilfe von sesearch lässt sich der Lösungsweg bestimmen:
# sesearch -A -s httpd_t -t nfs_t -c file -p read
allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ ( httpd_builtin_scripting && use_nfs_home_dirs && httpd_enable_homedirs ) ]:True
allow httpd_t nfs_t:file { execute execute_no_trans getattr ioctl map open read }; [ httpd_builtin_scripting && httpd_use_nfs ]:True
allow httpd_t nfs_t:file { execute getattr ioctl map open read }; [ httpd_use_nfs && httpd_enable_cgi ]:True
allow httpd_t nfs_t:file { getattr ioctl lock open read }; [ use_nfs_home_dirs && httpd_enable_homedirs ]:True
Es ist zu erkennen, dass in der Liste unter anderem httpd_use_nfs vorkommt, dieses Boolean allein jedoch nicht ausreicht, damit eine passende Regel aktiv wird. Deshalb wird entschieden, httpd_builtin_scripting als zweiten Aktivierungsfaktor zu verwenden.
- Den aktuellen Zustand von httpd_use_nfs und httpd_builtin_scripting prüfen:
getsebool httpd_use_nfs httpd_builtin_scripting
- Beide Booleans testweise temporär aktivieren:
setsebool httpd_use_nfs=on httpd_builtin_scripting=on
- Erneute Prüfung:
curl -I http://localhost/nfs_test/index.html
Ergebnis:
HTTP/1.1 200 OK ...
Erfolgreich!
- Wenn das Verhalten den Erwartungen entspricht, können die Änderungen persistent gespeichert werden:
setsebool -P httpd_use_nfs=on httpd_builtin_scripting=on
Auflisten von Booleanen
Um eine Liste der Booleans, eine Erklärung zu deren Bedeutung sowie Angaben dazu, ob sie aktiviert oder deaktiviert sind, zu erhalten, führen Sie den Befehl semanage boolean -l als Linux-Root-Benutzer aus
Das folgende Beispiel listet nicht alle Booleans auf, und die Ausgabe wurde der Kürze halber gekürzt
sudo semanage boolean -l SELinux-Boolean Status Standard Beschreibung smartmon_3ware (aus , aus) Legt fest, ob smartmon... mpd_enable_homedirs (aus, aus) Legt fest, ob mpd...
- Hinweis
- Um detailliertere Beschreibungen zu erhalten, installieren Sie das Paket selinux-policy-devel
Die Spalte SELinux-Boolean listet die Namen der Booleans auf
- Die Spalte Beschreibung gibt an, ob die Booleans aktiviert oder deaktiviert sind und welche Funktion sie haben
Der Befehl getsebool -a listet Boolesche Werte auf, unabhängig davon, ob sie aktiviert oder deaktiviert sind, gibt jedoch keine Beschreibung zu jedem einzelnen
- Das folgende Beispiel listet nicht alle Booleschen Werte auf
getsebool -a cvs_read_shadow --> off daemons_dump_core --> on
Führen Sie den Befehl getsebool ‚‘ boolean-name'‚ aus, um nur den Status des Booleschen Werts ‘'boolean-name aufzulisten
getsebool cvs_read_shadow cvs_read_shadow --> off
Verwenden Sie eine durch Leerzeichen getrennte Liste, um mehrere Boolesche Werte aufzulisten
getsebool cvs_read_shadow daemons_dump_core cvs_read_shadow --> off daemons _dump_core --> on
Konfigurieren von Booleschen Werten
Führen Sie das Dienstprogramm setsebool im Format setsebool ‚'boolean_name‘' on/off aus, um Boolesche Werte zu aktivieren oder zu deaktivieren
Das folgende Beispiel zeigt die Konfiguration des Booleschen Werts httpd_can_network_connect_db
- Konfigurieren von Booleschen Werten
- Standardmäßig ist der Boolesche Wert httpd_can_network_connect_db deaktiviert, wodurch Skripte und Module des Apache-HTTP-Servers daran gehindert werden, eine Verbindung zu Datenbankservern herzustellen
getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> off
- Um Skripte und Module des Apache-HTTP-Servers vorübergehend die Verbindung zu Datenbankservern zu ermöglichen, geben Sie als Root den folgenden Befehl ein
sudo setsebool httpd_can_network_connect_db on
- Verwenden Sie das Dienstprogramm getsebool, um zu überprüfen, ob der Boolean-Wert aktiviert wurde
getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> on
Dadurch können Skripte und Module des Apache-HTTP-Servers eine Verbindung zu Datenbankservern herstellen
- Diese Änderung bleibt nach einem Neustart nicht erhalten
- Um Änderungen auch nach einem Neustart beizubehalten, führen Sie den Befehl setsebool -P ‚‘ boolean-name'' on als Root aus:[3]
sudo setsebool -P httpd_can_network_connect_db on
Shell-Autovervollständigung
Es ist möglich, die Shell-Autovervollständigung mit den Dienstprogrammen getsebool, setsebool und semanage zu verwenden
- Verwenden Sie die Autovervollständigung mit getsebool und [ [setsebool]], um sowohl Befehlszeilenparameter als auch Boolesche Werte zu vervollständigen
- Um nur die Befehlszeilenparameter aufzulisten, fügen Sie das Bindestrichzeichen („-“) hinter dem Befehlsnamen ein und drücken Sie die Tab-Taste
sudo setsebool -[Tab] -P
Um einen Booleschen Wert zu vervollständigen, beginnen Sie mit der Eingabe des Booleschen Werts und drücken Sie dann die Tab-Taste
getsebool samba_[Tab] samba_create_home_dirs samba_export_all_ro samba_run_unconfined samba_domain_controller samba_export_all_rw samba_share_fusefs samba_enable_home_dirs samba_portmapper samba_share_nfs
sudo setsebool -P virt_use_[Tab]
virt_use_comm virt_use_nfs virt_use_sanlock virt_use_execmem virt_use_rawip virt_use_usb virt_use_fusefs virt_use_samba virt_use_xserver
Das Dienstprogramm semanage wird mit mehreren Befehlszeilenargumenten verwendet, die nacheinander vervollständigt werden
- Das erste Argument eines semanage-Befehls ist eine Option, die angibt, welcher Teil der SELinux-Richtlinie verwaltet wird
sudo semanage [Tab] boolean export import login node port dontaudit fcontext interface module permissive user
Anschließend folgen ein oder mehrere Befehlszeilenparameter
sudo semanage fcontext -[Tab] -a -D --equal --help -m -o --add --delete -f -l --modify -S -C --deleteall --ftype --list -n -t -d -e -h --locallist --noheading --type
Geben Sie schließlich den Namen eines bestimmten SELinux-Eintrags ein, z. B. einen Booleschen Wert, einen SELinux-Benutzer, eine Domäne oder einen anderen
- Beginnen Sie mit der Eingabe des Eintrags und drücken Sie Tab
sudo semanage fcontext -a -t samba<tab>
samba_etc_t samba_secrets_t
sambagui_exec_t samba_share_t samba_initrc_exec_t samba_unconfined_script_exec_t samba_log_t samba_unit_file_t samba_net_exec_t
Befehls- -Parameter können in einem Befehl verkettet werden
sudo semanage port -a -t http_port_t -p tcp 81