Mi sistema ejecuta CentOS 6.4 con apache2.2.15. SElinux está aplicando y estoy intentando conectarme a una instancia local de redis a través de mi aplicación python/wsgi. Recibo el error 13, Permiso denegado. Podría solucionar esto mediante el 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 crear un módulo que permita que httpd se conecte al puerto 6379 (redis) o cualquier tcp en 127.0.0.1, sería preferible. No estoy seguro de por qué mi paranoia es tan fuerte con esto, pero bueno...
¿Nadie sabe?
Respuesta1
De forma predeterminada, la política de SELinux solo permitirá el acceso de 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.
- agregar el puerto Redis (6379) a la política 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-server
RPM 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";
?>
Respuesta2
Es posible que necesites usar
semanage port -m -t http_port_t -p tcp 6379
Si falta semanage, agregue el paquete Policycoreutils-python
yum install policycoreutils-python
Respuesta3
Puede poner temporalmente selinux en modo permisivo y dejar que httpd se conecte a redis, luego generar y construir un módulo de política personalizado usandoauditoría2permitir