Nginx.http.sock ricreato con errato selinux context

Ho un’istanza di Discourse gestita tramite proxy Apache e che comunica tramite un socket, come descritto qui.

Ho SELinux abilitato, quindi per concedere a httpd il permesso di utilizzare il socket, ho assegnato al socket un contesto in cui httpd ha permessi di lettura e scrittura, come consigliato:

semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock
restorecon /var/discourse/shared/standalone/nginx.http.sock

Questo funziona. È ottimo!

(Nota a margine: sarebbe più appropriato un contesto httpd_var_run_t, dato che il socket stesso non è contenuto e questo è il contesto utilizzato da httpd per altre infrastrutture di runtime?)

Tuttavia, ogni volta che il container di Discourse viene riavviato, il file socket viene ricreato con il suo contesto originale, non con quello nuovo; di conseguenza devo eseguire restorecon su di esso prima che Apache possa comunicare con Discourse. È facile dimenticare di farlo e ritrovarsi con un forum inaccessibile. Mi è venuto in mente che potrei utilizzare uno script cron per eseguire restorecon periodicamente, così non devo ricordarmi di farlo manualmente, ma è un workaround poco elegante.

Come posso assicurarmi che il file socket ottenga il contesto corretto alla creazione (o almeno che il suo contesto venga resettato come parte del processo di creazione)?

Creerei uno script di riavvio che avvia il container e modifica i permessi (e un altro che esegue una ricostruzione).

Quello che uno script di riavvio non rileverebbe è eseguire aggiornamenti tramite il web dal pannello di amministrazione: è esattamente ciò che mi è successo l’ultima volta e che mi ha spinto a chiedermi se esistesse una soluzione valida per tutti i casi.

Devo anche dire: non capisco perché il socket non riceva il contesto corretto alla creazione. SELinux sa chiaramente quale dovrebbe essere il contesto predefinito per il socket, come dimostra l’esecuzione di restorecon. (Inoltre, posso vedere la voce relativa al socket generata dall’esecuzione di semanage fcontext in /etc/selinux/targeted/contexts/files/file_contexts.local.)