Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
devise-two-factorを4.xから5.xに上げた話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kazuhiro NISHIYAMA
August 24, 2024
Technology
400
0
Share
devise-two-factorを4.xから5.xに上げた話
[大阪Ruby会議04](
https://regional.rubykaigi.org/osaka04/)のスポンサーLTの発表資料です
。
Kazuhiro NISHIYAMA
August 24, 2024
More Decks by Kazuhiro NISHIYAMA
See All by Kazuhiro NISHIYAMA
Rubyの配布パッケージの変遷
znz
0
5
Headscale + Tailscale に移行中
znz
0
54
Ruby on Rails と私
znz
0
68
riscv64.rubyci.org internal
znz
0
56
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
110
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
110
Ubuntuのriscv64版をqemuで動かした
znz
0
140
lilo.linux.or.jpをbusterからbullseyeに上げた
znz
0
140
小規模個人アプリをRails 7.xにバージョンアップした話
znz
0
130
Other Decks in Technology
See All in Technology
最新技術を"今は選ばない"という技術選定
leveragestech
PRO
0
200
そのSLO 99.9%、本当に必要ですか? 〜優先度付きSLOによる責任共有の設計思想〜 / Is that 99.9% SLO really necessary? Design philosophy of shared responsibility through prioritized SLOs
vtryo
0
810
なぜ、IAMロールのプリンシパルに*による部分マッチングが使えないのか? / 20260518-ssmjp-iam-role-principal
opelab
1
130
Gaussian Splattingの表現力を拡張する — 高周波再構成とインタラクションへのアプローチ —
gpuunite_official
0
190
オライリーイベント登壇資料「鉄リサイクル・産廃業界におけるAI技術実応用のカタチ」
takarasawa_
0
410
20260515 ⾃分のアカウントとプライバシーを守る認証と認可の話〜利⽤者向け〜
oidfj
0
710
Purview Endpoint DLP 動かしてみた
kozakigh
0
440
パーソルキャリア IT/テクノロジー職向け 会社紹介資料|Company Introduction Deck
techtekt
PRO
0
220
既存プロダクトQAから新規プロダクトQAへ
ryotakahashi
0
160
おいらのAWSアップデートの追い方〜Slack×AgentCore〜
yakumo
1
110
20260513_生成AIを専属DSに_AI分析結果の検品テクニック_ハンズオン_交通事故データ
doradora09
PRO
0
230
20260515 ID管理は会社を守る大切な砦!〜🔰情シス向け〜
oidfj
0
650
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Design in an AI World
tapps
1
210
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
390
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
150
Everyday Curiosity
cassininazir
0
210
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
500
How GitHub (no longer) Works
holman
316
150k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
30 Presentation Tips
portentint
PRO
1
290
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
70
39k
Transcript
devise-two-factor を4.xから5.xに上 げた話 Kazuhiro NISHIYAMA 株式会社Ruby開発 大阪Ruby会議04 2024-08-24
self.introduction 西山 和広 Ruby のコミッター github など: @znz 株式会社Ruby開発 www.ruby-dev.jp
devise-two-factor とは? devise を TOTP の2要素認証に対 応するのに使う gem ユーザごとに以下のデータを保存 暗号化された
OTP シークレット (認証アプリに登録するもの) 使用済み OTP を区別できる情報 OTP が有効かどうか
4.x から 5.x への変更 下2個はそのままでいいが OTP シークレットの保存方法が変更 (再掲載) ユーザーごとに以下の データを保存
暗号化された OTP シークレット 使用済み OTP を区別できる情報 OTP が有効かどうか
4.x から 5.x への変更 4 は attr_encrypted gem encrypted_otp_secret, encrypted_otp_secret_iv,
encrypted_otp_secret_salt に Base64 でそれぞれ保存 5 は Rails 7+ 標準の encrypted attribute 暗号化したものを Base64 して JSON で otp_secret 1カラムに保存
更新手順 4 から 5 は Rails 6 から Rails 7
と同時に上げる必要あり https://github.com/devise-two-factor/ devise-two-factor/blob/main/ UPGRADING.md に手順あり ほとんど gem は複数の Rails に 対応していて独立して更新可能 今回はそうなっていない
なぜか? (推測) attr_encrypted gem と Rails 7 で #encrypted_attributes メ
ソッドが衝突する Rails 7 対応の attr_encrypted に 更新すると二度手間だから一気に 移行する手順になっている?
問題点 実運用環境なら Rails 7 に上げた 後に Rails 6 に戻す可能性もある のでは?
Rails 7 でユーザーの認証アプリと otp_secret だけが更新 → このまま Rails 6 に戻すと encrypted_* が古くて認証失敗 UPGRADING.md には戻す手順はない → 独自対応が必要
具体的には UPGRADING.md に legacy_otp_secret の実装例 公式の手順途中の動作 読み込み 新カラムが設定されていれば → otp_secret
なければ旧カラムを読む → legacy_otp_secret 書き込み は新しい otp_secret のみ
独自に書き込み対応 新しい otp_secret 書き込み時に legacy_otp_secret の逆手順で encrypted_* に同期 → legacy_otp_secret
でデコードした 結果が otp_secret と一致するのを確認 して自動テストも追加
手動ダウングレードテスト 実際に戻してみてテスト → うま く動かないので、さらに調査 → attr_encrypted が salt に
prefix と して _ をつける encode_salt オプショ ンがデフォルトで true Base64.decode64 は _ を無視する ので legacy_otp_secret は動く → 同期時に _ を prepend して解決
まとめ 非互換のダウングレード対応は新 バージョンでの互換メソッドの自 動テストだけでは不十分 手動でダウングレード確認も必須 その他の対応も場合分けして用意 例: ダウングレード中に encrypted_* だ
けが更新されて otp_secret が古くなる → otp_secret を nil に戻すタスク
宣伝 福岡Rubyist会議04 https:// regional.rubykaigi.org/fukuoka04/ 2024.09.07 Sat. 9:30–18:00 主催: Fukuoka.rb /
株式会社Ruby開発