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:

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

Kurioserweise existierte die erwähnte Datei:

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

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

# ll -Z /var/log/rhn/reposync
-rw-rw----. apache apache unconfined_u:object_r:unconfined_t:s0 icinga2.log
-rw-rw----. apache apache unconfined_u:object_r:unconfined_t:s0 opensuse-42.3.log
-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:

# restorecon -Rv /var/log/rhn/reposync
restorecon reset icinga2.log context unconfined_u:object_r:unconfined_t:s0->unconfined_u:object_r:spacewalk_log_t:s0
restorecon reset opensuse-42.3.log context unconfined_u:object_r:unconfined_t:s0->unconfined_u:object_r:spacewalk_log_t:s0
restorecon 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:

# > /var/log/audit/audit.log
# audit2why -i /var/log/audit/audit.log
type=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

        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.
# 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:

# cat reposync_tomcat.te

module reposync_tomcat 1.0;

module reposync_tomcat 1.0;

require {
        type tomcat_t;
        type spacewalk_log_t;
        class file { open read };
}

#============= tomcat_t ==============
allow tomcat_t spacewalk_log_t:file open;
allow tomcat_t spacewalk_log_t:file read;

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

# yum install policycoreutils-devel

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

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

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

# semodule -l | grep reposync
reposync_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):

# 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“.

Schreibe einen Kommentar