Slide 1

Slide 1 text

Docker互換のセキュアなコンテナ実行環境 「Podman」超入門 日本仮想化技術株式会社 水野 源 [email protected] 2024/07/17 1

Slide 2

Slide 2 text

発表者について • 水野 源 • VTJ 技術部所属 • Ubuntu JPメンバー • ubuntu.comメンバー • 著書に「Linuxをマスターしたい 人のための実践Ubuntu」など 2

Slide 3

Slide 3 text

本日のアジェンダ • Dockerとは • Dockerが抱える構造上の問題 • なぜPodmanなのか • Podmanの特徴 • Dockerとの違い 3

Slide 4

Slide 4 text

Dockerとは 4

Slide 5

Slide 5 text

Dockerとは • おそらく世界で一番普及しているコンテナ実行環境 • コンテナのメリットはいまさら言うまでもないけど • アプリケーション実行環境をカプセル化する隔離技術 • いまどきのアプリ開発事情との相性がとてもよい • DevOpsサイクルを円滑に回すためには必須と言ってよいほど • 開発者のPCから本番サーバーまで、幅広く利用されている 5

Slide 6

Slide 6 text

Dockerが抱える構造上の問題 6

Slide 7

Slide 7 text

Dockerが抱える構造上の問題 • DockerはDockerデーモンに対し、クライアントがREST APIで通信す ることで操作する • → Dockerはrootが起動したデーモンとしてシステムに常駐する • DockerデーモンのエンドポイントはUnix Domain Socket • → このソケットにアクセスするにはroot権限が必要 • つまりDockerでコンテナを立てるには、ホストのroot権限が必要 • → これがセキュリティ的に問題 7

Slide 8

Slide 8 text

どういうことか? • そもそもすべての操作をrootで行うのはよろしくない • → これは常識 • でもDockerはrootでの操作が前提 • root権限でコンテナが起動する • それのなにが問題か • コンテナ内からホストを攻撃することができる 8

Slide 9

Slide 9 text

具体的な方法 • 以下のコマンドで、ホストのルートディレクトリをマウントした特権コン テナを起動する • コンテナ内で/host以下のファイルを書き換える or 削除する • あ〜…… 9 $ sudo docker run -it --rm --privileged –v /:/host ubuntu

Slide 10

Slide 10 text

dockerグループに所属すればよいのでは? 10 ソケットの所有グループはdocker グループに書き込み権限がある!

Slide 11

Slide 11 text

dockerグループに所属すればよいのでは? • dockerグループに所属していると、sudoなしでDockerを使える • → sudoを使ってないから安心、ではない • これはroot権限を、パスワードなしで一般ユーザーに与えているのと同じ • sudoで実行したコマンドなら、最悪でもログが残る • dockerグループのメンバーがsudoなしで行ったコマンドは履歴に残らない • 攻撃用コンテナを起動して、後でコンテナを削除すると、痕跡すら残らない • やばい • sudoレスdockerは、より危険なだけなので非推奨 • 開発者がdockerコマンドを実行できるようにしないと開発できないけ ど、それは全員にホストのroot配ってるのと同じ • → そこでPodman 11

Slide 12

Slide 12 text

なぜPodmanなのか 12

Slide 13

Slide 13 text

なぜPodmanなのか • デメリットなしに、メリットだけ享受できるから • 結論としてはほんとこれだけ • → デメリットがないって本当? 13

Slide 14

Slide 14 text

そもそもPodmanとは • Red Hatが開発している、Docker互換のコンテナ実行環境 • 互換性を維持しつつ、Dockerが持つ構造的な問題点を克服 • Dockerよりもセキュアに使える 14

Slide 15

Slide 15 text

Docker互換? • OCI(Open Container Initiative)という標準化団体がある • コンテナイメージのフォーマットや、実行方法も標準化されている • OCI標準に準拠しているのであれば、既存のイメージはすべて実行可能 • つまり実行環境自体は自由に交換可能 • そしてPodmanはその中でも、ツールとしてDockerの代替を目指している • DockerをそのままPodmanに置き換えても、何も問題はない • デメリットなしで、入れ替えるだけでよりセキュアになる 15

Slide 16

Slide 16 text

Podmanの特徴 16

Slide 17

Slide 17 text

Podmanの特徴 • ルートレス • セキュアになる • デーモンレス • シンプルで便利になる • Podの利用 • k8s連携 17

Slide 18

Slide 18 text

ルートレスとは? • Podmanはsudoなしで動く • root権限で常駐するデーモンも不要 • → 結果としてセキュアに! • でもコンテナ内ではrootが動いているけど? • →ユーザー名前空間を使い、ホストのUIDをコンテナ内のUIDにマッピング • そのためコンテナ内ではrootだけど、ホストでは一般ユーザーに見える • Dockerにも最近ではルートレスモードが実装されたよね? • ただ色々事前準備がいる 18

Slide 19

Slide 19 text

ルートレスのデモ • コンテナを起動してrootユーザーのシェルを取る • なんかプロセスを起動する • ホストの別のターミナルからプロセスリストを見てみよう • 別ユーザーにsuして同じことをしてみよう • ホストのsubuidを見てみよう • Linuxでは非特権ユーザーは複数のUIDを持てない • ユーザー名前空間が必要 19

Slide 20

Slide 20 text

デーモンレスとは? • DockerはDockerデーモンに対しREST APIで通信して操作する • クライアントとサーバーにプロセス的な親子関係はない • コンテナはcontainerdの子プロセスとなり、dockerコマンドの子ではない • デーモンがいるため複雑化 • デーモンが単一障害点になる • Podmanは単独のコマンドとしてfork/execモデルを採用 • コンテナはpodmanコマンドの子プロセスになる • めちゃシンプル • systemdがコンテナ内のプロセスを追跡可能になる 20

Slide 21

Slide 21 text

Podの利用 • PodmanはPod Managerの略 • Podとは? • 複数のコンテナをまとめてひとつとして扱える単位 • 具体的にはcgroupとnamespaceを共有するコンテナグループ • 本来隔離されるそれぞれのコンテナを密結合させられる • k8sではPod単位でコンテナを起動する • Podmanはk8s同様のPodを動かせる • サイドカーコンテナのサポート 21

Slide 22

Slide 22 text

k8s連携 • 本番環境ではコンテナオーケストレーションが使われるのが基本 • いま支配的なのはやはりk8s • 開発者の手元にあるのがDockerだと、k8sとの差異が問題に • Podmanではk8sマニフェストからPodman上でPodを起動できる • 逆にPodmanのコンテナやPodからk8sマニフェストを生成することも 22

Slide 23

Slide 23 text

Dockerとの違い 23

Slide 24

Slide 24 text

Swarmは未実装 • Dockerと完全互換だと言ったな? あれは嘘だ • いや、嘘ではないんだけど、実は未実装の機能がある • DockerやPodmanは、単一ホスト上でコンテナを動かすことを想定 • クラスタリングのためには、別のツールが必要 • DockerにはSwarmというツールが存在する • 対してPodmanは、クラスタリングはk8sに任せるという想定 • そのため意図的に未実装 • っていうかそもそもDockerユーザーでもSwarm使ってる人いる? 24

Slide 25

Slide 25 text

レジストリの短縮名 • Dockerでは、レジストリはDockerHubを使うのが前提 • そのため短縮名は無条件にDockerHubを表す • Podmanではそれ以外のレジストリも使うのが前提 • そのためDockerと同じ感覚で短縮名を使うとエラーになる • 短縮名を使うための設定が別途ある 25 FROM nginx:latest FROM docker.io/library/nginx:latest Dockerの場合 Podmanの場合

Slide 26

Slide 26 text

systemd統合 • DockerはDockerデーモンがコンテナを管理するという発想 • systemdの介入をとにかく嫌う • Podmanは逆で、コンテナの自動起動などはsystemdに一任 • systemdのユニットファイルを自動生成する仕組みが実装されている • コンテナ内のプロセスがcgroup階層に配置され追跡可能に • デフォルトでjournaldによるログ管理 • コンテナログの永続化とローテーションが楽に • コンテナ内でsystemdを実行できる 26 $ podman generate systemd container > container.service

Slide 27

Slide 27 text

まとめ • PodmanはDocker互換なので、単純に入れ替えて違和感なく使える • dockerコマンドをそのまpodmanコマンドに置き換えても動く • ただしswarm以外 • それでいてDockerよりセキュリティリスクが少ない • デーモンレスだけどサービスとして使うこともできる • Systemdのソケットアクティベーションを利用して、リモートからコマンド受け 付けたいみたいなこともできる • Docker一択だった人も、Podmanの利用を検討してみよう 27

Slide 28

Slide 28 text

参考文献 • Podman in Action • Red Hatから無料でダウンロードできるE-book • めっちゃいい本だけど、英語 • 日本語訳が秀和システムから出てるので、おすすめ • https://www.shuwasystem.co.jp/book/9784798070209.html 28