root以外のユーザーとしてopenvpnを実行する

root以外のユーザーとしてopenvpnを実行する

Podman権限のないコンテナでopenvpnサーバーを実行しようとしています。

OpenVPNはネットワークインターフェイスを管理できる必要があります(たとえば、トンインターフェイスの作成、IPアドレスの割り当て、起動など)。私のシステム(アーチLinux)では、私はこれが代わりにopenvpnを実行する独自のサービスを作成できることをopenvpn-server.service知っていました。CapabilityBoundingSetpodman run

まず、openvpnコンテナを作成しました。 Dockerfileは次のとおりです(便宜上、私はベースとしてarchlinuxを使用しました)。

FROM archlinux
RUN pacman -Sy --noconfirm openvpn

my_unprivileged_user次に、このコンテナをビルドします(次にログインします)。

podman build \
--force-rm \
--no-cache \
--rm \
--device=/dev/net/tun \
-t openvpn .

その後、次のようにしましたmy_custom_openvpn.service

Description=OpenVPN in Podman container
After=syslog.target network-online.target
Wants=network-online.target

[Service]
User=my_unprivileged_user
Group=my_unprivileged_group
WorkingDirectory=/etc/openvpn
ExecStart=/usr/bin/podman run --rm --name openvpn -v ./server:/server --device /dev/net/tun --network "host" --cap-add 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 localhost/openvpn:latest /usr/bin/openvpn --config /server/my_config.conf
ExecStop=/usr/bin/podman stop -t 0 openvpn
Capabilities=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
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
#ProtectSystem=true
#ProtectHome=true
RestartSec=5s
Restart=on-failure
TimeoutSec=5s

[Install]
WantedBy=multi-user.target

だから私はsystemdがpodmanに機能を渡し、再びopenvpnに機能を渡すと思います。

ただし、openvpnはtun0インターフェイスを作成できないと文句を言うことはできません。このようにtun0を直接作成しても、openvpn --mktun --dev tun0openvpnがこのtun0インターフェイスを設定できないという別のエラーが発生します。

setcapコンテナ内で行う必要があるかもしれないと考えて、podman execコンテナに入り、以下で実行しました。

setcap 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=+ep /usr/bin/openvpn

しかし、それは役に立ちませんでした。このエラーは引き続き発生します。

Tue Jan 28 13:34:31 2020 /usr/bin/ip link set dev tun0 up mtu 1500
RTNETLINK answers: Operation not permitted

このような機能を使ってみると役に立たないかもしれません。

答え1

ipコンテナ内で常に0を返すbashスクリプトに置き換えて、openvpnを機能させました。私の考えでは、openvpnがしようとしている唯一のことは、tun0IPアドレスを設定、割り当て、実行することです。私はコンテナの外で(ルートとして)これを手動で実行することにしたので、openvpnはこれを行う必要はありません。 openvpn Wikiのプロセスを説明します。ここ

関連情報