Fedora – GDM stürzt wegen SELinux ab

Ein schlecht ausgerolltes Update der SELinux Policies unter Fedora 27 führt dazu, daß der Loginbildschirm, im Fachjargon „Greeter“ genannt, mit einer unschönen Meldung absemmelt.

Fehleranalyse

Betroffene Version:  sellinux-policy 3.13.1-283.35

Wenn Eurer GDM Greeter also mit dem „blah blah ‚Benutzer abmelden'“ Fehler stehen bleibt, dann prüft folgendes:

1. „STRG+F2“ damit Ihr eine Root Konsole bekommt

2. „grep gdm /var/log/messages oderjournalctl -xe | grep gdm

kommt dabei das hier raus:

Jul 8 01:40:51 eve systemd[1627]: selinux: avc: denied { status } for auid=n/a uid=42 gid=42 cmdline=“/usr/libexec/gdm-x-session gnome-session –autostart /usr/share/gdm/greeter/autostart“ scontext=system_u:system_r:xdm_t:s0-s0:c0.c1023 tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=system permissive=0

dann hilft Euch das hier weiter, falls keine neuere Version im Repository verfügbar ist (also vorher mit dnf -y update checken) :

dnf -y downgrade selinux-policy*
systemctl restart gdm

und anschließend das erneute Update mit dem Eintrag „exclude=selinux-p*“ in die /etc/dnf/dnf.conf verhindern.

Fazit

So eine Scheiße will einem um 1.10 Uhr nachts wirklich nicht passieren!

Probleme mit SELinux reparieren

SELinux mal wieder mal um die Ohren geflogen? Vielleicht kann dieser Artikel helfen.

Es war einmal eine neue SSD …

Vor einigen Tagen habe ich meine Systemfestplatte durch eine SSD ersetzt. Da die ganze Platte verschlüsselt war, folgte ein ziemlich aufwändiger Prozess um die Inhalte zu kopieren. Dabei wurde SELinux allerdings vergessen, was dazu geführt hat, daß Linux danach nicht mehr ganz störungsfrei lief.

Alles in allem häuften sich Meldungen wie diese :

Mar 22 23:10:48 eve python: SELinux is preventing /usr/lib64/firefox/plugin-container from open access on the file .

Da stellt sich einem Admin erstmal die Frage, welches File er da nicht öffnen konnte und wieso nicht. Leider bleibt diese Frage unbeantwortet, da das Audit von SELinux dazu schweigt. Dummerweise weiss man nicht welche Datei gemeint ist und was falsch sein könnte. Solange mein Bugreport nicht zu einer Änderung führt, werden wir das auch nie erfahren, da nicht mal strace herausfindet, welche Datei gemeint ist.

Wie Anfangs schon erwäht, wurden Daten von einer Platte auf eine andere kopiert und letztlich war das das Problem.

Was macht SELinux ?

SELinux (ab jetzt nur SEL ) kennt für fast jede Datei einen Zugriffscontext, fcontext genannt. Mit einem ls sieht man diesen Context nicht gleich, dazu muß man die -Z Option benutzen :

# ls -lad /home/
drwxr-xr-x. 4 root root 4096 20. Mär 07:03 /home/

# ls -ladZ /home/
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 /home/

Das Verzeichnis /home/ hat also als Defaultcontext „home_root_t“ ( die enden fast alle auf _t, nicht fragen ). Alle Dateien in /home/ bekommen auch erstmal diesen Context. Programm die in einem Context gestartet wurden, können erstmal nicht auf Dateien in einem anderen Context zugreifen. Das verhindert, daß man durch den Hack z.b. des Apache Webservers auf systemrelevante Dateien zugreifen kann, auch wenn man durch den Hack Rootuser geworden ist. An sich eine Supersache was Security angeht.

Damit das klappt gibt es unter „/etc/selinux/targeted/contexts/files“ eine Liste mit Contexten, die Dateien zugeordnet sind. Wenn man jetzt TAR benutzt um den Inhalt einer Platte von A-> B zu kopieren, geht der Context verloren, aber SELinux findet beim Start seine Configdateien und handelt danach.

Jetzt wurden aus Platzgründen auf der SSD diese Dateien beim Kopieren beschädigt, weswegen der Rechner überhaupt gebootet hat, weil damit der Regelsatz gelöscht war. Da aber andere Dateien mit Contexten versehen wurden, was automatisch beim Anlegen einer Datei passiert (z.b. mit cp a b/) , gab es einige Contexte und andere nicht. Besonders das Home-Verzeichnis strotzt nur so vor Contexten.

Jede Fehlermeldung von SELinux wird dem User präsentiert. Dazu poppt auf dem Desktop eine Warnung auf. In dieser Warnung steht auch, was man dem System zu sagen hat, damit es diesen Zugriff zuläßt. Diese Ausnahmen muß es geben, damit Programme über verschiedene Contexte hinweg Daten austauschen können, z.b. Dateien per SSH ins Webverzeichnis spielen, per Samba Dateien kopieren usw.

Heute morgen hat das Chaos dann komplett zugeschlagen. Systemd konnte nicht mehr booten, da erneut SEL-rechte geändert wurden. Das führte zum komischsten Bootbug bisher. „failure to access /dev/initctl“, wo Systemd auf den „initctl“ Socket nicht mehr zugreifen konnte, also auf den eigentlichen Initprozess.

Wie man es behebt

In meinem Fall habe ich von der „alten“ Platte gebootet und systemd neu installiert, damit waren die komischen Bootprobleme behoben, aber die Gnomeshell startete trotzdem nicht. Was im Einzelnen nicht lief, lies sich nicht feststellen, damit man nicht mal mehr im Debugmodus ins System kam.

Abhilfe schaffte das Abschalten von SEL in /etc/selinux/config :

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=permissive
#SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted

Der Permissive Modus ist eine Art Debugmode, SEL meckert zwar über die Sicherheitsprobleme, verhindert Sie aber nicht. Damit kann das System wieder booten und man kann die SEL Einstellungen und Probleme reparieren.

Ursachenbeseitigung

Wie sich nach nun umfassender Analyse der SEL Konfigurationen gezeigt hat, war der Policyordner defekt. Dateien mit 0 Bytegröße waren die Regel ( weil die Platte zwischenzeitlich voll war ) .

Das Verzeichnis /etc/selinux/targeted stellt den Regelsatz dar, den SEL befolgen soll, so stehts in der config (siehe oben). Diesen Ordner löscht man und ersetzt ihn anschliessend mit einer alten Kopie. In meinem Fall, von der alten Festplatte. Die Verzeichnisstruktur hat sich nicht geändert, also paßt der Regelsatz, da er „Laufwerke“ nicht beachtet, sondern nur „Pfade“ enthält. Der Name des Bootdevices spielt also keine Rolle.

Nun gibt man noch ein :

# restorecond -R -v /*

Das dauert eine Weile, weil alle Files auf der Platte auf den im Regelsatz enthaltenen Wert zurück gesetzt werden. Mit einer SSD ist man in Minuten durch, mit einer SATA dauert es eine halbe Ewigkeit. Vor den vielen Ausgaben nicht erschrecken, es werden fast alle Dateien auf der Platte gerichtet!

Nun stellt man noch SEL in der /etc/selinux/config auf enforcing um :

# SELINUX=permissive
SELINUX=enforcing

Nun kann man rebooten und der Rechner läuft wieder.

Kleiner Tip an die Gemeinde: Kauft gleich eine TB große SSD, wenn Ihr Videos auf der Platte habt. Spart euch das Linken auf die alte Platte, damit spart Ihr euch eine Menge zusätzlichen Ärgers. Das Musik-  und Videos-Verzeichnis hat genauso Contexte wie alles andere und die müssen passen.

So habe ich das gemacht :

# ls -ladZ /home/marius/Videos
lrwxrwxrwx. marius marius unconfined_u:object_r:user_home_t:s0 /home/marius/Videos -> /sata_home/marius/Videos

]$ ls -ladZ /sata_home /sata_home/marius/
drwxr-xr-x. root root system_u:object_r:user_home_dir_t:s0 /sata_home/
drwx——. marius marius unconfined_u:object_r:user_home_dir_t:s0 /sata_home/marius/

In der /etc/fstab dann noch :

/dev/mapper/luks-53246778-9093-123d-235b-4f35522234211 /sata_home ext4 defaults,x-systemd.device-timeout=0 1 2

Eingetragen um die alte Home Partition als /sata_home zu mounten. Da die Passwörter für die Platten gleich sind ( beim Einrichten & Partitionieren der neuen Platte einfach so eintippen ) , wird diese Lukspartition auch automatisch beim Booten entschlüsselt und kann dann gemountet werden.

 

 

Sambafreigaben unter Fedora 20 managen

Fedora kommt standardmäßig mit einem Medienfreigabecenter daher. Leider handelt es sich dabei nicht um Freigaben wie man Sie von Windows kennt, sondern um DLNA Zugänge für mobile und nicht ganz so mobile Endgeräte bereitzustellen. Es ist nicht leicht zu erkennen, was man da eigentlich freigibt und nutzen tut es oft auch nichts, wenn man mit Windowsrechnern Daten austauschen möchte.

Zum Glück gibt es eine einfach Lösung dafür : Samba.

Folgende Paket müssen dazu installiert sein:

samba-common-4.1.6-1.fc20.i686
samba-client-4.1.6-1.fc20.i686
samba-4.1.6-1.fc20.i686
samba-vfs-glusterfs-4.1.6-1.fc20.i686

und

system-config-samba-1.2.100-2.fc20.noarch

Letzteres Paket gibt uns den im Fedora 20 verloren gegangenen Sambakonfigurator für die Oberfläche zurück:

 

Samba-Config

Damit kann man wirklich problemlos alle Freigaben managen. Aktivieren wir zunächst Samba. Dazu als Root eingeben:

systemctl enable smb
systemctl start  smb

Hat man das gemacht, wird man leider feststellen, daß die Freigaben nicht funktionieren 🙁 Die Ursache ist SELINUX, daß den Zugriff von Samba auf die Verzeichnisse verhindert.

Der schnellste Weg: als Root „setenforce 0“ eingeben. Damit ist SELINUX erstmal im Überredungsmodus, d.h. es meckert zwar, aber es klappt. Die Freigabe kann man nun von außen aufrufen. Das muß man auch tun, damit nun die nötigen Meldungen im SELinux produziert werden. Danach muß nur noch den Fehlermeldungen vom SEL-Control folgen, und die nötigen Änderungen an der SEL-Configuration vornehmen.

setsebool -P samba_share_fusefs 1
setsebool -P samba_export_all_ro 1
setsebool -P samba_export_all_rw 1
grep smbd /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp

Jetzt wieder SEL aktivieren : „setenforce 1“ . Das wars. Samba kann jetzt die Freigaben benutzen und das einem regen Datenaustausch steht nichts mehr im Weg.

Kleiner Tip für Android: Mit dem ES Datei Explorer und MX-Player, kann man alle Videos von der heimischen Platte ohne Probleme auf dem Handy oder Tablet als Stream sehen, dank Samba.