「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。ServerのDockerイメージを作成・公開しました。Docker環境のある方は、以下のコマンドで簡単にHTTP/2を喋るWebサーバTrusterdを動かす事ができます。Docker.というように、HTTP/2によるコンテンツGETができると思います。Trusterdの設定を弄りたい人は、GitHubのTrusterdレポジトリをcloneしてきてtrusterd/docker/conf/trusterd.conf.rbのファイルに設定を書き、さらにコンテンツを追加する場合は、trusterd/docker/htdocs/以下にファイルを放りこんで、それぞれ以下のようなコマンドでDockerビルドし直してください。views転職エントリが多数見られる8月ですが、これは残念ながら転職エントリではありません。前々からずっとやりたいと思っていたのですが、子供が生まれたりと色々バタバタしていて、まとまった時間がどうしても取れず実現できていなかった「Linuxの旅」に、ついに明日から行って参ります!もちろん目的は、技術・研究に対するモチベーションを高める事です!「Linuxの旅?なにそれ」と思った方も多いでしょう。Linuxの旅といっても、持ち物は必要最低限でノートパソコンすら持って行きません。必要最低限の着替えと青春18切符を握りしめ、大阪からJRをひたすら乗り継いで札幌まで5、6日間かけて向かいます。え?Linuxの旅なのにノートパソコン無いなんて大丈夫?と思われた皆さん、大丈夫です。Linuxの旅の持ち物は、以下となります。1冊LINUXプログラミングインタフェース!!!!???そうです、LINUXプログラミングインタフェースを片手(両手)に、ひたすら電車の中で読み続ける青春18切符の旅こそが、僕が勝手に決めた「Linuxの旅」なのです。函館〜札幌らへんという、超曖昧で前後しまくりの予定を立てていますが、まぁLINUXプログラミングインターフェイスを読み尽くすことはないだろうと予想しているので、これぐらいのふわっとした予定で良いと思っています。結局道中はiPhoneを触って1日が終わりそうな日もありそうです。4分の1ぐらいは読みたいですねぇ。views共有Webホスティングを提供している業者の皆様は、シンボリックリンクのTOCTOU問題というかなりクリティカルで必ず対応すべき問題をおそらく様々な方法によって解決されていると思います。一方で、TOCTOU問題をなんとなく放置されている、あるいは、誤解されている場合もあるかもしれません。この問題は、Apacheでシンボリックリンクを使えない(シンボリックリンクにアクセスがあったら4系エラーを返す)設定にしていたとしても、シンボリックリンクファイルを作る事さえできれば、攻撃プログラムを使う事により、apache権限でアクセス可能なファイルにシンボリックリンク経由でアクセスすることが可能となります。Apache本体のコアに直接パッチを当てて対応されている方も多いでしょう。その場合、コアのパッチは今後Apacheのバージョンアップに伴いメンテが面倒になる幾つか公開されているモジュールは設定の変更箇所が多いので困っているTOCTOU問題をあまりよくわかってないという状況があると思います。そこで、あまり既存の共有ホスト、例えばVirtualHostの設定等を変える事なく簡単な設定を追記するのみで共有WebホスティングのTOCTOU問題を解決するApacheモジュールmod_fileownercheckを作りました。追記1:SetOutputFilterの設定をしなくて良いようにしたインストールは簡単で、apxsでビルドした後いつも通りモジュールをLoadModuleするだけで良いです。モジュールをロードするだけで、シンボリックリンクのTOCTOU問題を解決できます。ホスティング業者によっては、共有ホスティングの構成が様々でこのモジュールだけでは対応出来ない場合もあると思います。一度攻撃プログラムを用いて試した上で利用するのが良いと思います。Directoryのパーミッションのような定番の共有ホスティングの場合は、大抵このモジュールだけで解決できると思います。仕組み的には単純で、リクエストのあったファイルがApacheによってopenされた時点で、そのopenされたファイルのownerとリクエストのあったファイルパスのownerが一致するかをチェックするものです。filterに追加するようにしました。リクエストパスの途中に他のユーザのディレクトリを指すシンボリックリンクが含まれている場合も対応するために、suEXECで設定しているownerとopenしているファイルのownerチェックも行うようにしました。Apacheのバーチャルホスト等で構築した共有Webホスティングを提供しながら、このTOCTOU問題の対応をされていなかったり、コアに手を入れていたりする場合は是非このmod_fileownercheckをご活用下さい。問題がありそうでしたらレポジトリにissueやpull-requestをして頂けると幸いです。bench(abコマンド)のパラメータ設定や、ベンチマーク結果のテストをRubyで書けるベンチマークツールです。今回はそのab-mrubyコマンドのDockerイメージを作りました。僕みたいにabコマンドを毎日のように使うエンジニアにとっては、ab-mrubyはそれなりに有用だと思っていたのですが、mrubyをビルドしたりaprを使ってabをビルドしたりいまいち使いにくいなぁと思っていました。それがDockerの登場によって面倒な所はほとんどラッパーできるようになり、ab-mrubyのDockerイメージを作る事によって必要な部分だけを弄ってすぐにab-mrubyを使えるようにしました。自身のクライアントPCにDockerを入れるのは気軽にできると思うので是非一度遊んでみてください。ab-mrubyについてご存じない方は以下のエントリを御覧ください。abコマンドのベンチマークパターンを書けるab-mrubyを作ったHTTPのベンチマークパターンとテストを動的に書けるab-mrubyを作ったab-mrubyを使って自分のサイトを継続的にテストしてみた最新のab-mrubyはGitHubにて公開しています。簡単な使い方ab-mrubyに関しては、上記のエントリに書いているので、今回は簡単な使い方の説明のみにします。Hubからpullして下さい。matsumotory/ab-mrubyそして、実際に実行してみましょう。runコマンドに加えて最後の引数にURLを指定してやるだけでab-mrubyを試すことができます。[false]すると、予めRubyで記述したベンチマークパラメータとテストケースによって実行されたベンチマークとテストの結果が得られます。おおおお、RequestPerSecondがテストケースの値より低く出ているのでテストが失敗していますねー、とかがわかります。Rubyでベンチマークパラメータやテストを書いて自分専用のDockerイメージを作るab-mrubyのDockerイメージはab-mruby/docker/ディレクトリ以下のRubyで書かれたベンチマークパラメータとテストケースのサンプルを元に実行されています。http://blog.matsumoto-r.jp/ab-mruby.conf.rbにベンチマークパラメータを、ab-mruby.test.rbにテストケースを書くと、自分なりのベンチマークパラメータやテストケースを反映した自分専用のDockerイメージを作成する事ができます。Hubと連携してベンチマークイメージを作るのも良いと思います。書き方は、abコマンドのベンチマークパターンを書けるab-mrubyを作ったHTTPのベンチマークパターンとテストを動的に書けるab-mrubyを作ったab-mrubyを使って自分のサイトを継続的にテストしてみた上記に上げたab-mrubyに関するエントリやab-mrubyのGitHubレポジトリを参考にして下さい。views共有ホスティングにおいて、各利用ユーザに対してシンボリックリンクの使用を許可していた場合に、他のユーザ領域のコンテンツを閲覧できたりする問題があるため、SymLinksIfOnwerMatchの設定によりリンクのownerとリンク先のファイルのownerが一致していない限りはリンクを辿らないようにする対処がされてきましたが、そもそもリンクの検査とファイル作成のタイミングによっては、検査をすり抜け、閲覧を可能にするTOCTOU問題がありました。不完全」に詳しく解説されているのでそちらを見て頂くとして、リンク使用は許可しつつもそのTOCTOU問題を解決するための一つの方法として、open()したコンテンツファイルのfdから情報を検査してownerに不一致があった場合はレスポンスを返さないようにする、というアプローチがあります。実装として、Apache本体に手を入れたり、Apacheモジュールで対応したり、といくつか方法がありますが、今日はWebホスティングのセキュリテイとmod_mrubyの実装の復習がてら、単純な静的コンテンツへのリクエストにおけるこの問題をmod_mrubyで楽に解決できるようにしてみました。具体的には、コンテンツがopen()されているアウトプットフィルターフェイズにおいてmod_mrubyで介入し、任意のuidと、open()されているコンテンツのuidが異なっていたらエラーを返す、という処理を書きました。/path/to/solved_link_toctou.rb/path/to/solved_link_toctou.rbを以下のようにします。Apache::HTTP_SERVICE_UNAVAILABLEendこのように実装することで、f.uidメソッドから既にopen()されたファイルのuid情報を取得できるので、TOCTOU問題を気にすることなくownerのチェックを行えます。上記の例の場合では、openしたコンテンツのuidが1000じゃなければ503エラーを返し、一致すれば何もせずにリクエストのあったコンテンツの内容をそのまま返します。後は幾つか細かい点があるのですが、それを書くと内容が広がりすぎるので一旦はこの程度の検査に留めておきます。いうわけで、mod_mrubyのリハビリがてら、SymLinksIfOnwerMatchとTOCTOU問題をmod_mrubyで解決してみました。mod_mrubyだと非常に簡単に書けるので楽でした。