CentOS 7.4, Spacewalk 2.7 und Reposync: Internal Server Error

Nach meiner letzten Spacewalk 2.7-Installation hatte ich das Problem, dass das Synchronisieren von Repositories über die Web-Oberfläche mit folgender Nachricht fehlschlug:

Reposync-Fehler in der Web-Oberfläche von Spacewalk 2.7

Ein Blick in das System-Protokoll (/var/log/messages) brachte folgendes zum Vorschein:

1Jan 24 21:02:13 st-spacewalk03 server: **Caused by: java.lang.RuntimeException: File not found: /var/log/rhn/reposync/icinga2.log**
2Jan 24 21:02:13 st-spacewalk03 server: at com.redhat.rhn.common.util.FileUtils.readStringFromFile(FileUtils.java:101)
3Jan 24 21:02:13 st-spacewalk03 server: at com.redhat.rhn.frontend.action.channel.manage.SyncRepositoriesAction.getLastSyncLog(SyncRepositoriesAction.java:215)
4Jan 24 21:02:13 st-spacewalk03 server: at com.redhat.rhn.frontend.action.channel.manage.SyncRepositoriesAction.parseSyncLog(SyncRepositoriesAction.java:227)
5Jan 24 21:02:13 st-spacewalk03 server: at com.redhat.rhn.frontend.action.channel.manage.SyncRepositoriesAction.execute(SyncRepositoriesAction.java:84)
6Jan 24 21:02:13 st-spacewalk03 server: at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
7Jan 24 21:02:13 st-spacewalk03 server: ... 45 more

Kurioserweise existierte die erwähnte Datei:

1# cd /var/log/rhn
2# ll -d reposync
3drwxr-xr-x. 2 root apache 4096 18. Jan 23:21 reposync
4# ll reposync
5total 3244
6-rw-rw----. 1 apache apache   94706 24. Jan 20:57 icinga2.log
7-rw-rw----. 1 apache apache 3203348 24. Jan 20:57 opensuse-42.3.log
8-rw-rw----. 1 apache apache    7915 24. Jan 20:50 spacewalk-27-client.log

Auffällig war auch der SELinux-Typ der Log-Dateien:

1# ll -Z /var/log/rhn/reposync
2-rw-rw----. apache apache unconfined_u:object_r:unconfined_t:s0 icinga2.log
3-rw-rw----. apache apache unconfined_u:object_r:unconfined_t:s0 opensuse-42.3.log
4-rw-rw----. apache apache unconfined_u:object_r:unconfined_t:s0 spacewalk-27-client.log

Das Wiederherstellen des SELinux-Types änderte diesen auf spacewalk_log_t:

1# restorecon -Rv /var/log/rhn/reposync
2restorecon reset icinga2.log context unconfined_u:object_r:unconfined_t:s0->unconfined_u:object_r:spacewalk_log_t:s0
3restorecon reset opensuse-42.3.log context unconfined_u:object_r:unconfined_t:s0->unconfined_u:object_r:spacewalk_log_t:s0
4restorecon reset spacewalk-27-client.log context unconfined_u:object_r:unconfined_t:s0->unconfined_u:object_r:spacewalk_log_t:s0

Leider bestand der Fehler weiterhin. Zeit einen Blick auf SELinux zu werfen. Mit deaktiviertem SELinux funktionierte das Synchronisieren des Repositories, wie auch aus einer Mailingliste hervorging. Das kann natürlich keine dauerhafte Lösung sein - die fehlenden Berechtigungen lassen sich per benutzerdefiniertem SELinux-Modul ausgleichen. Hierzu habe ich zuerst das Audit-Protokoll geleert und anschließend die fehlerhafte Webseite neugeladen, bevor das Protokoll erneut ausgelesen wurde. So lassen sich lediglich die letzten fehlenden Berechtigungen entsprechend in Form eines Modul-Quellcodes (welches hier reposync_tomcat genannt wurde) dokumentieren:

1# > /var/log/audit/audit.log
2# audit2why -i /var/log/audit/audit.log
3type=AVC msg=audit(1516824133.699:59063): avc:  denied  { read } for  pid=3498 comm="java" name="icinga2.log" dev="dm-3" ino=2409 scontext=system_u:system_r:tomcat_t:s0 tcontext=unconfined_u:object_r:spacewalk_log_t:s0 tclass=file
4
5        Was caused by:
6                Missing type enforcement (TE) allow rule.
7
8                You can use audit2allow to generate a loadable module to allow this access.
9# audit2allow -i /var/log/audit/audit.log -m reposync_tomcat > reposync_tomcat.te

Im Quellcode des Moduls stellte sich heraus, dass dem Tomcat-Type die Berechtigungen zum Lesen und Schreiben von Dateien des spacewalk_log_t-Types fehlten:

 1# cat reposync_tomcat.te
 2
 3module reposync_tomcat 1.0;
 4
 5module reposync_tomcat 1.0;
 6
 7require {
 8        type tomcat_t;
 9        type spacewalk_log_t;
10        class file { open read };
11}
12
13#============= tomcat_t ==============
14allow tomcat_t spacewalk_log_t:file open;
15allow tomcat_t spacewalk_log_t:file read;

Zum Übersetzen des Moduls muss ggf. das Paket policycoreutils-devel installiert werden:

1# yum install policycoreutils-devel

Anschließend kann das Modul wie folgt übersetzt und installiert werden:

1# make -f /usr/share/selinux/devel/Makefile reposync_tomcat.pp
2# semodule -i reposync_tomcat.pp

Mit semodule lässt sich auch überprüfen, ob das Modul installiert wurde:

1# semodule -l | grep reposync
2reposync_tomcat 1.0

Und siehe da, schon ging es:

Reposync in der Web-Oberfläche von Spacewalk 2.7

Falls das Synchronisieren von Repositories immer noch fehlschlägt, kann es helfen, die folgende SELinux-Einstellung zu aktivieren (herzlichen Dank für den Kommentar, Rick):

1# setsebool -P tomcat_read_rpm_db 1

Zu der Thematik gibt es im Red Hat-Bugtracker auch schon einen Bug: "1522939: Internal Server Error - Syncing Repos to Channel".

Übersetzungen: