Search Results for: mod_mruby

Apacheのシンボリックリンク検査に関するTOCTOU問題をmod_mrubyで解決してみた

共有ホスティングにおいて、各利用ユーザに対してシンボリックリンクの使用を許可していた場合に、他のユーザ領域のコンテンツを閲覧できたりする問題があるため、SymLinksIfOnwerMatchの設定によりリンクのownerとリンク先のファイルのownerが一致していない限りはリンクを辿らないようにする対処がされてきましたが、そもそもリンクの検査とファイル作成のタイミングによっては、検査をすり抜け、閲覧を可能にするTOCTOU問題がありました。

この件に関しては、「Apache HTTPD: `Options -FollowSymLinks` は不完全」に詳しく解説されているのでそちらを見て頂くとして、リンク使用は許可しつつもそのTOCTOU問題を解決するための一つの方法として、open()したコンテンツファイルのfdから情報を検査してownerに不一致があった場合はレスポンスを返さないようにする、というアプローチがあります。

実装として、Apache本体に手を入れたり、Apacheモジュールで対応したり、といくつか方法がありますが、今日はWebホスティングのセキュリテイとmod_mrubyの実装の復習がてら、単純な静的コンテンツへのリクエストにおけるこの問題をmod_mrubyで楽に解決できるようにしてみました。

具体的には、コンテンツがopen()されているアウトプットフィルターフェイズにおいてmod_mrubyで介入し、任意のuidと、open()されているコンテンツのuidが異なっていたらエラーを返す、という処理を書きました。

まずは、Apacheの設定を以下のようにして、

SetOutputFilter mruby
mrubyOutputFilter /path/to/solved_link_toctou.rb

/path/to/solved_link_toctou.rbを以下のようにします。

uid = 1000

f = Apache::Filter.new

if f.uid != uid
  f.error_create Apache::HTTP_SERVICE_UNAVAILABLE
end

このように実装することで、f.uidメソッドから既にopen()されたファイルのuid情報を取得できるので、TOCTOU問題を気にすることなくownerのチェックを行えます。上記の例の場合では、openしたコンテンツのuidが1000じゃなければ503エラーを返し、一致すれば何もせずにリクエストのあったコンテンツの内容をそのまま返します。後は幾つか細かい点があるのですが、それを書くと内容が広がりすぎるので一旦はこの程度の検査に留めておきます。

というわけで、mod_mrubyのリハビリがてら、SymLinksIfOnwerMatchTOCTOU問題をmod_mrubyで解決してみました。mod_mrubyだと非常に簡単に書けるので楽でした。

Docker HubとGitHubを連携させてmod_mruby実行環境をDockerで簡単にデプロイ

Docker Hub公開のアナウンスがあったので、早速Docker HubとGitHubを連携させてmod_mrubyの実行環境をDockerイメージとして作った上で、それをMac上のVagrantで動くCoreOS内のDocker環境にデプロイしてみました。

本エントリではmod_mrubyとしていますがここは重要ではなく、自身が開発しているGitHubのアプリケーションに置き換えて読んで頂けると、便利さが見えてくるかと思います。

試してみると、非常に簡単にDockerイメージを作成できた上に、迅速にmod_mrubyの軽量な実行環境をデプロイできたので、その流れを簡単に紹介したいと思います。

Read more »

mod_mrubyとngx_mrubyのv1.0.0をリリースしました+振り返りまとめ

先ほど、mod_mrubyngx_mrubyのそれぞれv1.0.0をリリースしました。

2012年の4月のmrubyのソースコード公開を機に開発をはじめ、今振り返ると色々な事がありながらも2年間続けて研究・開発を行い、ようやくここまで辿り着く事ができました。

mod_mrubyとngx_mrubyを実装していく中で、Matzさんをはじめmrubyに関わるすごいプログラマの皆さんと出会い、多くの事を教えていただきながらここまでやってくることができました。もし、彼らと出会うことがなければここまで続ける事はできなかっただろうと思います。

Read more »

最新(2013/12/26)のmod_mrubyとngx_mrubyのパフォーマンス

論文の執筆や発表の準備で最新のmrubyに追随できていなかったのですが、ようやくmod_mrubyngx_mrubyを最新版のmrubyに対応させました。対応した項目は以下となります。これでmrubyの最新版でも動くようになりました。

  • mrb_stateが持っていたirepテーブルの削除に対応(バイトコードのGC化)
  • symbol関連のAPI変更に対応
  • ARENAの持ち方を修正

パフォーマンス比較をするには良いタイミングなので、最新版のmod_mrubyngx_mrubyのパフォーマンスを計測しました。

Read more »

mod_mrubyとngx_mrubyにファイル単位でのキャッシュオプション追加

mod_mrubyngx_mrubyにRubyコードファイル単位でのキャッシュオプションを追加しました。

これまではRubyコードファイル単位でキャッシュ化する事はできていませんでしたが、これからはキャッシュ化したいファイルを選択する事ができます。キャッシュといっても、キャッシュ指定されたRubyコードファイルはサーバプロセス起動時にコンパイルまで行っておくという機能で、キャッシュ化するとサーバプロセス起動後はファイルの内容を変更しても反映されません。一方でキャッシュ化していないファイルは、リクエスト単位でコンパイルするのでファイルの変更がリクエスト単位で反映されます。

Read more »