Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker互換のセキュアなコンテナ実行環境「Podman」超入門

 Docker互換のセキュアなコンテナ実行環境「Podman」超入門

いまやWebアプリの開発やデプロイにおいて、コンテナは欠かせないものになってきました。 コンテナ実行環境にも色々ありますが、その中でも支配的なのがDockerでしょう。 ですがDockerは、その構造上いくつかの問題も抱えています。 今回はDockerと互換性を持ちながらも、よりセキュアに運用できるPodmanに入門します。

とことんDevOps

July 17, 2024
Tweet

More Decks by とことんDevOps

Other Decks in Technology

Transcript

  1. 発表者について • 水野 源 • VTJ 技術部所属 • Ubuntu JPメンバー

    • ubuntu.comメンバー • 著書に「Linuxをマスターしたい 人のための実践Ubuntu」など 2
  2. Dockerが抱える構造上の問題 • DockerはDockerデーモンに対し、クライアントがREST APIで通信す ることで操作する • → Dockerはrootが起動したデーモンとしてシステムに常駐する • DockerデーモンのエンドポイントはUnix

    Domain Socket • → このソケットにアクセスするにはroot権限が必要 • つまりDockerでコンテナを立てるには、ホストのroot権限が必要 • → これがセキュリティ的に問題 7
  3. dockerグループに所属すればよいのでは? • dockerグループに所属していると、sudoなしでDockerを使える • → sudoを使ってないから安心、ではない • これはroot権限を、パスワードなしで一般ユーザーに与えているのと同じ • sudoで実行したコマンドなら、最悪でもログが残る

    • dockerグループのメンバーがsudoなしで行ったコマンドは履歴に残らない • 攻撃用コンテナを起動して、後でコンテナを削除すると、痕跡すら残らない • やばい • sudoレスdockerは、より危険なだけなので非推奨 • 開発者がdockerコマンドを実行できるようにしないと開発できないけ ど、それは全員にホストのroot配ってるのと同じ • → そこでPodman 11
  4. Docker互換? • OCI(Open Container Initiative)という標準化団体がある • コンテナイメージのフォーマットや、実行方法も標準化されている • OCI標準に準拠しているのであれば、既存のイメージはすべて実行可能 •

    つまり実行環境自体は自由に交換可能 • そしてPodmanはその中でも、ツールとしてDockerの代替を目指している • DockerをそのままPodmanに置き換えても、何も問題はない • デメリットなしで、入れ替えるだけでよりセキュアになる 15
  5. ルートレスとは? • Podmanはsudoなしで動く • root権限で常駐するデーモンも不要 • → 結果としてセキュアに! • でもコンテナ内ではrootが動いているけど?

    • →ユーザー名前空間を使い、ホストのUIDをコンテナ内のUIDにマッピング • そのためコンテナ内ではrootだけど、ホストでは一般ユーザーに見える • Dockerにも最近ではルートレスモードが実装されたよね? • ただ色々事前準備がいる 18
  6. デーモンレスとは? • DockerはDockerデーモンに対しREST APIで通信して操作する • クライアントとサーバーにプロセス的な親子関係はない • コンテナはcontainerdの子プロセスとなり、dockerコマンドの子ではない • デーモンがいるため複雑化

    • デーモンが単一障害点になる • Podmanは単独のコマンドとしてfork/execモデルを採用 • コンテナはpodmanコマンドの子プロセスになる • めちゃシンプル • systemdがコンテナ内のプロセスを追跡可能になる 20
  7. Podの利用 • PodmanはPod Managerの略 • Podとは? • 複数のコンテナをまとめてひとつとして扱える単位 • 具体的にはcgroupとnamespaceを共有するコンテナグループ

    • 本来隔離されるそれぞれのコンテナを密結合させられる • k8sではPod単位でコンテナを起動する • Podmanはk8s同様のPodを動かせる • サイドカーコンテナのサポート 21
  8. Swarmは未実装 • Dockerと完全互換だと言ったな? あれは嘘だ • いや、嘘ではないんだけど、実は未実装の機能がある • DockerやPodmanは、単一ホスト上でコンテナを動かすことを想定 • クラスタリングのためには、別のツールが必要

    • DockerにはSwarmというツールが存在する • 対してPodmanは、クラスタリングはk8sに任せるという想定 • そのため意図的に未実装 • っていうかそもそもDockerユーザーでもSwarm使ってる人いる? 24
  9. systemd統合 • DockerはDockerデーモンがコンテナを管理するという発想 • systemdの介入をとにかく嫌う • Podmanは逆で、コンテナの自動起動などはsystemdに一任 • systemdのユニットファイルを自動生成する仕組みが実装されている •

    コンテナ内のプロセスがcgroup階層に配置され追跡可能に • デフォルトでjournaldによるログ管理 • コンテナログの永続化とローテーションが楽に • コンテナ内でsystemdを実行できる 26 $ podman generate systemd container > container.service
  10. まとめ • PodmanはDocker互換なので、単純に入れ替えて違和感なく使える • dockerコマンドをそのまpodmanコマンドに置き換えても動く • ただしswarm以外 • それでいてDockerよりセキュリティリスクが少ない •

    デーモンレスだけどサービスとして使うこともできる • Systemdのソケットアクティベーションを利用して、リモートからコマンド受け 付けたいみたいなこともできる • Docker一択だった人も、Podmanの利用を検討してみよう 27
  11. 参考文献 • Podman in Action • Red Hatから無料でダウンロードできるE-book • めっちゃいい本だけど、英語

    • 日本語訳が秀和システムから出てるので、おすすめ • https://www.shuwasystem.co.jp/book/9784798070209.html 28