CentOS Stream 9でPodman:Dockerを「卒業」し、Rootlessコンテナでセキュリティを強化

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

なぜCentOS Stream 9においてDockerはもはや第一選択肢ではないのか?

CentOS Stream 9を使用している際、慣習的にDockerをインストールしているなら、それは自分自身を苦しめているかもしれません。以前からRed Hatは公式リポジトリからDockerを除外しています。その代わりに、RHELエコシステムと完全に互換性があり、最適化された代替ソリューションであるPodmanに注力しています。

Daemonベースのアーキテクチャは、Dockerの致命的な弱点です。入力するすべてのコマンドは、root権限で実行されているプロセス(docker daemon)の「許可」を得る必要があります。このデーモンがフリーズすると、すべてのコンテナが即座に停止してしまいます。さらに危険なのは、root権限での実行は、コンテナがエクスプロイトされた場合にハッカーが物理サーバーの制御権を奪取するきっかけを与えてしまうことです。

以前、CentOS 8サーバー群でDockerデーモンがフリーズし、肝を冷やした経験があります。結果として、クライアントのすべてのウェブサイトがダウンし、復旧に2時間近くかかりました。それ以来、私は完全にPodmanに移行しました。Podmanは**Daemonless**アーキテクチャと**Rootlessコンテナ**を実行できる機能により、この問題を根本的に解決します。sudoを使わずに、一般ユーザーでコンテナを実行できるのです。

CentOS Stream 9へのPodmanインストール

Podmanは「公式サポート」されているため、CentOSへのインストールは非常に簡単です。外部リポジトリの追加や複雑な設定は不要です。

# システムのアップデート
sudo dnf update -y

# podmanのインストール
sudo dnf install podman podman-docker -y

podman-dockerパッケージはシンボリックリンクを作成します。dockerコマンドを入力すると、実際にはシステムがpodmanを実行します。このテクニックにより、既存のスクリプトをコード修正なしでスムーズに動作させることができます。

以下のコマンドで結果を確認します:

podman --version

Rootlessコンテナの設定:真のセキュリティ層

これはPodmanの最も価値のある機能です。一般ユーザーがコンテナを実行できるようにするには、**subuid**と**subgid**を設定する必要があります。これは、コンテナ内部にマッピングするためのIDの範囲(通常は65,536個のID)を割り当てることだと理解してください。

ステップ1:ユーザーのID範囲を確認する

通常、CentOS Stream 9ではユーザー作成時にこれが自動的に設定されます。以下のコマンドで確認してください:

grep $USER /etc/subuid /etc/subgid

もし何も表示されない場合は、手動で追加してください(myuserを自分のユーザー名に置き換えてください):

sudo usermod --add-subuids 100000-165535 myuser
sudo usermod --add-subgids 100000-165535 myuser

ステップ2:コンテナをバックグラウンドで実行し続ける(Linger)

Rootless Podmanでは、SSHをログアウトするとコンテナが停止する場合があります。アプリケーションをサービスのように24時間365日稼働させるには、linger機能を有効にします:

sudo loginctl enable-linger $USER

最初のコンテナをデプロイする:実践テスト

sudoを使わずにNginxコンテナを実行してみましょう。Podmanのリソース消費がいかに少ないかがわかります(Dockerデーモンが数百MBを消費するのに対し、アイドル時は通常数MBのRAMしか消費しません)。

# レジストリからイメージをプルする
podman pull nginx:alpine

# ポート8080でコンテナを実行する
podman run -d --name my-web -p 8080:80 nginx:alpine

注意: セキュリティ上の理由から、Rootlessモードでは1024未満のポート(80や443など)をバインドすることはできません。そのため、上記の例では8080ポートを使用しています。

Systemdによるプロフェッショナルなコンテナ管理

PodmanはSystemdと非常によく連携します。動作が不安定な場合がある--restart alwaysフラグに頼る代わりに、PodmanはSystemdが直接管理できるユニットファイルを生成します。

my-webコンテナを、OS起動時に自動実行されるサービスに変換する方法:

# 設定ディレクトリを作成
mkdir -p ~/.config/systemd/user/
cd ~/.config/systemd/user/

# サービスファイルを生成
podman generate systemd --name my-web --files --new

# サービスを有効化
systemctl --user daemon-reload
systemctl --user enable --now container-my-web.service

これで、非常にプロフェッショナルな方法でステータスを確認できます:systemctl --user status container-my-web

Podmanを使い始めたばかりの際によくある「2つの古典的なミス」

実際の運用過程で、以下のような2つのミスに陥りやすいです:

  1. 書き込み権限(Permission Denied): Rootlessコンテナにボリュームをマウントすると、内部のユーザーがファイルの書き込みを拒否されることがよくあります。マウントコマンドに:Zフラグを追加して、PodmanにSELinuxの処理を任せましょう:-v /data:/app:Z
  2. イメージソースの問い合わせ: デフォルトでDocker Hubから取得するDockerとは異なり、Podmanはquay.ioかdocker.ioかを選択するよう求めてきます。/etc/containers/registries.confファイルでソースを固定しておけば、手動で選択する手間が省けます。

システムパフォーマンスの監視

コンテナがどれだけのCPUとRAMを「消費」しているかを確認するには、以下のコマンドを使用します:

podman stats

直感的なウェブインターフェースが好みの場合は、Cockpit用のモジュールをインストールしてください。コマンド一つで、洗練されたコンテナ管理ダッシュボードが手に入ります:

sudo dnf install cockpit-podman -y

https://your-ip:9090にアクセスすると、コンテナに関するすべての統計情報が明確に表示されます。CentOS Stream 9でPodmanに移行することは、単なるトレンドの追随ではありません。これは、インフラを保護し、長期的なコンテナ管理を簡素化するための不可欠なステップです。

Share: