LoginSignup
17
22

More than 5 years have passed since last update.

devise-securityを使って、よりセキュアなRailsアプリを構築する

Last updated at Posted at 2018-08-24

TL;DR

Devise Securityを使うことで、過去に使用されたパスワードの制限や多重ログイン禁止などのエンタープライズ向けのセキュアな機能を提供できる。

はじめに

RailsでWebアプリを作成する際、Deviseを使って、ユーザ管理を行うことが多いと思います。
Deviseはかなり便利なgemですが、過去に使用されたパスワードの制限や多重ログイン禁止などのエンタープライズ用のセキュリティ要件までは取り扱っていません。
そこで今回はDeviseの使用を前提として、さらにDevise Securityを使用して、よりセキュアなRailsアプリを構築します。

Devise Securityについて

Devise Securityは、Deviseの拡張で、下に挙げるような機能を追加します。

ちなみに、開発が止まってしまったDevise Security Extensionから公式にforkされたもので、Rails 5にも対応するように保守されています。

追加できる機能

  • :password_expirable:設定された時間が過ぎるとパスワードが自動的に失効します。
  • :secure_validatable:Devise本家の:validatableよりも、さらに強いEmail、パスワード検証をします。(本家の検証がそもそもそこまで強くないのですが...)
  • :password_archivable:過去に使われたパスワードをold_passwordsテーブルに格納し、履歴確認をします。
  • :session_limitable:いちアカウントが一度に1つのセッションしか使えないことを保証します。(つまり、多重ログインの禁止です。)
  • :expirable:アクティブでない状態がXX日間続いたユーザアカウントを失効します。
  • :security_questionable:秘密の質問機能を可能にします。
    • captcha support:さらに追加的な機能として、sign_upsign_inrecoverunlockに対してcaptchaを導入することができます。
  • :paranoid_verification:ユーザがアプリを使うための識別コードを管理者が発行できます。

使い方

必要条件
  • Rails 4.1以上
  • Devise

インストール

まず、Gemfileにdevise-securityを追加して$ bundle installします。

Gemfile
gem 'devise-security'

Config設定

次にジェネレータを実行します。
$ rails generate devise_security:install

ジェネレータを実行すると、config/initializers/devise-security.rbに設定ファイルが作成されるので、それを適宜欲しい機能に応じて修正します。

Configuration
config/initializers/devise-security.rb
Devise.setup do |config|

  # パスワード有効期限(例. 3ヶ月)
  # config.expire_password_after = 3.months

  # パスワードは英文字(大文字・小文字)と数字、記号を最低1字ずつ含む
  # config.password_complexity = { digit: 1, lower: 1, symbol: 1, upper: 1 }

  # アーカイブする旧パスワードの数
  # config.password_archiving_count = 5

  # 古いパスワードを拒否する?(true, false, count)
  # config.deny_old_passwords = true

  # recoverフォームにcaptchaを導入する?
  # config.captcha_for_recover = true

  # sign upフォームにcaptchaを導入する?
  # config.captcha_for_sign_up = true

  # sign inフォームにcaptchaを導入する?
  # config.captcha_for_sign_in = true

  # unlockフォームにcaptchaを導入する?
  # config.captcha_for_unlock = true

  # recoverフォームに秘密の質問を導入する?
  # captcha_for_recoverが自動的にtrueになります。
  # config.security_question_for_recover = false

  # unlockフォームに秘密の質問を導入する?
  # captcha_for_unlockが自動的にtrueになります。
  # config.security_question_for_unlock = false

  # confirmationフォームに秘密の質問を導入する?
  # captcha_for_confirmationが自動的にtrueになります。
  # config.security_question_for_confirmation = false

  # ==> Configuration for :expirable
  # 最後のアクティブから失効になるまでの時間
  # config.expire_after = 90.days
end

DBスキーマの修正

各機能に応じてDBスキーマを修正します。
詳細はDevise SecurityのREADMEを見てください。

Session limitableの例

def change
    add_column :resources, :unique_session_id, :string, limit: 20
end

リソースに機能を付与

Deviseリソースに使う機能を付与します。

Session limitableの例

devise :database_authenticatable, ..., :session_limitable

これでDevise Securityの導入は完了です。

おわりに

既にDeviseを使っているプロジェクトでは、Devise Securityを使うことで容易にエンタープライズ向けのセキュアな機能を提供することができると思います。なかなか有用なgemですが、意外と知られていない気がしたので紹介してみました。

17
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
22