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

SELinux: ограничить исходящие соединения httpd по адресу и порту?

У нас есть среда с несколькими хостами, на одном из которых httpd, а на втором - сервер приложений. Мы хотели бы использовать SELinux на хосте httpd, а целевая политика по умолчанию вызывает мало проблем. Но это не позволяет httpd устанавливать исходящее сетевое соединение с хостом сервера приложений.

Есть логическое значение SELinux httpd_can_network_connect что, если установлено, разрешит неограниченное количество исходящих подключений, но я хотел бы найти более узкое решение. Я думаю, что могу контролировать порты назначения, определив новый список типов портов:

порт semanage -a -t ajp_port_t -p tcp 9010

а затем создайте локальную политику со следующим:

разрешить httpd_t ajp_port_t: tcp_socket {name_connect};

Как я могу контролировать адрес назначения?

Для настройки потребуется следующая политика SELinux. ПРИМЕЧАНИЕ: здесь я предполагаю, что тип ajp_port_t в настоящее время фактически не существует в системе.

policy_module(myhttpd, 1.0.0)

gen_require(`
        type httpd_t;
')

type ajp_packet_t;
corenet_packet(ajp_packet_t)

type ajp_port_t;
corenet_port(ajp_port_t)

allow httpd_t ajp_port_t:tcp_socket { client_stream_socket_perms name_connect };
allow httpd_t ajp_port_t:packet { flow_in flow_out forward_in forward_out recv send };

Затем выполните команду

semanage port -a -t ajp_port_t -p tcp 9010

Управлять адресом несколько сложнее. И ваша ответственность может привести к тому, что ящик перестанет отвечать по сети! Так что будьте осторожны.

Для этого вам понадобится этот модуль политики, он разрешает всем доменам отправлять / получать немаркированные пакеты. если ты не сделайте это сначала, вы можете потерять сеть, потому что по умолчанию почти все домены не имеют разрешений на отправку / получение немаркированных пакетов!

policy_module(unconfined_packets, 1.0.0)
require {
        attribute domain;
        type unlabeled_t;
}

gen_tunable(allow_unlabeled_packets, `true');

tunable_policy(allow_unlabeled_packets, `
        allow domain unlabeled_t:packet { flow_in flow_out forward_in forward_out recv send };
')

Затем вы должны пометить пакеты, входящие и исходящие с этого хоста, с помощью iptables.

iptables -I INPUT -p tcp --sport 9010 -s <src_addr> -j SECMARK --selctx system_u:object_r:ajp_packet_t
iptables -I OUTPUT -p tcp --dport 9010 -d <dst_addr> -j SECMARK --selctx system_u:object_r:ajp_packet_t
iptables -A INPUT -j CONNSECMARK --restore
iptables -A OUTPUT -j CONNSECMARK --save