分享 Secret Tokens 很多人忽略的安全问题

tailang · 2013年05月10日 · 最后由 jasl 回复于 2013年05月10日 · 4928 次阅读

今天 clone 了@daqing老师的 rabel,准备学习,然后遇到了 Secret Tokens error,感谢@iBachue的帮助。然后我搜了一些 Secret Tokens 资料,发现这是安全问题(作为初学者,我不是非常明白),下面的资料希望对你有帮助:

每一个 Rails app 都会获取一个很长,而且是随机生成的 secret token,当使用 rails new 的时候,它会被生成并保存在 config/initializers/secret_token.rb。里面的内容类似这样: view sourceprint? 1 WebStore::Application.config.secret_token = '4f06a7a…72489780f'

因为 rails 自动创建 secret token,所以很多开发者会忽略掉它。但是这个 secret token 就像是你的应用的管理员钥匙。如果你拥有了 secret token,那样伪造会话和提升权限就会变得很容易。这是其中一个十分重要而且敏感的数据需要去保护的。加密是保护你的钥匙的最佳办法。

但是很不幸,rails 并不能很好的处理这些 secret token。secret_token.rb 文件会被加入到版本控制当中,复制到 GitHub,CI 服务器和每一个开发人员的电脑。

最佳实践:在不同的环境中使用不同 secret token。在应用中插入 ENV 变量就可以实现这个目的。另外一个替代方法是,在部署过程中把 secret token 作为符号链接。

修复:至少,rails 必须通过.gitignore 来忽略 config/initializers /secret_token.rb 文件。开发人员在部署的时候,用一个符号链接来替代生产环境的 token,或者把初始化器转变为使用 ENV 变量来初始化(例如 Heroku)

我将会进一步提出 rails 创建一个保存 serect token 的机制方案。我们有大量的库提供安装指引如何把 secret token 加入到初始化器中,但是这并不是一个好的实践。同时,至少还有俩个解决方案来处理这个问题:ENV 变量和初始化器的符号链接。

rails 提供一个简单的 API 给开发人员来管理 secret token,而且后台还是可插拔的(就像缓存和会话存储)。

@daqing老师使用了 figaro 做配置管理 gem 会自动读取 config/application.yml 里面的 设置
而 config/initializers/secret_token.rb 里面是设置成了 ENV['SECRET_TOKEN'] 这个所谓的安全问题是常识... 记得开源自己的作品时候 修改一下这个 token 就好了...

确实容易被忽略,我自己的项目要是开源的话,会自己创建一个私有的版本库,然后重新生成一个全新的 token...不过使用者不注意的话 倒是有可能产生安全问题,看来开源到 github 的时候要考虑这个问题...

#2 楼 @jasl 所以一般开源项目的时候 都是把这个选项故意写成错的 别人 clone 走的时候 运行就报错了 他就知道改了...

#3 楼 @zj0713001 其实我有个考虑是准备一个 initialize 的 rake task 来...

#4 楼 @jasl 你总不能给哪个安全问题都写一个 initialize rake task 来吧 那就太高端了😄

#5 楼 @zj0713001 既然是 initialize 就是把所有的配置都搞好啊,生成 token 啊,rename db.yml.sample 啊 之类的... secret_token.rb.sample 也是个好方法 呵呵

#6 楼 @jasl 我觉得 daqing 老师(大晚上的就不@ 打扰他了哈)的做法挺好的 都写成配置 然后发布的时候写上注释和清空 比较 cool

#7 楼 @zj0713001 对哦。。。settingslogic 也可以用在 initializer 的。。。不只是这个 secret_token,现在用 devise 的也很多,devise 的 salt 也是应该重新生成的

#8 楼 @jasl 看来你说的 rake 还是有必要加上的 良心 rake 啊 :thumbsup:

#9 楼 @zj0713001 哈哈。。。这事我得记小本上不能忘,话说我已经大量应用 rake 和 generator 了 https://github.com/jasl/a_rails_start_up_omakase/tree/master/lib/generators/conf/templates 可以大幅度减少部署的时间

需要 登录 后方可回复, 如果你还没有账号请 注册新账号