ytooyamaのブログスマートフォン用の表示で見るytooyamaのブログサーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。「何が問題なのかわからない」という声があったので補足します。Dockerの-vオプションや仕組みを理解しているユーザーやDockerを構築した人自身が使っているだけであれば、気をつけるだけでいいと思っています。Dockerを複数人で使っているとか、Kubernetesクラスターのランタイム(CRI)としてこれらのエンジンを使った場合にも、今回取り上げたようなことをKubernetes上で実現できるので、オンプレやフルマネージドKubernetesを利用している人は気をつけないといけないでしょうという話です。どちらかというとこの問題ってrunCを使っているからなのかなと思っています。導入コンテナーとセキュリティーについて、現在調査をしています。Linuxにおけるセキュリティーというと、まず思い浮かべるのがSELinuxでしたが、他にも色々存在する事がわかりました。調べたら次のような情報を見つけました。石川さんがごめんなさいされていますね。blog.1q77.com一つ目の問題Dockerには-vオプションでDockerホストのディレクトリーパスをマウントする機能があります。手軽にコンテナーに対して永続データの置き場所を提供できるので便利である反面、注意して使わないとセキュリティー的にもインフラの継続性的にも問題があります。先のサイトにも書かれていましたが、次のようなコマンドを実行しても拒否されることなく結果が出力されてしまいます。コンテナーの/rootfsにマウントして、コンテナー内部からDockerホストのファイルを参照したり、書き換えるということを認証もなく実行できてしまう...という問題です。コンテナーはVMと違ってカーネルを共用していますし、コンテナーはrootユーザーで動いているからできる芸当ですね。DockerもしくはPodman、CRI-Oなどを使っていると、上記のような問題を制限できます。試しに同じコマンドをFedoraとPodmanで実行してみましょう。deniedと表示され、コマンドの実行を拒否されます。1.13.1までのバージョンのことです。Hatがメンテナンスをしていたバージョンです。CEではSELinuxによる保護は限定的です。Supportを有効にすることで保護が可能です。デフォルトは無効にされています。以下のように追記してdockerサービスを再起動してください。以降は有効になります。利用するには事前にcontainer-selinuxパッケージの導入が必要です。true}daemon.jsonはファイル名が示すように、jsonの形式で設定を記述していきます。jsonなれしている人なら大して苦労しないと思うのですが、初心者だったらここに設定を書いて設定を適用するだけでも苦労すると思います。カッコの綴じ方と複数設定を記述するときに最後の設定以外にはカンマがつくところとか、まだ設定が少ないうちはいいけど、daemon.jsonにいろいろな設定を記述していくつ複雑になってよくわからなくなるので、Podmanのほうが好きです。CEはCentOS8をサポートしていません。Dockerが使いたいのではなくてコンテナーが使いたいのであれば、Podmanをおすすめします。v2をサポートしていません。v2をオフにする必要があります。v2環境でも(もちろんv1環境でも)動作します。podman-dockerというパッケージを追加インストールすると、dockerコマンドを叩いてもよきにはからってpodmanに置き換えて実行してくれます。長くDockerに対して言われていた「dockerdみたいなデーモンがコンテナーが実行されているか否かに関わらず実行され続ける」問題もPodmanにはありません。やろうとしてもサービスは見つかりません)。一つの問題SELinuxを使うとある程度、コンテナーのセキュリティインシデントに対して防御できることがわかりましたが、今日はここで終わりではありません。SELinuxを有効にした状態でも防げない問題も存在します。modest_lalandeこれは何をやっているかというと、コンテナーでchrootしてコンテナーから抜けるというチャレンジをしてみました。これもとくに認証されずに実行できてしまいます。コマンドの3行目でコンテナーから抜けています。そのあと、ホスト上でdockerコマンドを実行してみました。抜けてきたコンテナーが実行されていることがわかります。ちなみに「exit」を実行するとコンテナーに戻る事が可能です。悪意のあるユーザーやソフトウェアが含まれたコンテナーにより、ホスト上でコード実行される危険性があるということです。これに対する対策が必要であることがわかりました。mode)という、Linuxカーネル上でアプリケーションのサンドボックスメカニズムを提供するためのセキュアコンピューティングの機能をサポートしています。次が公式のドキュメントです。docs.docker.comseccompは多くの他のコンテナーランタイムでもサポートしています。ある程度のSyscallはコンテナー内で実行された場合にブロックしてくれます。デフォルトの設定ではchrootは許可されているようです。Dockerのデフォルトの定義は先のドキュメントにも書かれていますがGitHubに公開されています。run実行時に--cap-add、--cap-dropを使って特定の機能を許可する、拒否することが可能です。dockerコマンドをpodmanに差し替えても同じ結果になります。permittedこれは次のようにjson定義ファイルを指定して実行することもできます。同様にchrootを拒否できました。dockerコマンドをpodmanに差し替えても同じ結果になります。permitted上記の実行例は660行目から673行目を取り除いたファイルを使っています。run実行のたびにseccompプロファイルを指定するのは大変ですからデフォルトの設定にしたいと思うかもしれません。Dockerの場合はdaemon.jsonに次のように記述すると対応可能です。その他の設定についてはリファレンスをご覧ください。"/root/custom-seccomp.json"}Podmanについてはデフォルトのseccompプロファイルが読み込まれた状態になっていますので、これを編集すると編集後に作成したコンテナーは保護されます。デフォルトのプロファイルがあります。Podmanの設定はいくつかあるので公式のガイドをご覧ください。rootlessの試みSELinuxとseccompを組み合わせて使えば、オペミスや問題のあるコンテナーイメージがあったとしても、一定の問題を回避できることがわかりました。LinuxのすべてのディストリビューションでSELinuxが使えるわけではありませんから、その場合は別の対策が必要になります。べつの観点からコンテナーのセキュリティーを観測してみると、roorlessというキーワードが見つかります。これはその名が示すとおり、rootユーザーを使わないでコンテナーと関連するサービスを実行するという試みです。8.1に含まれるPodmanは制限はあるものの、rootlessでの実行をサポートしています。Kubernetesもusernetesという、root権限を必要せずに動くKubernetesを使えるようにしようという試みが行われています。https://docs.docker.com/engine/security/rootless/https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/running-rootfull-or-rootless_building-running-and-managing-containershttps://github.com/rootless-containers/usernetes最後にSELinuxが有効な環境で正規な理由でホストパスをマウントしたい場合は次のように実行します。次の例はPodmanで実行した例ですが、同様にDockerでも可能です。パスの最後にzを付加しています。このパスには読み書きが可能です。/bin/bashここらへんについては次の情報を参考にしてください。8をちょっと触ってみたFacebookで共有されてきたので読んでみました。はてなブログProサーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。月別アーカイブこのブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。はてなブログをはじめよう!ytooyamaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。