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

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

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.