SystemCallFilter aparentemente não foi levado em consideração

1

Estou tentando proteger alguns serviços em meus servidores.

Para este propósito, tenho usado a configuração do serviço systemctl. Para um determinado serviço, executo a instância strace para determinar as chamadas do sistema usadas em operações normais para criar uma lista de desbloqueio de chamadas do sistema. Aqui está minha configuração openvpn.service:

[Unit]
Description=a given service I want to restrict systemcalls
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8) service

[Service]
Type=notify
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
KillMode=process
RestartSec=5s
Restart=on-failure
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/vpn.conf
ProtectHome=yes
User=openvpn
Group=openvpn
SystemCallFilter=
CapabilityBoundingSet=CAP_NET_ADMIN
AmbientCapabilities=CAP_NET_ADMIN
ProtectSystem=strict
PrivateTmp=yes
#PrivateDevices=yes
RestrictNamespaces=yes
RestrictAddressFamilies=AF_INET
NoNewPrivileges=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
MemoryDenyWriteExecute=yes
[Install]
WantedBy=multi-user.target

Ao executá-lo na linha de comando com strace, sei que, por exemplo, pelo menos sendto e recvfrom systemcalls estão sendo usados. No entanto, quando eu esvaziar o SystemCallFilter ( SystemCallFilter= ), o serviço ainda pode ser carregado e executado normalmente.

Então essa opção está sendo realmente levada em conta (e talvez eu tenha cometido um erro de digitação, por exemplo, essa não é a sintaxe correta para proibir tudo)? Ou talvez essa opção só seja aplicada ao serviço que lança openvpn e não openvpn em si?

O fato é que eu gostaria de usar esse recurso, mas não sei como verificar se ele realmente faz o que é necessário: permitir apenas chamadas de sistema listadas.

Obrigado pela sua ajuda!

    
por philippe 02.08.2018 / 15:02

1 resposta

1

By running it on command line with strace, I know that for instance at least sendto and recvfrom systemcalls are being used. However, when I empty the SystemCallFilter (SystemCallFilter=), the service still can be loaded and runs as usual.

CapabilityBoundingSet=CAP_NET_ADMIN
AmbientCapabilities=CAP_NET_ADMIN

Resposta

Esses dois trechos de sua pergunta (acima) meio que respondem por que seu serviço OpenVPN está tendo acesso a todos os syscalls necessários.

Primeiro: SystemCallFilter= não bloqueia todos os syscalls. Manpage :

Note that the execve, exit, exit_group, getrlimit, rt_sigreturn, sigreturn system calls and the system calls for querying time and sleeping are implicitly whitelisted and do not need to be listed explicitly.

Segundo: Se você der uma olhada na socket(7) página de manual, você Veja que praticamente todos os syscalls relacionados a soquetes (incluindo sendto e recvfrom ) e os recursos de manipulação de interface de rede podem ser acessados se CAP_NET_ADMIN estiver definido como um processo / arquivo. capabilities(7) página de manual:

   CAP_NET_ADMIN
          Perform various network-related operations:
          * interface configuration;
          * administration of IP firewall, masquerading, and accounting;
          * modify routing tables;
          * bind to any address for transparent proxying;
          * set type-of-service (TOS)
          * clear driver statistics;
          * set promiscuous mode;
          * enabling multicasting;
          * use setsockopt(2) to set the following socket options:
            SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the
            range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE.

Terceiro: NoNewPrivileges= será ignorado por SystemCallFilter= , SystemCallArchitectures= , RestrictAddressFamilies= , RestrictNamespaces= , PrivateDevices= , ProtectKernelTunables= , ProtectKernelModules= , MemoryDenyWriteExecute= , RestrictRealtime= ou% opçõesLockPersonality=. Dê uma olhada na manpage acima.

Se você der uma olhada na documentação, você verá que systemd está cheio de advertências, então, meu palpite é que, mesmo que você não esteja permitindo essas syscalls, elas são parte de CAP_NET_ADMIN .

Você pode usar systemd-analyze syscall-filter para verificar seu serviço openvpn.

    
por 02.08.2018 / 16:27