Устанавливаем DNSCrypt на CentOS, создаем модуль политики SELinux и настраиваем запуск под учетной записью обычного пользователя


Базовая настройка


устанавливаем репозиторий EPEL

yum install epel-release

устанавливаем пакет dnscrypt-proxy

yum install dnscrypt-proxy

создаем пользователя для запуска службы

useradd -M dnscrypt-proxy

создаем папку конфигурации

mkdir /etc/dnscrypt-proxy

копируем в папку конфигурации файл со списком DNS-серверов

cp /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv /etc/dnscrypt-proxy/resolvers.csv

настраиваем права доступа к папке конфигурации и ее содержимому

chown -R dnscrypt-proxy:dnscrypt-proxy /etc/dnscrypt-proxy
chmod 700 /etc/dnscrypt-proxy
chmod 600 /etc/dnscrypt-proxy/*

создаем unit-файл /usr/lib/systemd/system/dnscrypt-proxy.service

[Unit]
Description=DNSCrypt Proxy
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/dnscrypt-proxy --local-address=0.0.0.0:5353 --resolvers-list=/etc/dnscrypt-proxy/resolvers.csv --resolver-name=cisco
User=dnscrypt-proxy
Group=dnscrypt-proxy

[Install]
WantedBy=multi-user.target

обновляем информацию о службах

systemctl daemon-reload

замечание: запустить службу можно уже на данном этапе, однако, она будет выполняться в домене unconfined_service_t, т.е. практически без каких-либо ограничений


Настройка SELinux


устанавливаем необходимые для работы с SELinux пакеты

yum install setools policycoreutils-devel

создаем файл принудительного ограничения по типу /root/dnscrypt-proxy/dnscrypt-proxy.te

policy_module(dnscrypt-proxy, 1.0.0)

########################################
#
# Declarations
#

type dnscrypt-proxy_t;
type dnscrypt-proxy_exec_t;
init_daemon_domain(dnscrypt-proxy_t, dnscrypt-proxy_exec_t)

type dnscrypt-proxy_etc_t;
files_config_file(dnscrypt-proxy_etc_t)

type dnscrypt-proxy_port_t;
corenet_port(dnscrypt-proxy_port_t)

########################################
#
# dnscrypt-proxy local policy
#

allow dnscrypt-proxy_t dnscrypt-proxy_etc_t:file { getattr open read };
allow dnscrypt-proxy_t dnscrypt-proxy_etc_t:dir { search };
allow dnscrypt-proxy_t dnscrypt-proxy_port_t:udp_socket { name_bind };
allow dnscrypt-proxy_t dnscrypt-proxy_port_t:tcp_socket { name_bind };
allow dnscrypt-proxy_t self:capability { dac_override ipc_lock net_bind_service };
allow dnscrypt-proxy_t self:capability2 { block_suspend };
allow dnscrypt-proxy_t self:udp_socket { bind create ioctl setopt };
allow dnscrypt-proxy_t self:tcp_socket { bind create ioctl listen setopt accept };

corenet_udp_bind_all_nodes(dnscrypt-proxy_t)
corenet_tcp_bind_all_nodes(dnscrypt-proxy_t)
corenet_tcp_connect_http_port(dnscrypt-proxy_t)

sysnet_dns_name_resolve(dnscrypt-proxy_t)
logging_send_syslog_msg(dnscrypt-proxy_t)

создаем файл контекстов /root/dnscrypt-proxy/dnscrypt-proxy.fc

/usr/sbin/dnscrypt-proxy        --      gen_context(system_u:object_r:dnscrypt-proxy_exec_t,s0)
/etc/dnscrypt-proxy(/.*)?               gen_context(system_u:object_r:dnscrypt-proxy_etc_t,s0)

выполняем компиляцию модуля политики SELinux

cd /root/dnscrypt-proxy
make -f /usr/share/selinux/devel/Makefile

устанавливаем модуль

semodule -i /root/dnscrypt-proxy/dnscrypt-proxy.pp

восстанавливаем контекст исполняемого файла и папки конфигурации

restorecon /usr/sbin/dnscrypt-proxy
restorecon -r /etc/dnscrypt-proxy

устанавливаем контекст порта

semanage port -a -t dnscrypt-proxy_port_t -p udp 5353
semanage port -a -t dnscrypt-proxy_port_t -p tcp 5353

запускаем службу

systemctl start dnscrypt-proxy

замечание 1: основная идея построения модуля состоит в том, что он не должен содержать явных определений сторонних типов и правил доступа к ним, а все необходимые разрешения должны предоставляться посредством соответствующих макросов. Например, чтобы разрешить домену dnscrypt-proxy_t управление PID-файлами с типом dnscrypt-proxy_var_run_t необходимо использовать макросы files_pid_file(dnscrypt-proxy_var_run_t) и files_pid_filetrans(dnscrypt-proxy_t, dnscrypt-proxy_var_run_t, file)

замечание 2: Список доступных в политике "targeted" макросов можно посмотреть в файле /usr/share/selinux/devel/policy.xml (отформатировать содержимое можно с помощью утилиты xmllint)

замечание 3: дополнительную информацию о создании модулей можно найти по следующим ссылкам:
https://selinuxproject.org/page/NewUsers
https://danwalsh.livejournal.com/14442.html
https://github.com/fishilico/selinux-refpolicy-contrib/blob/master/samba.te
https://github.com/fishilico/selinux-refpolicy-contrib/blob/master/samba.fc
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/SELinux_Guide/rhlcommon-section-0037.html

Добавить комментарий