У меня есть приложение, которое потенциально подключается к любому исходящему удаленному порту 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
может быть что угодно по вашему выбору.