CentOS Stream 9でPodman Composeをデプロイする:Dockerに代わるRootlessとSELinuxのソリューション

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

CentOS 8のEOLからPodmanへの移行まで

CentOS 8のサポートが突然終了(EOL)した際、私は5つの本番環境サーバークラスターをCentOS Stream 9に移行するために徹夜したことがあります。その過程で、Red HatのエコシステムにおいてDockerがもはや最優先事項ではないことに気づきました。代わりに、Podmanが深く統合され、デフォルトのツールとなっています。当初はdocker-composeがないことに戸惑いましたが、Podman ComposeとRootlessの仕組みをマスターした後は、システムが軽量化されるだけでなく、セキュリティも大幅に向上したと感じています。

実地比較:Docker Compose vs. Podman Compose

最大の相違点は動作アーキテクチャにあります。Dockerはroot権限で動作するデーモンに依存しています。もしハッカーがデーモンの制御権を奪えば、サーバー全体の制御権を握られてしまいます。対照的に, Podmanはデーモンレス(daemonless)モデルで動作します。各コンテナは単なる通常のユーザープロセスとして扱われます。

Podman Composeの主な利点:

  • Rootlessセキュリティ: sudoを使わずにアプリケーションスタック全体を実行できます。これにより、コンテナからの特権昇格のリスクを90%削減できます。
  • リソースの節約: デーモンを排除することで、ノードあたりの静的なRAM消費量を約50MB〜100MB削減できます。
  • SELinuxとの互換性: Podmanはセキュリティラベルを自動的に処理します。これはCentOSでDockerを使用する際の「悪夢」であった問題です。
  • SELinuxとの互換性: Podmanはセキュリティラベルを自動的に処理します。これは以前、CentOSでDockerを使用する際の「悪夢」であった問題です。

なぜCentOS Stream 9にはPodmanが最適なのか?

CentOS Stream 9では、SELinuxは常にEnforcingモードになっています。Dockerではボリュームをマウントする際にファイルアクセスが拒否されることが多く、ユーザーはSELinuxを無効化せざるを得ないことがありますが、これは非常に危険な行為です。Podmanはその逆です。Red Hatのセキュリティポリシーを理解し、それと調和して動作するように設計されています。保護層を無効にするのではなく、Podmanはそれを利用してアプリケーションをより適切に隔離します。

デプロイ手順の詳細

1. Podmanと補助ツールのインストール

まず、システムを更新し、PodmanとPython Pipをインストールします。CentOS Stream 9では、これらのパッケージは公式リポジトリで常に利用可能です:

sudo dnf update -y
sudo dnf install podman python3-pip -y

次に、最新バージョンを取得するためにpip経由でpodman-composeをインストールします:

pip3 install podman-compose --user

システムがコマンドを認識できるように環境変数を有効にします:

echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc

2. ユーザーのRootless権限の設定

root権限なしでコンテナを実行するには、ユーザーがシステム内で識別されるための専用のID範囲が必要です。次の設定ファイルを確認してください:

cat /etc/subuid
cat /etc/subgid

ファイルが空の場合は、次のコマンドを使用してユーザーにID範囲(通常は65536個のID)を割り当てます:

sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

3. ボリュームマウント時のSELinux問題の解決

これは最も一般的なエラーです。chmod 777を実行しても、コンテナが「Permission Denied」エラーを報告します。原因は、ホストディレクトリのSELinuxラベルがコンテナと一致していないことです。docker-compose.yamlファイルで、ボリュームパスの後に接尾辞:Zを追加するだけです。

安全なWebサーバー実行用の設定例

version: '3.8'
services:
  db:
    image: mariadb:10.6
    environment:
      MYSQL_ROOT_PASSWORD: strong_password_here
    volumes:
      - ./db_data:/var/lib/mysql:Z # :Z はラベルを container_file_t に変更するのに役立ちます

  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:Z
    depends_on:
      - db

4. アプリケーションの管理

使い慣れたコマンドでスタック全体を起動します:

podman-compose up -d

ユーザー権限で実行されているコンテナの状態を確認するには:

podman ps

低ポート(80, 443)の処理に関するヒント

Rootlessモードでは、1024未満のポートに直接バインドすることはできません。root権限で実行する代わりに、私は通常アプリケーションを高いポート(8080など)にバインドし、firewalldを使用してトラフィックをリダイレクトします。この方法は安全性を確保しつつ、厳しいセキュリティ基準を満たすのに役立ちます。

ポート80を8080に転送するコマンド:

sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload

DockerからPodmanへの移行は、最初は少し慣れが必要かもしれません。しかし、CentOS Stream 9にもたらされる安定性とセキュリティは、それだけの価値が十分にあります。設定がうまくいくことを願っています!

Share: