一連の記事の目次
rails、君に決めた!!~目次
セキュリティ
brakemanというgemがセキュリティチェックに有用
Digest認証
HTTP認証方式にはBasic認証とDigest認証がある。
どちらの認証方式も通信内容が暗号化されていないため、必ずSSL/TLSと併用しないとダメ
-
Basic認証
認証時のユーザー名とパスワードがほぼ平文で通信される -
Digest認証
Basic認証とほぼ同じだが、通信する時にユーザーIDとパスワードがハッシュ化されるため、Basic認証よりは安全 -
Digest認証の実装
require 'digest/md5'
class ApplicationController < ActionController::Base
# Digest認証の認証領域(realm)
REALM = 'SecretZone'.freeze
# ユーザー名 => (ユーザー名:Realm:パスワード)のMD5ハッシュ値
USERS = { 'user1' => Digest::MD5.hexdigest(['user1', REALM, 'passw0rd'].join(':'))}.freeze
before_action :authenticate
private
# Digest認証
def authenticate
authenticate_or_request_with_http_digest(REALM) do |username|
USERS[username]
end
end
end
ここで衝撃の一言
一般に公開するアプリケーション認証の仕組みとしては、ユーザーエクスペリエンスとセキュリティ上の観点からHTTP認証は避けるべき。代わりに、フォームとセッションを使ったフォーム認証方式がよく利用される。
まじか。。。じゃあ最初からフォーム認証やってよ
HTTP認証の問題点をもうちょっと具体的に知りたい!ってことで調べた
- ログアウト機能がないこと
- ログインせずに同じページのコンテンツを閲覧するという使い方(ゲストアクセス)ができないこと
- サーバ側からログイン状態を無効にする手段が存在しないこと
- ホストをまたがったシングルサインオンが実現できないこと
っていうのが理由っぽい。
SSL/TLSを強制する
HTTPSの仕組み
SSL:Secure Socket Layer TLS:Transport Layer Security
通信を暗号化する仕組み。
httpと組み合わせてhttpsにする。
現在ではSSLではなくTLSが主流。
-
盗聴防止(暗号化通信)
通信内容を傍受されても解読されないように暗号化してデータを送る -
改ざん防止
通信の途中で内容を書き換えられないようにする。メッセージダイジェストがなんちゃらってあるけどよくわからないな。ダイジェストも改ざんされたらハッシュ値の比較できないような気がするけどなー。要勉強。 -
なりすまし防止
webサーバーにSSLサーバー証明書を配置して起き、接続時に検証することでサイトのなりすましを防ぐ
RailsでHTTPアクセスの遮断
config/environments/production.rbに
Rails.application.configure do
config.force_ssl = true
end
CSRF対策
Cross Site Request Forgery
リクエスト強要
Railsではセキュリティトークンをフォームに埋め込んでおくことで、リクエスト時に検証を行える仕組みが採用されている
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
ただ、RailsでAPIサーバーを構築する時はアクセスを制限しなくていいので、protect_from_forgery with: :null_sessionとする必要がある
Secure Headersを使う
Twitterが公開しているgem
セキュリティ関係のResponse Headerをまとめて設定できる
セキュリティ関係のHTTP Response Headerなんてあるの??
色々あった!
HTTPレスポンスヘッダによるセキュリティ対策
httpsのページ内にhttpリンクが混在している時の検知や、XSS脆弱性の緩和が可能になる
XSS:Cross Site Scripting
導入
Gemfile
gem 'secure_headers'
を追記してbundle install
config/initializers/secure_headers.rbを作成し、
SecureHeaders::Configuration.default
もっと細かく設定もできるので、詳しくは公式ドキュメントを参照。