Railsのdeviseで簡単セキュリティ
情報セキュリティの3要素
機密性:アクセスを認められたものだけが、その情報にアクセスできる状態を確保すること
完全性:情報が破壊・改ざん・消去されていない状態を確保すること
可用性:必要なときはいつでもその情報にアクセスできる状態を確保すること
https://blog-ja.chatwork.com/2018/04/it.html
情報セキュリティが維持できず、何らかの損失が発生する可能性を「リスク」 リスクを現実化させる要因を「脅威」 脅威に対する弱みを「脆弱性」と言う。
http://www.intellilink.co.jp/security/services/consulting/07.html
システムへの攻撃手法
パスワードクラッキング
IDとパスワードによる認証を行う会員制Webサイトからユーザーのパスワードを抜き出そうとする攻撃
辞書攻撃 →パスワードによく使われる単語をまとめたファイル(辞書)を用意しておいて、それを使ってログインを次々に試してパスワードを当てていく攻撃
ブルートフォース攻撃 →パスワードに使われる文字の全組み合わせをしらみつぶしに試していく方法
パスワードクラッキングを防ぐ方法
①アカウントロック https://qiita.com/inodev/items/eeb26ea9408d4627bf0a
まず、deviseのマイグレーションファイルを調整する
## Lockable t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both t.datetime :locked_at # add_index :users, :unlock_token, unique: true
User(該当モデル)にdeviseの:lockableを追加。
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :lockable end
deviseの設定ファイルにロック内容を設定する。
config.lock_strategy = :failed_attempts # 一定回数ログインミスでロック config.unlock_strategy = :time # ロック解除条件は時間経過のみ config.maximum_attempts = 10 # 10回連続ミスでロック config.unlock_in = 1.hour # 1時間ロック継続 config.last_attempt_warning = false # あと1回ミスしてロックされる時に警告を出さない
②パスワードの強度を上げる
validate :password_complexity def password_complexity return if password.blank? || password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/ errors.add :password, "パスワードの強度が不足しています。パスワードの長さは8〜70文字とし、大文字と小文字と数字と特殊文字をそれぞれ1文字以上含める必要があります。" end
#
Dos攻撃
短時間にサーバーが処理しきれないような大量のアクセスを行うことで、サービス停止に陥らせる攻撃
SYN Flood攻撃 →TCPのやりとりにおけるSYNパケットだけを大量に送りつけて、サーバーを接続待ち状態にさせることで、別のユーザーからの新たな接続を確立できなくする攻撃
http://www.itmedia.co.jp/help/howto/security/j08/02.html
F5 →繰り返しアクセスし続けることで、リクエストへの反応ができないレベルまで、Webサーバーへの負荷を高める攻撃
セッションハイジャック
ログインしてから利用するようなWebシステムの場合、CookieやセッションIDを使って、アクセスしてきたユーザーがログイン済みかどうかを判断している。何らかの手段で第三者がCookieの中身やセッションIDをを取得されると容易に個人情報が取得されてしまう。これがセッションハイジャック。
Cookieの仕組み(https://www.slideshare.net/BurpSuiteJapanUserGr/burpsuitejapanhttp) ↓↓
セッションハイジャックを防ぐ方法
より安全な方法で、この問題を解決する方法は、セッションの有効期限をサーバー側に保存すること。 https://techracho.bpsinc.jp/hachi8833/2018_10_23/62858
ユーザー認証にdeviseを利用している場合 deviseに組み込まれている「Timeoutableモジュール」を有効にする。このモジュールは、ユーザーセッションが期限切れかどうかの検証を行う。これを利用するには、アプリでユーザーを表すモデルの中でこのモジュールを次のように有効にする必要があります
class User < ActiveRecord::Base devise :timeoutable end
次にdeviseイニシャライザのtimeout_inオプションに必要な値(デフォルトは30分)を設定
# ==> Configuration for :timeoutable # The time you want to timeout the user session without activity. # After this time the user will be asked for credentials again. # Default is 30 minutes. config.timeout_in = 30.minutes