Я пытаюсь собрать небольшой модуль selinux, чтобы углубить свое понимание selinux. Я определил небольшой демон-подобный тип приложения с собственным port_type. Следующий код является сокращенной версией, заменяющей мой собственный тип приложения на httpd_t:
module mymodule 1.0;
require {
type httpd_t;
attribute port_type;
class tcp_socket name_bind;
}
#============= my_port_t ==============
type my_port_t, port_type;
allow httpd_t my_port_t:tcp_socket name_bind;
Теперь я хотел бы поместить в модуль (или сгенерированный пакет) фактический номер(ы) порта для my_port_t. Цель - избежать явного вызова semanage, например, такого:
semanage port -a -t my_port_t -p tcp 9011
Я знаю, что semanage делает номер порта постоянным, но я бы предпочел иметь один файл, который обо всем позаботится. Таким образом, распространение модуля на многих системах будет намного проще.
Как я могу это сделать? Пока что я не нашел решения. Может, я неправильно подхожу к этому?
portcon
является директивой для этой цели, но, согласно статье Маркировка порта в загружаемом модуле политики, это невозможно вне базового модуля. Официальная документация порткона SELinux говорит то же самое («Политика модуля: нет»).
Однако это относится только к традиционным модулям .te
. SELinux теперь также поддерживает CIL (Common Intermediate Language), где поддерживается. Предположительно, вам необходимо использовать EL 7.3 или более позднюю версию или Fedora 23 или более позднюю версию.
Итак, в вашем случае само определение порта будет выглядеть так:
; Declare a my_port_t type
(type my_port_t)
; Assign the type to the object_r role
(roletype object_r my_port_t)
; Assign the right set of attributes to the port
(typeattributeset defined_port_type my_port_t)
(typeattributeset port_type my_port_t)
; Declare tcp:9011 as my_port_t
(portcon tcp 9011 (system_u object_r my_port_t ((s0) (s0))))
Это, однако, решает только проблему с определением типа порта. Согласно Fundamental SELinux Concepts, оставшаяся часть политики будет такой же простой, как:
; Allow httpd_t to bind to my_port_t
(allow httpd_t my_port_t (tcp_socket (name_bind)))
Если вы хотите просто добавить дополнительные порты к существующему типу порта, это намного проще:
(portcon tcp 922 (system_u object_r ssh_port_t ((s0)(s0))))
Вы можете сохраните этот файл как, скажем, foobar-ssh.cil
, затем вы можете установить и проверить результаты следующим образом:
# semodule -i foobar-ssh.cil
# semodule -l | grep foobar
foobar-ssh
# semanage port -l | grep ssh
ssh_port_t tcp 22, 922