capshは機能しますがsystemdは機能しません - Openvpn権限を持たないユーザー

capshは機能しますがsystemdは機能しません - Openvpn権限を持たないユーザー

オペレーティングシステム:Debian 11
パッケージ:OpenVPN 2.5.1

背景:

アップデート後、Openvpn-2.5 クライアントは動作しなくなります。IPルーティングroot権限が削除され、システムデバイスが権限のないユーザーとして実行されたら、インターフェイスを変更してOpenVPNサーバーがプッシュするパスを設定します。次の 2 つのスレッドの iproute 問題に関する議論に基づいています。
https://bugs.archlinux.org/task/68480
https://phabricator.vyos.net/T3805

推奨される回避策は、別の.serviceファイルからユーザーおよびグループディレクティブを削除し、別/etc/openvpn/openvpn.confの.serviceファイルに環境機能を追加することです。User=tunnelGroup=tunnel

すでに既存のOpenVPNサービスファイル([Eメール保護])/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

効果的なソリューション

user=tunnelしかし、capshを使用して、systemdサービスには何もせず、特権のOpenvpn実行可能ファイルに直接Ambient Capabilityを付与しました。

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

関連情報