Friday, 12 March 2010

слушаем привелегированный порт

В последнее время стало популярно запускать сервисы, которые требуют привелигированого порта (порта с значением меньшем чем 1024) написаные на erlang, java, tcl или других интерпртируемых языках.

Самый популярный путь, который использует большинство это NAT средствами iptables. Почему я считаю что это плохой путь? Во-первых, это не решение проблемы, это, факически, маскировка ее. Во-вторых, это лишние накладные расходы (кто-то будет утверждать что NAT бесплатен?).

Первый предлагаемый мной путь это «повесить» capabilities на erlang или скомпилированное приложение:

setcap cap_net_bind_service=+ep /usr/lib64/erlang/erts-5.7.2/bin/beam
setcap cap_net_bind_service=+ep /usr/lib64/erlang/erts-5.7.2/bin/beam.smp

В чем его минусы? Мы отдаем возможность открывать любые порты. Если хочется более тонкой настройки, то придется брать в руки SELinux.

Совсем минимальная политика xmpp_server.fc:

/usr/lib64/erlang/erts-5.7.2/bin/beam.smp   -- gen_context(system_u:object_r:xmpp_server_exec_t,s0)

xmpp_server.if:

interface(`xmpp_server_domtrans',`
    gen_require(`
        type xmpp_server_t, xmpp_server_exec_t;
    ')

    domtrans_pattern($1, xmpp_server_exec_t, xmpp_server_t)
')

xmpp_server.te:

policy_module(xmpp_server,1.0.0)
type xmpp_server_t;
type xmpp_server_exec_t;
inetd_service_domain(xmpp_server_t, xmpp_server_exec_t)
permissive xmpp_server_t;
type xmpp_server_port_t;
corenet_port(xmpp_server_port_t)
sysnet_dns_name_resolve(xmpp_server_t)
corenet_all_recvfrom_unlabeled(xmpp_server_t)

allow xmpp_server_t self:tcp_socket create_stream_socket_perms;
corenet_tcp_sendrecv_all_if(xmpp_server_t)
corenet_tcp_sendrecv_all_nodes(xmpp_server_t)
corenet_tcp_sendrecv_all_ports(xmpp_server_t)
corenet_tcp_bind_all_nodes(xmpp_server_t)
allow xmpp_server_t xmpp_server_port_t:tcp_socket name_bind;
allow xmpp_server_t xmpp_server_port_t:tcp_socket name_connect;

И потом, собственно сборка, подгрузка и прочее:

make -f /usr/share/selinux/devel/Makefile
/usr/sbin/semodule -i xmpp_server.pp
/sbin/restorecon -F -R -v /usr/lib64/erlang/erts-5.7.2/bin/beam.smp
/usr/sbin/semanage port -a -t xmpp_server_port_t -p tcp 5269

Если вам интересно прочитать побольше про SELinux то очень не плохо описано в у RedHat: SELinux User Guide и SELinux Managing Confined Services Guide

Write on: 22:34 | 5 comments | | tags: , , , | permalink |
Add post to:   Delicious Reddit Slashdot Digg Technorati Google


Add comment

Comments

archimag-dev 15.03.2010 11:24

Первый предлагаемый мной путь это «повесить» capabilities на erlang или скомпилированное приложение:

Плохой путь, после форка привелегии остаются только о “родительского” потока, так что не подходит для нормальных демонов ;)

Я делаю запуск от root, выставляю для форкнутого процесса привилегии через cap_set_proc и после этого переключаюсь на “правильного” пользователя.

reply
Kirill A. Korinskiy 15.03.2010 12:06

У тебя есть lisp, и он умеет такие финты ушами. В случае Erlang форкаться нельзя, как и менять пользователя.

reply
archimag-dev 15.03.2010 12:15

В случае Erlang форкаться нельзя, как и менять пользователя

А почему нельзя? Сам CL таких вещей как бы тоже не предусматривает, но есть FFI

reply
Kirill A. Korinskiy 15.03.2010 12:31

Идеологически в erlang это не нужно. Это имел ввиду я.

reply
anonymous 24.08.2010 2:01

а на более других операционках есть ipfw fwd, который истино бесплатный

reply

Comment form for «слушаем привелегированный порт»

Required. 30 chars of fewer.

Required.