capsh 可以工作,但 systemd 不能 - Openvpn 非特权用户

capsh 可以工作,但 systemd 不能 - Openvpn 非特权用户

操作系统:Debian 11
软件包:OpenVPN 2.5.1

背景:

更新后,Openvpn-2.5客户端无法再使用ip路由删除 root 权限并且系统单元以非特权用户身份运行后,修改接口并配置 OpenVPN 服务器推送的路由。基于这两个线程中关于 iproute 问题的讨论:
https://bugs.archlinux.org/task/68480
https://phabricator.vyos.net/T3805

建议采取一种解决方法,从单独的 .service 文件中删除用户和组指令 ,/etc/openvpn/openvpn.conf并将环境功能添加 到单独的 .service 文件中。User=tunnelGroup=tunnel

已经有一个现有的 Openvpn 服务文件([电子邮件受保护]/lib/systemd/system因此我们创建了一个新目录并在其中包含一个 .service 文件 -/lib/systemd/system/[email protected]/override.conf

# separate service file containing User and group directives along with Ambient capabilities

[Service]

User=tunnel
Group=tunnel
SecureBits=keep-caps

ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0
ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
ExecStopPost=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0

AmbientCapabilities=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE

运行以下命令:

sudo systemctl daemon-reload
sudo chown -R tunnel:tunnel /etc/openvpn /run/openvpn
sudo /usr/sbin/openvpn --rmtun --dev tun0
sudo /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
cd /etc/openvpn/
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf

错误

预期非特权者User=tunnel将具有打开 tun0 并修改接口以完成 openvpn 连接的环境能力。然而,它遇到了错误。

#Error after running sudo -u tunnel openvpn /etc/openvpn/openvpn.conf

2022-06-24 17:32:08 us=174691 TUN/TAP device tun0 opened
2022-06-24 17:32:08 us=174755 do_ifconfig, ipv4=1, ipv6=0
2022-06-24 17:32:08 us=174844 net_iface_mtu_set: mtu 1500 for tun0
2022-06-24 17:32:08 us=175005 sitnl_send: rtnl: generic error (-1): Operation not permitted
2022-06-24 17:32:08 us=175084 Linux can't set mtu (1500) on tun0
2022-06-24 17:32:08 us=175142 Exiting due to fatal error

有效的解决方案

然而,使用 capsh,我直接将 Ambient Capability 赋予了具有特权的 Openvpn 可执行文件user=tunnel,而 systemd 服务中没有任何内容:

sudo /sbin/capsh --keep=1 --user='tunnel' --inh='cap_ipc_lock,cap_net_admin,cap_net_bind_service,cap_net_raw,cap_setgid,cap_setuid,cap_sys_chroot,cap_dac_override,cap_audit_write' --addamb='cap_ipc_lock,cap_net_admin,cap_net_bind_service,cap_net_raw,cap_setgid,cap_setuid,cap_sys_chroot,cap_dac_override,cap_audit_write' -- -c 'openvpn /etc/openvpn/openvpn.conf'

问题:

为什么 systemd 无法为 user=tunnel 设置环境功能,而 capsh 却可以?如何使其与 systemd 一起工作?

答案1

我怀疑sudo -u tunnel清除了环境能力。要确认这一点,您可以尝试在最后一行之前插入这些行:

/sbin/capsh --print
sudo -u tunnel /sbin/capsh --print
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf

相关内容