Назад | Перейти на главную страницу

Настройте SELinux, чтобы разрешить все исходящие порты tcp и udp

У меня есть приложение, которое потенциально подключается к любому исходящему удаленному порту tcp / udp. В результате мне нужен способ разрешить все исходящие соединения TCP и UDP.

Я понимаю, что вы можете использовать комбинацию audit2allow и semodule -i для отказа name_connect в журнале аудита selinx. На данный момент это мой текущий обходной путь. Тем не менее, это не масштабируемо для меня, запускать это для каждого порта, с которым я столкнусь в будущем. Я хотел бы доказать это в будущем. Я не знаю этот список портов, к которым нужно получить доступ перед установкой приложения.

Надеюсь, что есть конфигурация для открытого доступа всем. Можно ли расширить эту конфигурацию, чтобы разрешить все исходящие порты TCP и UDP для всех приложений (выше я запрашивал только для фиксированного приложения)?

В худшем случае я перечислю все возможные порты в файлах .pp и .te и установлю их с помощью semodule -i один раз.

пример

В этом случае мое приложение хотело подключиться к 8181. Однако я хочу, чтобы оно могло подключаться к 0

type=AVC msg=audit(1543521403.978:2324): avc:  denied  { name_connect } for  pid=26497 comm="java" dest=8181 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:intermapper_port_t:s0 

tclass = tcp_socket

audit2allow сгенерировал:

module joseph-module 1.0;

require {
    type tomcat_t;
    type intermapper_port_t;
    class tcp_socket name_connect;
}

#============= tomcat_t ==============
allow tomcat_t intermapper_port_t:tcp_socket name_connect;

Просматривая существующие политики SELinux, я вижу, что есть логическое значение, которое позволяет Apache устанавливать исходящие подключения к любому TCP-порту. Выглядит это так:

[root@localhost ~]# sesearch -s httpd_t -A -p name_connect -b httpd_can_network_connect
allow httpd_t port_type:tcp_socket name_connect; [ httpd_can_network_connect ]:True

Я уверен, что вы могли бы адаптировать это, например:

allow tomcat_t port_type:tcp_socket name_connect;

1) Создайте файл allow-all-outbound-ports.te

module allow-all-outbound-ports 1.0;

require {
    type tomcat_t;
    type port_type;
    class tcp_socket name_connect;
    class udp_socket name_connect;
}

#============= tomcat_t ==============
allow tomcat_t port_type:tcp_socket name_connect;
allow tomcat_t port_type:udp_socket name_connect;

Затем я выполнил инструкции из https://relativkreativ.at/articles/how-to-compile-a-selinux-policy-package о том, как создать свой собственный пакет из файла .te.

2) преобразовать .te в .mod

checkmodule -M -m -o allow-all-outbound-ports.mod allow-all-outbound-ports.te
stdout: checkmodule:  loading policy configuration from allow-all-outbound-ports.te
stdout: checkmodule:  policy configuration loaded
stdout: checkmodule:  writing binary representation (version 19) to allow-all-outbound-ports.mod

3) преобразовать .mod в .pp

semodule_package -o allow-all-outbound-ports.pp -m allow-all-outbound-ports.mod
<no std out>

4) установить пакет

semodule -i allow-all-outbound-ports.pp

После всех этих команд мое приложение могло связываться с любым портом. Я попробовал 5357, порт, который никогда раньше не использовал. Обратите внимание, что tomcat_t может быть что угодно по вашему выбору.