Ubuntu14.xx安装Spectre/Meltdown补丁后Devise3.4.1 Recoverable令牌无效
嘿,我确实碰到过其他开发者在类似环境下遇到这个问题!
这个问题的核心根源确实是Ubuntu 14.xx的Spectre/Meltdown安全补丁对系统随机数生成机制的修改——Devise 3.4.1的Recoverable模块依赖Ruby的SecureRandom生成令牌,而补丁后内核随机源的变化导致令牌生成与验证环节出现了微妙的不匹配,和邮件投递方式(deliver_later/deliver_now)其实无关。
给你几个不需要大改现有稳定配置的可行方案:
回退特定内核补丁:Ubuntu 14.04的相关补丁中,影响随机数生成的是内核模块
random.c的更新。你可以通过dpkg --list | grep linux-image查看已安装的内核版本,尝试回退到补丁前的特定内核版本(比如linux-image-3.13.0-169-generic),保留其他安全补丁,只移除影响随机数的那个。强制Devise使用固定哈希生成令牌:在
config/initializers/devise.rb中添加以下配置,让Devise绕过系统随机源,改用SHA256哈希结合应用密钥生成令牌:Devise.token_generator = Devise::TokenGenerator.new(Digest::SHA256, Rails.application.secrets.secret_key_base)只要你的
secret_key_base是安全的,这个方式不会降低安全性,且完全不需要改动业务代码。小版本升级Devise:Devise 3.5.x修复了多个令牌生成的兼容性问题,且和3.4.x的API完全兼容,仅需升级gem版本(修改
Gemfile里的devise '3.4.1'为devise '~> 3.5.0'后执行bundle update devise),不会影响现有稳定配置。
另外,有开发者尝试调整/dev/random与/dev/urandom的优先级,但这个操作可能影响其他依赖随机数的服务,不建议在生产环境使用。
附上你提供的User模型代码供参考:
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable def send_devise_notification(notification, *args) devise_mailer.send(notification, self, *args).deliver_later end end
内容的提问来源于stack exchange,提问作者Pierre

