User= または --user を使用してルート化されていないコンテナをシステムサービスとして実行するベストプラクティス?

User= または --user を使用してルート化されていないコンテナをシステムサービスとして実行するベストプラクティス?

ルートレスコンテナを実行するためにPodmanをシステムサービスとして使用しようとしています。また、rootではなく権限でサービス自体を実行したいと思います。

a) システムサービスであるがUser=サービスユーザーとして設定されるか、 b) 長期実行サービスを許可するために以前に実行された
サービスユーザーのユーザーサービス ( ) に設定されます。systemd --userloginctl enable-linger <username>

アイデアは、本番環境での小規模デーモンとルートレスコンテナの配備への将来のアプローチを標準化することですが、すべてのトラップを知らないため、これらのアプローチのどれを選択するかを完全に確信できません。以下に背景についての議論があり、実際の問題は太字で示されています。

初期実験では、maptiler/tileserver-glローカルファイルシステムソースからマップタイルを提供するイメージを実行しています。

User=私が注目したことの1つは、オプションaを使用すると、ユニットファイル内に次のように指定されたユーザーに関する情報にアクセスできる組み込みメソッドがないようです。systemd.unit(5) の「指定子」;たとえば、%t/run%h/root)。これは、元のコンテナIDを含むファイルを作成(および削除)するためにinを使用して起動および停止するたびに、コンテナを便利に作成および削除するを使用して単位tileserver-glファイルを生成したためです。もちろん、私たちのサービスユーザーには書き込み権限がありません。単純にハードコーディングできるため(またはコンテナを実行する非再生方法を使用できるため)、これは問題ではありませんが、「アクティブ」の損失は恥ずかしいことです。podman generate systemd --new--new--cidfile=%t/%n.ctr-idExecStart=ExecStartPre=/run/run/user/<uuid>%tUser=システムサービスファイルからユーザーのUIDを取得し、ExecStart=私が見逃したコマンドに挿入する方法はありますか?

私が正しく理解した場合、他の回避策を取らない限り、両方のオプションは1024未満のTCPおよびUDPポートにバインドできないようです(これ私たちの場合はよさそうです)。最初は、サービスが権限を放棄する前にバインディングを実行できると考えていましたがUser=、そうでないようです。いくつかの研究によると、最も「システムネイティブ」方式はこれを達成するためにソケットデバイスを使用することですが、それを積極的にサポートするには実行中のサービスが必要なようです。どちらのオプションもソケットデバイスなしで子1024ポートに「デフォルト」にバインドすることはできません。

最終的に私はここでベストプラクティスを探しています。読んだソースによっては、--userログインセッション中に一時サービスを強調することもありますが、OTOHの存在はenable-linger長期実行セッションにさらに幅広く適用できることを示すようです。これら2つのオプションの重要な長所と短所は何だと思いますか?この「サービスユーザー」のケースでは、どのようなオプションが良いと思いますが、その理由は何ですか?

ベストアンサー1

User=systemdディレクティブを使用してsystemdシステムサービスでルートレスPodmanを実行することは現在サポートされていません。

バラより機能要件Podman GitHubプロジェクトから。

2023年11月21日に更新されました。

この機能はまだ正式にサポートされていないようですが、次のようにsystemdUser=testシステムType=notifyサービスを作成しましたDelegate=yes

[Unit]
Wants=network-online.target
After=network-online.target
[email protected]
[email protected]
RequiresMountsFor=/run/user/1000/containers

[Service]
User=test
Environment=PODMAN_SYSTEMD_UNIT=%n
KillMode=mixed
ExecStop=/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid
ExecStopPost=-/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid
Delegate=yes
Type=notify
NotifyAccess=all
SyslogIdentifier=%N
ExecStart=/usr/bin/podman run \
     --cidfile=/run/user/1000/%N.cid \
     --cgroups=split \
     --rm \
     --env "NGINX=3;" \
      -d \
     --replace \
     --name systemd-%N \
     --sdnotify=conmon \
     docker.io/library/nginx

私はQuadletによって生成されたサービスの外観にできるだけ近づけるように努力しました。

Webサーバーをテストします。うまくいくようです。

$ curl localhost:80 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

この例では、特権ポートでリッスンするためにソケットデバイスも使用しました。もっと https://unix.stackexchange.com/a/762009/9360

これを試してみたので、このソリューションがどれほどうまく機能しているかを把握する必要があります。

引用:

実施例3及び4は次の通りである。 https://github.com/eriksjolund/podman-nginx-socket-activation/

おすすめ記事