SElinux: permite que httpd se conecte a un puerto específico

41

Mi sistema ejecuta CentOS 6.4 con apache2.2.15. SElinux está aplicando y estoy tratando de conectarme a una instancia local de redis a través de mi aplicación python / wsgi. Me sale el error 13, permiso denegado. Podría solucionar esto a través del comando:

setsebool -P httpd_can_network_connect

Sin embargo, no quiero exactamente que httpd pueda conectarse a todos los puertos tcp. ¿Cómo puedo especificar a qué puertos / redes se permite conectar httpd? Si pudiera hacer un módulo para permitir que httpd se conecte al puerto 6379 (redis) o cualquier tcp en 127.0.0.1, eso sería preferible. No estoy seguro de por qué mi paranoia es tan fuerte en esto, pero bueno ...

¿Nadie sabe?

ciudadano salvaje
fuente
¿No sería mejor obligarlo a salir a través de un proxy? De esa manera usted puede a) tener un mejor control sobre lo que se puede acceder b) tener una mejor auditoría sobre lo que sucedió y cuándo.
Cameron Kerr

Respuestas:

51

Por defecto, la política de SELinux solo permitirá el acceso a los servicios a puertos reconocidos asociados con esos servicios:

# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Cannot connect to redis server.

- agregue el puerto Redis (6379) a la política de SELinux

# semanage port -a -t http_port_t -p tcp 6379
# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      6379, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Connected successfully.

También puede instalar setroubleshoot-serverRPM y ejecutar: sealert -a /var/log/audit/audit.log- le dará un buen informe con sugerencias útiles (incluido el comando anterior).

Script PHP para probar la conexión:

# cat redis.php 
<?php

$redis=new Redis();
$connected= $redis->connect('127.0.0.1', 6379);

if(!$connected) {
        die( "Cannot connect to redis server.\n" );
}

echo "Connected successfully.\n";

?>
HTF
fuente
3
Tuve el problema en Fedora 23 de enviar correo electrónico (conectándose a 127.0.0.1 en el puerto 25) desde un script perl (usando Net :: SMTP) iniciado desde httpd. "El permiso para que httpd se conecte al puerto 25" no es lo que uno está buscando en ese caso. La adición de hecho el puerto 25 para el tipo SELinux http_port_tfalla porque el puerto 25 ya se utiliza (para otro tipo SELinux): ValueError: Port tcp/25 already defined. La forma correcta de permitir que httpd se conecte al puerto 25 es configurar la política booleana de SELinux correspondiente en: setsebool -P httpd_can_sendmail on(ver getseebool -a). (continúa en la parte 2)
David Tonhofer
1
(viene de la parte 1) Sin embargo, si usted desea enviar desde un script Perl, usted tiene que crear explícitamente un módulo de SELinux que permite que: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Entonces funciona!
David Tonhofer
@DavidTonhofer Error tipográfico menor en el getsebool -acomando (uno menos e).
davidjb
1
@DavidTonhofer que no tiene que crear una nueva política para el puerto existente, puede modificarlo en su lugar: semanage port -m -t http_port_t -p tcp 25, consultesemanage port --help
HTF
Para zabbix, ya hay un booleano especifico en CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer
17

Es posible que necesite usar

semanage port -m -t http_port_t -p tcp 6379

Si falta semanage, agregue el paquete policycoreutils-python

yum install policycoreutils-python
Tom Hallam
fuente
semanagepuede estar policycoreutils-python-utilsahora (al menos en Fedora 23)
David Tonhofer
1
CentOS 7 todavía incluye semanageen policycoreutils-python.
jxmallett
gracias por dar una respuesta a la pregunta en lugar de otra cosa.
Florian Heigl
3

Puede poner temporalmente a selinux en modo permisivo y dejar que httpd se conecte a redis, luego generar y construir un módulo de política personalizado usando audit2allow

A.M
fuente