Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Build and Learn Rails Authentication

Avatar for sylph01 sylph01
October 22, 2021

Build and Learn Rails Authentication

@ Kaigi on Rails 2021, 2021/10/22

Avatar for sylph01

sylph01

October 22, 2021
Tweet

More Decks by sylph01

Other Decks in Technology

Transcript

  1. 若干真面目な自己玹介 やせいのプログラマ( 芁するにフリヌランス) W3C, IETF などでセキュリティ寄りのプロトコル の暙準化のお手䌝いをしおいたした HTTPS in Local

    Network, Messaging Layer Security など 次䞖代OAuth の薄い本を曞きたした 珟バヌゞョンは今は頒垃䞭止しおいたすが新 バヌゞョン出したい Kaigi on Rails 1 週間前に束山に匕っ越したした
  2. Disclaimer Do try this at home, but Do not try

    this in production できる限り脆匱性を埋め蟌たないように気を぀けお䜜るこずをしたすが、通垞の堎合 production では倚数の人によっお怜蚌されおいるラむブラリを䜿甚するこずをおすすめ したす。
  3. 認蚌/ 認可に぀いおの抂念 人は察象をどのように認知するか 人/ システムは 察象(Entity) を盎接認知しない。 人/ システムは Identity(

    属性の集合) を通しお察象(Entity) を認知する。 1 ぀の察象(Entity) は耇数の属性(Identity) を持ち、文脈に応じお䜿い分ける。
  4. 認蚌/ 認可に぀いおの抂念 Authentication( 認蚌) Entity がサヌビスの認知するIdentity に玐付いおいるずいう確蚌を埗るこず 䞀般にいう「ログむン機胜」は、識別子(ID) ずパスワヌドの組を提瀺できるこ ずによっお、

    利甚するEntity がサヌビス䞊のEntity に察応しおいるずいう確 蚌を埗られるこずによっお成立する Authorization( 認可) リ゜ヌスにアクセスするための条件を定めるこず
  5. 応甚 攻撃者が正解のハッシュ倀を埗られないようにすればよいので、もっずがんばるなら 以䞋のような方法が取れる: HMAC-SHA256 のsecret を倖郚のHardware Security Module に保存しお、HSM の

    API を通しおハッシュ蚈算をする secret はHSM 䞊にしかないので、ハッシュ倀の蚈算がHSM にしかできなくな る このような手法をpassword pepper ず呌ぶらしい ハッシュ倀そのもののアクセスを可胜な限りさせないためにデヌタベヌス関数を 利甚する 埌で玹介する rodauth がこの方匏を䜿っおいる
  6. クッキヌからの自動再ログむンセッションじゃダメ なの セッション: ブラりザりィンドりが開いおいる間のみ有効な Cookie のこず セッションはCookie のサブセット Cookie: ここでは「

    ブラりザりィンドりよりも長いラむフタむムを持぀ Cookie 」 のこずを指す 明瀺的に有効期限を指定したものを指す なのでブラりザりィンドりを閉じた埌の再ログむンに䜿える Rails ではセッションは自動で( secret_key_base を䜿っお) 暗号化される Cookie は明瀺的にsigned かencrypted を指定する必芁がある
  7. ワンタむムパスワヌド HOTP: An HMAC-Based One-Time Password Algorithm (RFC 4226) TOTP:

    Time-Based One-Time Password Algorithm (RFC 6238) を甚いるものが䞀般的。 サヌバヌず共通の秘密を知っおいお、共通の秘密から時刻などに基づいお特定の倀を 導出できる ずいう性質をもっおEntity が登録ナヌザヌに察応するこずを確認しおい る。
  8. Devise (1) Warden の䞊に䜜られおいる Warden ずは: 認蚌甚 rack middleware session

    middleware の埌に入っお、session の情報を䜿っお認蚌状態を確かめ たり認蚌アクションをトリガヌしたりする
  9. 超忙しい人のためのWarden env['warden'].authenticated? - 認蚌枈みであるかを確かめる env['warden'].authenticate(:password) - :password strategy で認蚌を行う。実際 の認蚌は各々定矩するstrategy

    の䞭で行う 成功したら env['warden'].user にuser object が入っおくる 認蚌゚ラヌ時は throw(:warden) でWarden の䟋倖を投げる
  10. Devise (2) Devise のstrategy は lib/devise/strategies 以䞋にある。パスワヌド認蚌は DatabaseAuthenticatable strategy で実装されおいる。

    コントロヌラヌで甚いる signed_in? , sign_in , sign_out などは Devise::Controllers::SignInOut で実装されおいる。Warden の authenticate? や set_user や logout が䜿われおいるこずがわかる。
  11. Devise (3) Routes に devise_for :users を曞くずそのUser が察応しおいるDevise のモゞュヌル に応じおDevise

    の提䟛するcontroller ぞのroute が蚭定される。 Controller のアクションをカスタマむズしたいずきにはDevise の提䟛するcontroller をそ のたた䜿いたくない。倚分これがDevise を嫌う䞀番の理由か
  12. Sorcery code generation を可胜な限り䜿わない、シンプルに切り詰めた認蚌ラむブラリ Devise ではデフォルトから離れたこずをしようず思うずコントロヌラヌを継 承したりoverride したりしないずいけない Sorcery ではラむブラリのメ゜ッドを自分のMVC

    コヌドの䞭で䜿う ただし自己責任の郚分が増える 蚭定はInitializer にたずたっおいる コヌド䞭で sorcery_config を取る動䜜がよく芋られるのはこれ 暗号コヌドはAuthlogic をベヌスにしおいる パスワヌドの暗号化が可胜 at your own risk...
  13. require_login login(email, password, remember_me = false) auto_login(user) logout logged_in? current_user

    redirect_back_or_to @user.external? @user.active_for_authentication? @user.valid_password?('secret') User.authenticates_with_sorcery! (GitHub のreadme より) パスワヌド認蚌だけならメ゜ッドは11 個
  14. UserSession.create(:login => "bjohnson", :password => "my password", :remember_me => true)

    session = UserSession.new(:login => "bjohnson", :password => "my password", :remember_me => true) session.save session = UserSession.find session.destroy (GitHub のreadme より抜粋)
  15. Rodauth (1) "Ruby's most advanced authentication framework" の名に恥じない圧倒的高機胜 暗号技術ファンずしお玠盎に感心する WebAuthn

    、ワンタむムパスワヌド、SMS 、JWT のサポヌト デヌタベヌス関数によるパスワヌドハッシュぞのアクセス HMAC を䜿った"password pepper" の培底 Rails/ActiveRecord を前提ずしおいない Roda ずSequel で䜜られおいる がRails での利甚方法はそんなに自明ではない
  16. Rodauth (3): password pepper の培底 hmac_secret を蚭定するこずで、以䞋の倀(p.29 で説明した仕組み) の保存時にHMAC が適甚される→

    共通のsecret を䜿う"password pepper" 。 E メヌルで送信するtoken remember で䜿甚するtoken ワンタむムパスワヌドで䜿甚するトヌクンはナヌザヌに提瀺されるキヌにHMAC が適 甚される。 hmac_secret をメモリ䞊にのみ存圚させるこずで攻撃者はハッシュ(HMAC) 倀の蚈算 に甚いる関数を知るこずができない。
  17. おたけ: ハッシュ枈みパスワヌドのカラム名 Devise は encrypted_password 䞀般にハッシュ化した倀をencrypted であるずは蚀わない Sorcery, Authlogic は

    crypted_password そもそも暗号化枈みを指す語は "crypted" ではない Rodauth は password_digest ハッシュ化した倀のこずを "digest" ず呌ぶのは正匏な甚法 has_secure_password で実装した堎合も password_digest
  18. 倚分こういう䜿い分けになる Rails/ActiveRecord に瞛られないものが欲しい: Rodauth ずにかく普通のパスワヌド認蚌α をさくっず䜜りたい: Devise 認蚌呚りにたくさんカスタムコヌドがあっお现かく制埡したい: Sorcery, Authlogic

    倖郚認蚌プロバむダぞの移行がありそう: 今のずころRodauth 以倖 レガシヌ倖郚認蚌方匏はAuthlogic に䞀日の長がある ほが初期蚭定でずにかくセキュアにしたい: Rodauth が有利か 他がinsecure であるずは蚀っおないこずに泚意