20080521-Ruby-on-Rails-Security
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

20080521-Ruby-on-Rails-Security

  • 3,886 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,886
On Slideshare
3,648
From Embeds
238
Number of Embeds
2

Actions

Shares
Downloads
30
Comments
0
Likes
2

Embeds 238

http://ruby-sapporo.org 190
http://blog.stco.info 48

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 2008-05-21(水); Apple Store Sapporo Ruby Sapporo Night vol.6 Rails 入門 セキュリティ Ruby on Rails Security 日本Rubyの会島田浩二 Ruby札幌 snoozer.05@ruby-sapporo.orgSHIMADA Koji; Nihon Ruby-no-kai; RubySapporo
  • 2. Tell The Topic of Ruby, RubySapporo! Ruby札幌、Rubyの話しろ!
  • 3. しまだこうじhttp://iddy.jp/profile/snoozer05✓ ふつうのフリーランス・プログラマ✓ 日本Rubyの会 ✓ Ruby札幌 運営 ✓ RubyKaigi スタッフ/実行委員✓ プログラミングの楽しさを共有したい✓ 自分の知らないコトやヒトに出会いたい
  • 4. どうぞ よろしくお願いします
  • 5. まとめ✓ Railsは標準でさまざまなセキュリ ティ対策をサポートしている✓ 重要なのはRailsによる対策のポイン トを理解すること✓ 用法・用量を守って正しくお使い下 さい
  • 6. 今日のゴール✓ Railsアプリがセキュアかどうかを 確認するための、いくつかの基本的な チェック項目について知る✓ それぞれのチェック項目を満たすため の作戦を知る
  • 7. チェックリスト
  • 8. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 9. 一つずつ
  • 10. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 11. チェック項目1見せなくてよい情報を 公開していないか
  • 12. 見せなくてよい情報を公開していないか
  • 13. 見せなくてよい情報を公開していないか
  • 14. 見せなくてよい情報を公開していないか
  • 15. 見せなくてよい情報を公開していないか
  • 16. 見せなくてよい情報を公開していないか 422ステータスのテンプレートが デフォルトで用意されているのは Rails2.0∼
  • 17. 何が起きるか✓ 攻撃者に攻撃方法を考えるヒントを 与えてしまう✓ フレームワークや固有のバージョン の脆弱性をつかれる可能性がある
  • 18. 対策✓ 攻撃のヒントになる可能性のある情報は、極力表に出さない✓ デフォルトのページなどをそのままにしない✓ アクセス制御をきちんと
  • 19. 対策config/routes.rbActionController::Routing:: Routes.draw do ¦map¦ … map.root :controller => "welcome" …end トップページが指定された場合の ルーティング先を定義
  • 20. 対策 各種デフォルトのテンプレートを きちんと差し替える
  • 21. 対策httpd.conf…<DirectoryMatch "^/.*/.svn/"> ErrorDocument 403 /404.html Order allow,deny Deny from all Satisfy All</DirectoryMatch>… Webサーバでファイルのアクセス に関する適切な設定を行う
  • 22. 見せなくてよい情報を 公開していないか✓ 攻撃のヒントになる可能性のある情報は、極力表に出さない✓ デフォルトのページなどをそのままにしない ✓ ステータスページ等✓ アクセス制御をきちんと ✓ サーバの設定などをきちんと確認
  • 23. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 24. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 25. チェック項目2重要なモデル属性を 保護できているか
  • 26. 重要なモデル属性を 保護できているかdb/migrate/00X_create_users.rb create_table :users do ¦t¦ t.string :login t.string :name t.string :password t.integer :admin, :default => 0 endapp/models/user.rb 制御に絡む属性 class Users < ActiveRecord::Base end
  • 27. 重要なモデル属性を 保護できているかdb/migrate/00X_create_users.rb create_table :users do ¦t¦ t.string :login t.string :name t.string :password t.integer :admin, :default => 0 endapp/models/user.rb 何のガードもしていない 制御に絡む属性 class Users < ActiveRecord::Base end
  • 28. 重要なモデル属性を 保護できているかhttp://example.com/users/new
  • 29. 重要なモデル属性を 保護できているかhttp://example.com/users/new
  • 30. 何が起きるか✓ 攻撃者の視点✓ このフォームを使って何か攻撃できないか✓ フィールドにありそうな属性でも追加 してみるか✓ ユーザ情報だったら管理者権限か✓ とりあえずadminあたりから
  • 31. 何が起きるかオリジナルのフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
  • 32. 何が起きるか改変されたフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> <input name="user[admin]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
  • 33. 何が起きるか改変されたフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> フォームを改変されて使用されると <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> 公開していない属性でも上書きされてしまう <input name="user[admin]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
  • 34. 対策✓ 制御に絡む属性はきちんと保護する✓ フォームからのリクエストで直で更新しない✓ ARが提供している仕組みを利用する ✓ attr_protected, attr_accesible
  • 35. 対策attr_protectedのサンプルclass Users < ActiveRecord::Base attr_protected :adminend 指定した属性は一括代入時には無視されるattr_accesibleのサンプルclass Users < ActiveRecord::Base attr_accesible :login, :name, :passwordend 指定した属性以外は一括代入時には無視される
  • 36. 重要なモデル属性を 保護できているか✓ 制御に絡む属性はきちんと保護する✓ フォームからのリクエストで直で更新しない✓ ARが提供している仕組みを利用する ✓ attr_protected, attr_accesible ✓ 開発当初はattr_protectedを使用し、開発 が進み制御に絡む属性が増えてきたら attr_accesibleへ切り替えるのが吉
  • 37. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 38. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 39. チェック項目3コントローラメソッドが公開されていないか
  • 40. コントローラメソッドが 公開されていないかapp/controllers/users_controller.rbclass UsersController < ApplicationController # 外部に公開しているアクション def activate mark_as_activate if valid_request end # 具体的にアクティベート化を行う処理 def mark_as_activate ... end publicメソッドとして定義してしまっているend
  • 41. 何が起きるか✓ 内部処理が外部からアクションとして 呼べてしまう✓ ブラウザ等から容易に実行できてしまう✓ 悪意がなくても踏んでしまう危険性が ある✓ 一度でも呼ばれると、システムの整合性 は保証できない
  • 42. 対策✓ コントローラメソッドのアクセス制 御をきちんと管理する✓ アクションではないメソッドはpublic にしない✓ アクセス制御の明示 ✓ private, protected
  • 43. 対策app/controllers/users_controller.rbclass UsersController < ApplicationController def activate mark_as_activate if valid_request end private def mark_as_activate ... endend
  • 44. コントローラメソッドが 公開されていないか✓ コントローラメソッドのアクセス制 御をきちんと管理する✓ アクションではないメソッドはpublic にしない✓ アクセス制御の明示 ✓ private, protected
  • 45. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 46. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 47. チェック項目4 出力ページの エスケープ処理に 漏れはないか
  • 48. 出力ページのエスケープ処理に 漏れはないかapp/views/users/show.erb.rhtml...<p> <b>Name:<b> <%= @user.name %></p>... hメソッドによる、特殊文字のHTMLエンティ ティとしてのエスケープ処理が漏れている
  • 49. 何が起きるか✓ クロスサイト・スクリプティング攻撃(XSS)✓ 攻撃者が埋め込んだ任意のスクリプトが 出力ページ内に挿入されてしまう✓ ページの訪問者のCookie情報が盗み取られ る等、致命的な被害を引き起こす入り口
  • 50. 対策✓ 出力ページのエスケープ処理について 漏れがないことを確認する✓ SafeERBプラグインを使用しエスケープ 漏れを検出✓ sanitizeメソッドを使用しホワイトリス ト形式で出力時にスクリプトを除去
  • 51. 対策✓ SafeERB✓ http://agilewebdevelopment.com/plugins/safe_erb✓ taint機構を使ってエスケープ漏れを チェック✓ エスケープ漏れがあると例外 ✓ SQLiteから取り出した値はtaintedではない ので例外が出ないので注意→確認する場合は PostgresやMySQLで
  • 52. 対策✓ sanitizeメソッド ✓ ホワイトリスト方式を使用し任意のタグ を除去app/views/users/show.erb.rhtml ... <p> <b>Name:<b> <%= sanitaize(@user.name) %> </p> ...
  • 53. 出力ページのエスケープ処理に 漏れはないか✓ 出力ページのエスケープ処理について 漏れがないことを確認する✓ SafeERBプラグインを使用しエスケープ 漏れを検出✓ sanitizeメソッドを使用しホワイトリス ト形式で出力時にスクリプトを除去
  • 54. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 55. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 56. チェック項目5 DBへ渡す入力の エスケープ処理に 漏れはないか
  • 57. DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb
  • 58. DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb ユーザ入力をそのままSQLへ変換してしまって いるためエスケープ処理が行われていない
  • 59. DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb ユーザ入力をそのままSQLへ変換してしまって いるためエスケープ処理が行われていない
  • 60. 何が起きるか✓ SQLインジェクション✓ サーバ上で実行されるSQLを攻撃者が 制御可能になってしまう✓ データベースを不正操作され致命的な被 害を引き起こす
  • 61. 対策✓ SQLの組み立てにはバインド変数を使 用しSQLのメタ文字をエスケープする✓ ?プレースホルダの使用して値を指定✓ 名前付きバインド変数のハッシュを使用
  • 62. 対策✓ プレースホルダの使用User.find(:first, :conditions => [ name = ? , params[:name]])User.find(:all, :conditions => [ category IN (?) ,[1, 2, 3]])
  • 63. 対策✓ 名前付きバインド変数の使用User.find(:first, :name => params[:name], :password => params[:password])User.find(:first, :conditions => [ name = :name , :name => params[:name]])
  • 64. DBへ渡す入力のエスケープ処理に漏れはないか✓ SQLの組み立てにはバインド変数を使 用しSQLのメタ文字をエスケープする✓ ?プレースホルダの使用して値を指定✓ 名前付きバインド変数のハッシュを使用
  • 65. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 66. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 67. チェック項目7 外部ページからの不正なリクエストをガードできているか
  • 68. 外部からの不正なリクエストを ガードできているかapp/views/blog/edit.rhtml<% form_for(@blog) do ¦f¦ %> ...<% end %>app/controllers/blogs_controller.rbclass BlogsController < ApplicationController ... def update ... リクエスト処理に対して end 何もガードをかけていない ...end
  • 69. 何が起きるか✓ クロスサイトリクエストフォージ(CSRF)✓ 攻撃者の誘導により、ユーザが外部ペー ジから攻撃者の用意したリクエストを 実行してしまう
  • 70. 対策✓ リクエストの有効性を検証する✓ Rails2.0からはデフォルトで対策の処理 が入っている✓ protect_from_forgery ✓ ApplicationControllerクラスで指定 ✓ Railsの生成するフォームと対で検証用 のトークンを持ち、それらを比較するこ とでリクエストの有効性を評価
  • 71. 対策✓ protect_from_forgeryの使用class ApplicationController < ActionController::Base protect_from_forgeryendclass BlogController < ApplicationController::Base protect_from_forgery :only => [:create,:update]end
  • 72. 外部からの不正なリクエストを ガードできているか✓ リクエストの有効性を検証する✓ Rails2.0からはデフォルトで対策の処理 が入っている✓ protect_from_forgery ✓ ApplicationControllerクラスで指定 ✓ Railsの生成するフォームと対で検証用 のトークンを持ち、それらを比較するこ とでリクエストの有効性を評価
  • 73. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 74. チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
  • 75. 今日のゴール✓ Railsアプリがセキュアかどうかを 確認するための、いくつかの基本的な チェック項目について知る✓ それぞれのチェック項目を満たすため の作戦を知る
  • 76. セキュリティについてもう少し知りたくなったら OSC2008-do Ruby/Rails セキュリティハンズオン(仮) 開催日:2008年6月28日(土)  場所:さっぽろ産業振興センター 参加費:無料
  • 77. セキュリティ以外について 知りたくなったら Railsレシピブック 高橋征義, 諸橋恭介(著) 発売日:2008年5月31日 出版社:ソフトバンククリエイティブ  価格:2940円(税込)
  • 78. まとめ✓ Railsは標準でさまざまなセキュリ ティ対策をサポートしている✓ 重要なのはRailsによる対策のポイン トを理解すること✓ 用法・用量を守って正しくお使い下 さい
  • 79. ご清聴 ありがとうございました