回答

回答

我正在尝试强化服务器上​​的一些服务。

为此,我一直使用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=不阻止所有系统调用。联机帮助页:

请注意,execveexitexit_groupgetrlimitrt_sigreturnsigreturn系统调用以及查询时间和休眠的系统调用已隐式列入白名单,无需显式列出。

第二:如果你看一下socket(7)手册页中,您将看到如果设置为进程/文件,则几乎所有与套接字相关的系统调用(包括sendtorecvfrom)和网络接口操作功能都可以访问。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-filter仔细检查您的 openvpn 服务。

相关内容