GNU/Linux >> LINUX-Kenntnisse >  >> Linux

SELinux Fehlerbehebung und Fallstricke

Du darfst dich nicht von deinen Fehlern definieren lassen. Du musst dich von deinen Fehlern lehren lassen – Barack Obama

Einer der großen Kämpfe, insbesondere mit Drittanbietern von Lösungen, ist die Aufrechterhaltung der Sicherheit unserer Server. Die Herausforderung ist in vielen Fällen die Aufforderung, SELinux zu deaktivieren, damit eine Anwendung reibungslos laufen kann. Das kommt zum Glück immer seltener vor.

In den meisten dieser Fälle reicht eine Analyse aus, um die richtige Fehlerbehebung oder Problemumgehung zu finden.

SELinux ist ein Kennzeichnungssystem , die uns mitteilt, dass jede Datei, jedes Verzeichnis oder Objekt im System ein entsprechendes Label hat . Richtlinien steuern die Interaktion zwischen diesen Elementen. Der Kernel erzwingt diese Regeln.

Die beiden wichtigsten Konzepte sind Kennzeichnung (Dateien, Prozesse, Ports usw.) und Type Enforcement (die Prozesse entsprechend ihres Typs voneinander isoliert).

Das von den Bezeichnungen verwendete Format ist:Benutzer:Rolle:Typ:Ebene (optional).

Um die aktuelle Konfiguration herauszufinden, führen Sie getenforce aus und sestatus Befehle:

# getenforce
Enforcing
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      32

Best Practices sagen uns, dass wir beim Testen einer neuen Drittanbieteranwendung SELinux vorübergehend im zulässigen Modus konfigurieren sollten um festzustellen, welche Richtlinien oder booleschen Werte (einfache Zeichenfolgen, die das Verhalten ändern) erforderlich sind. Führen Sie den Befehl aus:

# setenforce 0

Wenn Sie die Protokolle durchsehen, können Sie herausfinden, was SELinux benötigt, damit die Anwendung ordnungsgemäß funktioniert.

Was versucht mir SELinux zu sagen?

Es gibt nur vier Hauptursachen für Fehler, die Warnungen in SELinux generieren:

  1. Kennzeichnung.
  2. SELinux muss es wissen.
  3. SELinux-Richtlinie und/oder die Anwendung können Fehler aufweisen.
  4. Ihre Daten könnten kompromittiert sein.

Der letzte Fall ist auf Änderungen zurückzuführen, die vorgenommen wurden, um Schwachstellen anzugreifen oder die Verfolgung von Aktivitäten zu vermeiden, obwohl es in beiden Fällen unerlässlich ist, diese Warnungen zu überprüfen. Aus praktischen Gründen werden wir uns im Moment nicht damit befassen, bis eine mögliche zukünftige Veröffentlichung erfolgt.

Kennzeichnung

Etikettierungsproblem :Dateien in /srv/myweb sind nicht richtig gekennzeichnet und können nicht aufgerufen werden.

SELinux weist jedem Element, das an demselben Dienst beteiligt ist, ein Label zu:

  • Binärdatei:/usr/sbin/httpd → httpd_exec_t
  • Konfigurationsdatei:/etc/httpd → httpd_config_t
  • Protokolldatei:/var/log/httpd → httpd_log_t
  • Inhaltsverzeichnis:/var/www/html → httpd_sys_content_t
  • Startskript:/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
  • Prozess:/usr/sbin/httpd → httpd_t
  • Ports:80/tcp, 443/tcp → httpd_t und httpd_port_t

Auf dem Webserver läuft ein Prozess im httpd_t Kontext kann nur mit Objekten mit httpd_something_t interagieren Etikett .

Lösung :Dateien richtig beschriften.

Wenn Sie das richtige Label kennen, führen Sie :

aus
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'

Wenn Sie eine Datei mit dem entsprechenden Label kennen, führen Sie Folgendes aus:

# semanage fcontext -a -e /srv/myweb /var/www

Stellen Sie in beiden Fällen den Standardkontext der Dateien wieder her:

# restorecon -vR /srv/myweb

Etikettierungsproblem :Wenn eine Datei verschoben wird, anstatt sie zu kopieren, behält sie ihre ursprüngliche Bezeichnung.

$ mv index.html /var/www/html/

Lösung :Datei richtig beschriften.

Ändern Sie den Kontext in das richtige Label:

# chcon -t httpd_system_content_t /var/www/html/index.html

Ändern des Kontexts mit einem Referenzlabel:

# chcon --reference /var/www/html/ /var/www/html/index.html

Stellen Sie in beiden Fällen den Standardkontext der Datei wieder her:

# restorecon -vR /var/www/html/

[ Das könnte Ihnen auch gefallen: Zugriff auf die SELinux-Richtliniendokumentation ]

SELinux muss es wissen

Service-Anpassung :Der Webserver wartet auf Anfragen auf Port 8585.

Um den gewünschten Port zum Kontext hinzuzufügen, führen Sie Folgendes aus:

# semanage port -a -t http_port_t -p tcp 8585

Hinzufügen von Funktionen zum Dienst :Der Webserver kann E-Mails versenden.

Um die E-Mail-Sendefunktion zu aktivieren, schalten Sie den booleschen Wert ein und führen Sie aus:

# setsebool -P httpd_can_sendmail 1

Das -P flag macht die Änderung im booleschen Wert dauerhaft.

Um alle booleschen Werte zu erhalten, führen Sie Folgendes aus:

# getsebool -a

Um den Status eines booleschen Werts zu überprüfen, führen Sie Folgendes aus:

# semanage boolean -l

Fehlerbehebung bei Richtlinien

Für einige Dienste wurde keine spezifische Richtlinie erstellt, die die erforderlichen Berechtigungen enthält, um mit SELinux zu arbeiten. Um festzustellen, was diese Berechtigungen sind, ist es notwendig, den Permissive-Modus einzustellen und die Protokolle auf Zugriffsfehler zu überprüfen.

Dienst funktioniert nicht :wicd wird anstelle des NetworkManager-Dienstes verwendet, um drahtlose Verbindungen zu handhaben.

Untersuchen der audit.log Datei für verweigerten Zugriff:

# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 setattr } for  pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0

Beachten Sie, dass einige Elemente an den Kontexten NetworkManager_t beteiligt sind und etc_t erfordern Rechte und Zugriff auf verschiedene Dateien und die Erstellung von Sockets.

Erstellen Sie die Type Enforcement (.te)-Datei mit den erforderlichen Berechtigungen für die Richtlinie:

# vi my_wicd.te
module my_wicd 1.0;
 
require {
        type NetworkManager_t;
        type etc_t;
        class ipx_socket create;
        class ax25_socket { create ioctl };
        class appletalk_socket { create ioctl };
        class file setattr;
}
 
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;

Um die Richtlinie zu kompilieren, installieren Sie das Paket selinux-policy-devel und generieren Sie das Richtlinienpaket:

# make -f /usr/share/selinux/devel/Makefile my_wicd.pp

Um das neu generierte Modul zu aktivieren, führen Sie Folgendes aus:

# semodule -i my_wicd.pp

Richtlinienfehlermeldung :Beim Versuch, auf meine Website zuzugreifen, finde ich SELinux-Fehler in den Protokollen.

Einer der häufigsten Fallstricke bei der Fehlerbehebung von SELinux-Fehlermeldungen ist das Erstellen von Richtlinien gemäß allen gefundenen Fehlermeldungen. In den meisten Fällen, wenn die setroubleshoot Paket installiert ist, zeigt uns dieselbe Warnung alle möglichen Workaround-Optionen, von der besten bis zur niedrigsten.

Zur Überprüfung der setroubleshoot heute generierte Warnungen, führen Sie Folgendes aus:

# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
                                                               
 *****  Plugin restorecon (99.5 confidence) suggests   ************************
                                                               
 If you want to fix the label
 /var/www/html/index.html default label should be httpd_sys_content_t.
 Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
 Do
 # /sbin/restorecon -v /var/www/html/index.html
                                                               
 *****  Plugin catchall (1.49 confidence) suggests   **************************
                                                               
 If you believe that httpd should be allowed getattr access on the index.html file by default.
 Then you should report this as a bug.
 You can generate a local policy module to allow this access.
 Do
 allow this access for now by executing:
 # ausearch -c 'httpd' --raw | audit2allow -M my-httpd
 # semodule -X 300 -i my-httpd.pp

In diesem Fall besteht die beste Lösung darin, einfach das Label der Datei zu korrigieren.

[ Verbessern Sie Ihre Fähigkeiten zur Verwaltung und Verwendung von SELinux mit diesem hilfreichen Leitfaden. ] 

Abschluss

Die Fehlerbehebung von SELinux kann schwierig sein, aber wenn Sie die hier aufgeführten Konzepte anwenden und die Komponenten des Dienstes verstehen, können Sie alle Herausforderungen bewältigen, die sich Ihnen stellen.

Denken Sie daran:


Linux
  1. Fehlerbehebung und Debugging für Linux-Netzwerke?

  2. Pthreads und Vfork?

  3. Gewusst wie:MTR – Netzwerkkonnektivität verstehen und Fehler beheben

  4. Grundlegende Nginx-Fehlerbehebung

  5. Beispiel für eine logrotate-Konfiguration und Fehlerbehebung

Eine Sammlung von Dienstprogrammen zur Vereinfachung der Fehlerbehebung und Leistungsoptimierung von Linux-Netzwerken

17 beste Linux-Netzwerk- und Fehlerbehebungsbefehle für Anfänger

Grundlegendes zur SELinux-Dateikennzeichnung und zum SELinux-Kontext

Glusterfs – Erweiterte Tipps und Tricks zur Fehlerbehebung

Fehlerbehebung bei Gateway-Fehlern und Zeitüberschreitungen:502, 504

Debuggen von iptables und häufigen Firewall-Fallstricken?