Configurar Apache (httpd) cuando está activado SELinux en CentOS

...

El siguiente tip describe brevemente como configurar SELinux para que el servidor Apache escuche en un puerto diferente al definido por omisión (80).

Nota: los comandos detallados en esta guía, salvo aclaración en contrario, se asumen ejecutados con la identidad de root.

Primer intento!

Si modificamos el archivo de configuración httpd.conf para que el servicio httpd "escuche" en el puerto 81 es posible que obtengamos el siguiente error:

# service httpd start
Starting httpd: [Mon Aug 26 13:41:44 2013] [warn] module dav_svn_module is already loaded, skipping
(13)Permission denied: make_sock: could not bind to address [::]:81
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:81
no listening sockets available, shutting down
Unable to open logs
                                   [FAILED]

Esto se debe a que la configuración de SELinux no permite la utilización de este puerto por parte del servicio httpd. A continuación se describen los pasos que se deben seguir para configurar el servicio de apache (httpd) en un puerto diferente al 80 cuando está activado SELinux.

Pasos iniciales

Verificar estado de SELinux

Para comprobar nuestra hipótesis, ejecutar el comando sestatus y verificar que SELinux se encuentra habilitado:

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Verificar que el servicio httpd esté bajo

Antes de realizar cambios en las configuraciones conviene asegurarse que el servidor Apache está bajo:

# service httpd status
httpd is stopped

Configurar SELinux

Obtener configuración de los puertos donde puede escuchar httpd

Ejecutando el comando semanage port -l se listan todos los puertos habilitados.

Nota: para httpd solo nos interesa conocer los puertos definidos para http_port_t.

# semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118, 11211, 10001-10010
http_cache_port_t              udp      3130, 11211
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

Nota: El puerto 81 no está incluido y por ello el servidor falla al iniciar.

Agregar el puerto 81 a la lista de puertos habilitados para httpd

Necesitaremos del comando semanage port -a para habilitar un puerto, el siguiente comando permite habilitar un puerto para http_port_t:

# semanage port -a -t http_port_t -p tcp 81

Si ejecutamos nuevamente el comando semanage port -l deberíamos ver el puerto agregado a http_port_t.

# semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118, 11211, 10001-10010
http_cache_port_t              udp      3130, 11211
http_port_t                    tcp      81, 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

Iniciar el servicio httpd

Luego de realizar los cambios en las configuraciones se deberá reiniciar el servidor Apache.

# service httpd start

SSL

El procedimiento anterior se deberá repetir si se pretende acceder al servidor a través de HTTPS (SSL) utilizando un puerto no definido en http_port_t.

Referencias


Modificado por última vez en Lunes, 09 Septiembre 2013 04:11

Acerca del autor

Diego E. Mendoza

Diego se desempeña como arquitecto de software en MicroGestion participando en el proceso de análisis y diseño de soluciones que tengan requerimientos de alta disponibilidad, integración de ambientes heterogéneos, orientación a servicios, gestión de procesos de negocio, etc.