es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Apache proxy + UNIX socket + SELINUX: ¿Cómo se hace?

Estoy tratando de hacer funcionar gunicorn detrás de un proxy de Apache a través de un socket UNIX en el sistema de archivos. En resumen, funciona con SELinux en modo no obligatorio pero no cuando está habilitado. Estoy tratando de solucionar eso. Aquí está mi archivo de socket creado por gunicorn:

srwxrwxrwx. dh dh system_u:object_r:httpd_sys_content_t:s0 /var/www/wsgi/dham_wsgi.sock

Esto es lo que audit2why tiene que decir al respecto después de un acceso fallido a través de Apache:

type=AVC msg=audit(1641287516.397:870181): avc: denied { connectto } for pid=23897 comm=”httpd” path=”/var/www/wsgi/dham_wsgi.sock” scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=unix_stream_socket permissive=0

Fue causado por:
Falta una regla de permisos de aplicación de tipo (TE).
Puede usar audit2allow para generar un módulo cargable que permita este acceso.

Sigamos esa pista, leamos algunas páginas del manual y de Internet, y pongámonos a trabajar:

$ sudo cat /var/log/audit/audit.log | audit2allow -m httpd_socket -l > httpd_socket.te
$ cat httpd_socket.te

module httpd_socket 1.0;

require {
type httpd_t;
type httpd_sys_content_t;
class sock_file write;
}

#============= httpd_t ==============
allow httpd_t httpd_sys_content_t:sock_file write;
$ checkmodule -M -m -o httpd_socket.mod httpd_socket.te
checkmodule: loading policy configuration from httpd_socket.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 19) to httpd_socket.mod
semodule_package -o httpd_socket.pp -m httpd_socket.mod
$ sudo semodule -i httpd_socket.pp

Pero no funciona, todo está igual que antes. Reiniciar Apache no hace ninguna diferencia. ¿Y ahora qué?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la política de SELinux aún no permite el acceso necesario para que Apache se conecte al socket de UNIX.

    Una posible solución es cambiar el contexto de SELinux del archivo de socket para que coincida con el contexto del proceso de Apache. Aquí se explica cómo hacerlo:

    sudo chcon -t httpd_sys_content_t /var/www/wsgi/dham_wsgi.sock
    

    Esto cambiará el contexto de SELinux del archivo de socket a httpd_sys_content_t, que es el tipo esperado por el proceso de Apache.

    Después de hacer este cambio, intenta reiniciar Apache y verifica si ahora se puede conectar al archivo de socket. Si aún no funciona, es posible que debas investigar más y generar reglas adicionales de SELinux utilizando audit2allow.

Comments are closed.