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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

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

Avatar for とことんDevOps

とことん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