Linux: consentire a httpd di connettersi a una porta specifica


41

Il mio sistema esegue CentOS 6.4 con apache2.2.15. SElinux sta facendo rispettare e sto cercando di connettermi a un'istanza locale di redis tramite la mia app python / wsgi. Ottengo l'errore 13, autorizzazione negata. Potrei risolvere questo tramite il comando:

setsebool -P httpd_can_network_connect

Tuttavia, non voglio esattamente che httpd sia in grado di connettersi a tutte le porte tcp. Come posso specificare a quali porte / reti è consentito connettersi a httpd? Se potessi creare un modulo per consentire a httpd di connettersi alla porta 6379 (redis) o qualsiasi tcp su 127.0.0.1, sarebbe preferibile. Non so perché la mia paranoia sia così forte su questo, ma ehi ...

Qualcuno sa?


Non sarebbe meglio costringerlo a uscire attraverso un proxy? In questo modo è possibile a) avere un migliore controllo su ciò a cui è possibile accedere b) avere un controllo migliore su ciò che è accaduto e quando.
Cameron Kerr,

Risposte:


51

Per impostazione predefinita, la politica SELinux consentirà l'accesso ai servizi solo alle porte riconosciute associate a tali servizi:

# 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.

- aggiungere la porta Redis (6379) alla politica 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.

Puoi anche installare setroubleshoot-server RPM ed eseguire: sealert -a /var/log/audit/audit.log- ti darà un bel rapporto con suggerimenti utili (incluso il comando sopra).

Script PHP per testare la connessione:

# 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";

?>

3
Ho avuto il problema su Fedora 23 di inviare e-mail (collegandomi a 127.0.0.1 sulla porta 25) da uno script perl (usando Net :: SMTP) avviato da httpd. "L'autorizzazione per httpd a connettersi alla porta 25" non è ciò che si sta cercando in quel caso. Infatti aggiungendo porta 25 di tipo SELinux http_port_tfallisce perché la porta 25 è già utilizzata (per un altro tipo SELinux): ValueError: Port tcp/25 already defined. Il modo corretto per consentire a httpd di connettersi alla porta 25 è impostare il corrispondente criterio SELinux booleano su: setsebool -P httpd_can_sendmail on(vedi getseebool -a). (continua nella parte 2)
David Tonhofer,

1
(continua da parte 1) Ma se si desidera inviare da uno script Perl, è necessario creare esplicitamente un modulo SELinux che permette che: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Quindi funziona!
David Tonhofer,

@DavidTonhofer Errore di battitura minore nel getsebool -acomando (uno in meno e).
davidjb,

1
@DavidTonhofer non devi creare una nuova politica per la porta esistente, puoi invece modificarla:, semanage port -m -t http_port_t -p tcp 25vedisemanage port --help
HTF

Per zabbix, esiste già un booleano specifico su CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer,

17

Potrebbe essere necessario utilizzare

semanage port -m -t http_port_t -p tcp 6379

Se manca la semanage, aggiungere il pacchetto policycoreutils-python

yum install policycoreutils-python

semanagepotrebbe essere policycoreutils-python-utilsadesso (almeno su Fedora 23)
David Tonhofer,

1
CentOS 7 include ancora semanagein policycoreutils-python.
jxmallett,

grazie per aver dato una risposta alla domanda anziché qualcos'altro.
Florian Heigl,

3

È possibile mettere temporaneamente selinux in modalità permissiva e consentire a httpd di connettersi a redis, quindi generare e creare un modulo di criteri personalizzato utilizzando audit2allow

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.