Устанавливаем 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