среда, декабря 14, 2011

SELinux и OpenVPN на 5000 порту

Если по каким-либо причинам вам необходимо обеспечить работу OpenVPN на 5000 порту (использовался ранее в OpenVPN) при включенном SELinux, то прийдется вручную создавать модуль SELinux.
Допустим мы:
1. Установили OpenVPN, прописали port 5000 в /etc/openvpn/server.conf
2. Добавили правила в /etc/sysconfig/iptables
-A INPUT -m state --state new -m udp -p udp --dport 5000 -j ACCEPT
3. Добавили правило в SELinux
# semanage port -a -t openvpn_port_t -p udp 5000
/usr/sbin/semanage: Port upd/5000 already defined
4. При запуске OpenVPN
# service openvpn start
получили [FAILED]

в логе openvpn.log увидели
TCP/UDP: Socket bind failed on local address [undef]:5000: Permission denied

в /var/log/audit/audit.log наблюдаем строчку
type=AVC msg=audit(xxxxx): avc:denied { name_bind } for pid=xxx comm="openvpn" src=5000 scontext=unconfined_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:commplex_port_t:s0 tclass=udp_socket

Что делаем? Модуль правил для SELinux.
1. Копируем выше обозначенную строчку из audit.log в файл OPENVPN5000.audit
2.
# cat OPENVPN5000.audit | audit2allow -m audit > OPENVPN5000.te
# cat OPENVPN5000.te
module audit 1.0;

require {
type openvpn_t;
type commplex_port_t;
class udp_socket name_bind;
}

#=========== openvpn_t ==============
allow openvpn_t commplex_port_t:udp_socket name-bind;

3. Проверяем и собираем модуль

# checkmodule -M -m -o OPENVPN5000.mod OPENVPN5000.te
4.  Упаковываем модуль
# semodule_package -o OPENVPN5000.pp -m OPENVPN5000.mod
5.  Загружаем упакованный модуль
# semodule -i OPENVPN5000.pp

Вот теперь можно успешно перезапусить OpenVPN на 5000 порту
# service openvpn restart


Комментариев нет:

Мой список блогов