Product SiteDocumentation Site

7.2.2. ¿Cómo se Ejecutan los Servicios Confinados?

Los servicios se pueden ejecutar en una variedad de formas. Para cambiar esto, debe decirle a SELinux cómo correrá los servicios. Esto se puede conseguir vía los Booleanos que permiten que parte de las políticas de SELinux se cambien en tiempo de ejecución, sin ningún conocimiento sobre la escritura de políticas de SELinux. Esto permite cambios, tales como permitir a servicios que accedan a sistemas de archivo NFS, sin recargar o recompilar una política SELinux. También, correr servicios en números de puerto no predeterminados requiere que la configuración de la política se actualice vía el comando semanage.
Por ejemplo, para permitir al Servidor HTTP Apache comunicarse con MySQL, active el Booleano httpd_can_network_connect_db:
# /usr/sbin/setsebool -P httpd_can_network_connect_db on

Si el acceso es denegado para un servicio particular, use los comandos getsebool y grep para ver si algún Booleano está disponible para permitir el acceso. Por ejemplo, use el comando getsebool -a | grep ftp para buscar un Booleano relacionado con FTP:
$ /usr/sbin/getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off

For a list of Booleans and whether they are on or off, run the /usr/sbin/getsebool -a command. For a list of Booleans, an explanation of what each one is, and whether they are on or off, run the /usr/sbin/semanage boolean -l command as the Linux root user. Refer to Sección 5.6, “Booleanos” for information about listing and configuring Booleans.
Números de Puertos
Dependiendo de la configuración de la política, los servicios pueden tener permitido correr sobre ciertos números de puerto. Intentar cambiar el puerto en el que corre un servicio sin cambiar la política puede resultar en un fallo al iniciar el servicio. Por ejemplo, ejecute el comando semanage port -l | grep http como usuario root de Linux para listar los puertos relacionados con http:
# /usr/sbin/semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

El tipo de puerto http_port_t define los puertos en los que el Servidor HTTP Apache puede escuchar, que en este caso son los puertos TCP 80, 443, 488, 8008, 8009, y 8443. Si un administrador configura httpd.conf para que httpd escuche en el puerto 9876 (Listen 9876), pero la política no fue actualizada para reflejar esto, el comando service httpd start falla:
# /sbin/service httpd start
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:9876
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:9876
no listening sockets available, shutting down
Unable to open logs
						            [FAILED]

Una negación de SELinux es similar a la siguiente y se guarda en /var/log/audit/audit.log:
type=AVC msg=audit(1225948455.061:294): avc:  denied  { name_bind } for  pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket

Para permitir a httpd escuchar en un puerto que no está listado en el tipo de puerto http_port_t, ejecute el comando semanage port para agregar un puerto a la configuración de la política [14]:
# /usr/sbin/semanage port -a -t http_port_t -p tcp 9876

La opción -a agrega un nuevo registro; la opción -t define un tipo; y la opción -p define un protocolo. El último argumento es el número de puerto a agregar.


[14] El comando semanage port -a agrega una entrada al archivo /etc/selinux/targeted/modules/active/ports.local. Nota: por defecto, este archivo sólo puede ser visto por el usuario root de Linux.