特権ポートマッピングを備えたルートレスPodmanコンテナ

特権ポートマッピングを備えたルートレスPodmanコンテナ

マッピングされた特権ポートを使用してルートレスPodmanコンテナを起動する方法はありますか(コンテナサービスはホストのポート1023以下を介して公開されます)。

走る

$ podman run --rm -it  -p 80:80 nginx:stable-alpine 
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

当然、権限が不足して失敗します。

$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip  -- -c 'podman run --rm -it  -p 80:80 nginx:stable-alpine'

rootユーザーとしてPodmanを実行する

$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip --user=$USER -- -c 'podman run --rm -it  -p 80:80 nginx:stable-alpine'
Unable to set group list for user: Operation not permitted

権限のため失敗しましたsu

これまで、私はすべてのプロセスが数秒間特権ポートをバインドできるように一時的に許可する次善策ソリューションを見つけました。

sudo sysctl net.ipv4.ip_unprivileged_port_start=80 ;\
( sleep 5 ; sudo sysctl net.ipv4.ip_unprivileged_port_start=1024 ) &\
podman run --rm -it  -p 80:80 nginx:stable-alpine 

ベストアンサー1

systemd サービスの Rootless Podman は、User=次のコマンドを使用して nginx コンテナを起動できます。ソケットの有効化特権ポートを使用してください。

  1. ユーザーの作成テストまだ存在しない場合。
    $ sudo useradd test
    
  2. ユーザーのUIDの確認テスト
    $ id -u test
    1000
    
  3. ファイルの作成/etc/systemd/system/example3.service内容がある
    [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
    
    (ファイルをシステムに合わせて調整するには、1000手順2で見つけたUIDに置き換えます)
  4. セキュリティを強化するためのオプションの手順:ファイルの編集/etc/systemd/system/example3.serviceコマンド--network noneにオプションを追加します。podman run詳しくはセクションをご覧ください。コンテナのネットワーキング可能性の制限
  5. ファイルの作成/etc/systemd/system/example3.socket内容がある
    [Unit]
    Description=Example 3 socket
    
    [Socket]
    ListenStream=0.0.0.0:80
    
    [Install]
    WantedBy=sockets.target
    
  6. システム構成の再ロード
    $ sudo systemctl daemon-reload
    
  7. ソケットの起動
    $ sudo systemctl start example3.socket
    
  8. Webサーバーのテスト
    $ curl localhost:80 | head -4
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    

この例で使用されている方法を使用するには、コンテナイメージがサポートする必要があります。ソケットの有効化。例えばdocker.io/library/mariadbそしてdocker.io/library/nginxサポートするソケットの有効化しかし、他の多くのコンテナイメージはサポートされていません。ソケットの有効化

上記のステップは、私が書いたデモから得たものです。 https://github.com/eriksjolund/podman-nginx-socket-activation/tree/main/examples/example3

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

一つあるPodman 機能リクエストUser=systemdシステムサービスのPodmanサポートを追加するために使用されます。この機能リクエストはGitHubディスカッションに移行されました。

おすすめ記事