No que diz respeito ao SELinux, "escutar" e "conectar-se a" não são não a mesma coisa. Essas são duas coisas diferentes e, para ser capaz de fazer isso, o processo precisa ter a permissão correta. No caso de ligação a uma porta e conexão a uma porta, essas permissões são name_bind
e name_connect
, respectivamente.
Nesse caso, estamos interessados em permissões de classe. Mas, novamente, como é geralmente o caso com o SELinux, estamos perdendo uma informação - permissões em qual classe? Eu sinto que deve haver uma maneira melhor de encontrar isso, mas ainda não me deparei com isso. Então, vamos usar o que sabemos:
sesearch -d -A -t http_port_t
Found 81 semantic av rules:
allow cloud_init_t http_port_t : tcp_socket name_connect ;
...
Isso nos mostrará todas as regras de permissão em que http_port_t é o destino. Felizmente, podemos notar que todos eles operam na mesma classe - tcp_socket. E isso faz sentido. Agora vamos verificar todas as permissões que a classe tcp_socket tem (tanto quanto sei, está definida na própria política).
seinfo -ctcp_socket -x
-
-c
imprime classes de objetos (observe que não deve haver um espaço entre o sinalizador e o nome) -
-x
mostra mais informações (neste caso, a coisa em que estamos interessados - as permissões!)
Isso listará todas as permissões que se aplicam à classe tcp_socket - entre elas, name_bind e name_connect, que são os significados LISTEN ON e CONNECT TO da sua pergunta.
Vamos supor que você queira usar haproxy - haproxy tem o tipo SELinux de haproxy_t
. Agora, para ver quais permissões o haproxy tem nas portas definidas em http_port_t:
sesearch -d -A -s haproxy_t -t http_port_t
Found 1 semantic av rules:
allow haproxy_t http_port_t : tcp_socket { name_bind name_connect } ;
Isso nos mostra que haproxy tem permissões name_bind e name_connect. Portanto, qualquer porta que você adicionar a http_port_t, permitirá que o haproxy se conecte e conecte à referida porta (no entanto, todos os outros tipos que usam http_port_t também poderão usar suas respectivas permissões na porta mencionada! Por exemplo, o openvpn poderá receber e enviar mensagens e ligar e conectar).
Se em vez de http_port_t, haproxy usasse tipos específicos para cada permissão, haproxy_connect_port_t e haproxy_bind_port_t com permissões name_connect e name_bind, respectivamente, se você adicionasse a porta apenas a haproxy_connect_port_t, só conseguiria se conectar à porta, não escutar / ligue-se a ele.