답변

답변

내 서버의 일부 서비스를 강화하려고 합니다.

이를 위해 나는 systemctl 서비스 구성을 사용하고 있습니다. 특정 서비스에 대해 예를 들어 strace시스템 호출 허용 목록을 생성하기 위해 일반 작업에 사용되는 시스템 호출을 확인합니다. 이것은 내 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

strace를 사용하여 명령줄에서 실행하면 최소한 sendto및 시스템 호출이 사용되고 있다는 것을 알 수 있습니다. recvfrom그러나 SystemCallFilter( SystemCallFilter=)를 지우면 서비스가 여전히 로드되고 정상적으로 실행됩니다.

그러면 이 옵션이 실제로 고려됩니까(예를 들어 제가 철자법을 잘못 썼거나 모든 것을 비활성화하는 것이 올바른 구문이 아닐 수도 있음)? 아니면 이 옵션이 스스로 처리 openvpn하지 않고 시작되는 서비스에만 작동할까요 openvpn?

문제는 이 함수를 사용하고 싶지만 실제로 해야 할 일을 수행하는지 확인할 수 있는 방법이 없다는 것입니다. 나열된 시스템 호출만 허용합니다.

당신의 도움을 주셔서 감사합니다!

답변1

strace를 사용하여 명령줄에서 실행하면 최소한 sendto및 시스템 호출이 사용되고 있다는 것을 알 수 있습니다. recvfrom그러나 SystemCallFilter( SystemCallFilter=)를 지우면 서비스가 여전히 로드되고 정상적으로 실행됩니다.


CapabilityBoundingSet=CAP_NET_ADMIN
AmbientCapabilities=CAP_NET_ADMIN

답변

위의 질문 중 이 두 부분은 OpenVPN 서비스가 모든 필수 시스템 호출에 액세스할 수 있는 이유에 대한 답을 제공합니다.

첫째, SystemCallFilter=모든 시스템 호출을 차단하지 마십시오.맨페이지:

execve, exit, exit_group, getrlimit, rt_sigreturn, sigreturn시스템 호출과 시간 및 절전 쿼리에 대한 시스템 호출은 암시적으로 화이트리스트에 포함되어 있으므로 명시적으로 나열할 필요가 없습니다 .

둘째: 보면socket(7)매뉴얼 페이지에서 프로세스/파일로 설정하면 거의 모든 소켓 관련 시스템 호출( sendto및 포함 recvfrom)과 네트워크 인터페이스 작업 기능에 액세스할 수 있음을 알 수 있습니다.CAP_NET_ADMINcapabilities(7)맨페이지:

   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.

세 번째: , , , , , , , , 또는 옵션 에 의해 무시 NoNewPrivileges=됩니다 . 위의 맨페이지를 살펴보세요.SystemCallFilter=SystemCallArchitectures=RestrictAddressFamilies=RestrictNamespaces=PrivateDevices=ProtectKernelTunables=ProtectKernelModules=MemoryDenyWriteExecute=RestrictRealtime=LockPersonality=

문서를 보면 systemd경고로 가득 차 있다는 것을 알 수 있으므로 이러한 시스템 호출을 허용하지 않더라도 경고는 CAP_NET_ADMIN.

이를 사용하여 systemd-analyze syscall-filteropenvpn 서비스를 다시 확인할 수 있습니다.

관련 정보