写在前面

OWASP TOP 10 在去年下半年发布了新版,本文将结合新版 TOP 10 的内容,整理一份 Rails 安全实践,供开发者朋友们参考。

本文适合有一定 Rails 开发经验,期望了解应用安全和 OWASP TOP 10 的开发者朋友,每篇阅读时间10-15分钟。

OWASP TOP 10 简介 

随着互联网 Web 网站的出现和传播,越来越多的 Web 安全问题引起人们的注意,2001年,一些安全专业人士创办了开放式 Web 应用程序安全项目,期望帮助人们了解和改进 Web 网站和服务。这就是Open Web Application Security Project,简称 OWASP。

在2003年,第一份 OWASP TOP 10 发布,这份列表公布了常见的 Web 应用十大安全风险,通过对列表内容的学习,可以帮助开发人员和管理人员提高安全意识。

此后,OWASP 组织每隔3、4年会更新一份列表,这份列表逐渐成为项目开发的安全准则。

值得一提的是,这份列表代表了 Web 安全的最低要求,是安全底线。这也是官方不断强调的。

目前,包括2021版本,目前一共发布了七个版本,我们从历代版本内容,来看下其变化。

历史变化总览

从这张图可以看出,在初始的版本中,TOP 10更强调的是具体的安全威胁,而随着后续版本的推进,尤其是在最新的2021版本,从最初关注威胁表象,转到了关注威胁产生的本因。

2017 vs 2021

接下来,我们从 2021 版本的内容,来整理下框架的各种安全事项。

A01:2021-失效的访问控制 Broken Access Control

从2017年的第五位上升到第一位。

概念

失效访问控制漏洞是指 Web 应用设计中的一个缺陷,导致对敏感对象(例如目录或记录)的未授权访问处理不当或不充分。例如,任何匿名用户都可以通过了解请求的 URL 来轻松查看网站上的某些文件;或者,在没有首先验证情况是否属实的情形下,应用可能执行一个假定已经进行某种级别的身份验证或授权的功能。

Rails方案

对于 Rails 项目,我们经常采用权限校验的 gem,如 rolify、pundit,或者早先的 cancancan,来处理诸如角色设定,权限校验等功能,这些 gem 与 devise 结合的很好,也可以很好的扩展模块。

在这方面,Rails 框架给我们开发者带来了与生俱来的安全优势。

加固建议

有几点内容还是需要注意的。

一,采用最小化权限。在更改一些用户权限时,或者在原 gem 的基础上进行更改时,做好充分的权限测试,避免更改权限、注销用户时产生权限遗漏错误。

二、控制授权用户 session 失效时间,避免高权限用户长时间不失效,导致的权限泄露。

二、限制异常跳转,不要权限校验失败,异常一抛了之,避免产生SSRF。

三、按照RESTful的原则设计访问权限,这是Rails自带的,不要破坏它。

举个例子,在我们设计前后端分离的项目时,前端为了方便,用户名访问状态地址获取当前用户登录状态,这会导致很严重的信息泄露。应该将已登录/未登录,已授权/未授权分别对待。


A02:2021-加密机制失效 Cryptographic Failures

从2017年的第三位上升到第二位。

概念

在2017版本之前,它的名称为“敏感数据泄露”,2021版本中调整为加密机制相关故障,或者缺乏加密机制。

Rails 实现

说到加密,Rails 框架的考虑是非常充分的。从早先的日志屏蔽字段(比如密码),再有 credentials.yml.enc,再到 7 版本中,采用数据库级别的加密,可以说  Rails 的数据保护是非常到位的。

7的数据库加密具体可见这个链接。

https://guides.rubyonrails.org/active_record_encryption.html

加固建议

只要不去忽视、破坏它,Rails的加密机制是非常合理的,当然,还有几点可以加强,或者根据个人选择进行设置。注意,我们应该加强它而不是削弱它。

一、更改默认 salt,这在前面的《Rails 加密和解密》中有讲到。

二、key 区分环境使用,开发、测试和产品环境 key 分开,千万别图方便。key不要加到代码仓库。

三、虽然经常在 nginx 上做SSL证书,但是启用 force_ssl 也是可以考虑的。

四、保管好秘钥。


A03:2021-注入Injection

绝大多数,学渗透的第一课就是学注入,而它也从2010年到2021年一直排在第一位,别看它如今在第三位,但是注入依旧是应用安全里可见的最大威胁。

概念

注入攻击的范围广泛,如果对用户输入的内容校验不足时,就极易产生注入攻击,通过表单提交是最常见的一种注入工具手段。有些注入攻击的有效载荷,可以执行系统命令,规避身份校验,注入恶意代码,提升权限。

Rails 实现

Rails 从诞生之日起,就对 SQL 注入攻击做了充分的防范,ActiveRecord可以让使用者放心使用。

加固建议

一、在使用开源项目时,我们要做好代码审计工作,多用 brakeman 检查漏洞。

二、除了SQL注入,还有诸如NoSQL,ORM、LDAP、表达式等等注入,也要多加留意。

三、各种论坛都在说安全左移,咱们代码开发者先从代码 review 做起。

四、检查下你的白名单吧,有些人认为 waf 能拦住大多数 sql 注入,但是如果运维同学做了加白处理,事情就变得“呵呵”了。


A04:2021-不安全设计 Insecure Design

这是一个新的条目,包含了40个 CWE,是一个包含广泛的类别,一时难以具体概括其包含的具体威胁,但它的出现反映出2021版本更加关注软件设计和体系架构设计中的漏洞风险。

概念

安全左移的话题越来越多的被讨论,这就需要我们更多的去使用威胁模型,安全设计模式。此处不做更多的讨论,但是它排在第四位,可见未来 owasp 会更多的介绍 samm,而微软的 SDL 也经常被各种文章提到。

Rails 实现

我认为,Rails已经足够安全了,不是么?不要去破坏它。如果你有选择,请选择 Rails 搭建你的项目吧。

加固建议

除了增加对研发团队的培训,在软件发布周期上,还应该考虑其他的安全角色参与其中,在之前的实践中,SRE 部门可以来承担安全验证的职责。

或者,“让运维去做吧。”

“研发部只管开发代码!!!”


A05:2021-安全配置错误 Security Misconfiguration

从2017版本的第六位升到第五位,这种错误经常发生在 Rails 框架之外,因为 Rails 有自己约定俗成的配置目录和方式,且和 public 目录分开。

概念

通常,面向用户的文档错误或遗留,导致控制缺陷或者步骤缺失。另外,绝大多数应用都依赖第三方软件,如 nginx,mysql 等。这些软件的配置管理不当也会导致我们的应用受到威胁。

Rails 实现

Rails 自身有严格的配置管理,即便是第三方 gem 的配置,也都是可以写入到 config 目录下,所以,管理好应用的大环境,尤其是云环境,是重点要做的。

加固建议

一、一些敏感的配置,比如内部加解密字符串,数据库连接信息等,可以考虑写入到 Rails 的加密配置中,credentials.yml.enc 通过 master.key 进行了加密,可以保存产品环境的关键数据,即便泄露,没有 key 的时候也无法读取。

二、虽然 public 目录可以存放公网读取的文件,但是建议将它搬离到 Rails 项目目录之外,交给 web 服务器来管理。

三、config 目录检查版本库是否 ignore 了关键文件,敏感配置不出当前环境。

四、docker 容器环境里,要将配置信息和程序环境分离,避免容器重启导致配置丢失(这是真事,丢过配置,还丢过证书,你敢想!)。


A06:2021-自带缺陷和过时的组件 Vulnerable and Outdated Components

从2017版的第9位更名后升到第6位。但是它在社区调查中排在第二位,加上今年各种供应链攻击,估计这个排名未来还会上升。

概念

Web应用在使用第三方软件的时候,可能只用到了软件的一部分功能,却要为整个软件“买单”。随着软件使用时间的累积,一些漏洞逐渐爆出,由于担心软件升级导致应用故障,应用所有者一般不会及时更新自己的软件,这导致现有应用被新出现的软件漏洞攻击。

Rails 实现

对于 Rails,这恐怕是一个重点威胁。Rails 的运行基于大量 gem,而很多核心业务可能构建在第三方 gem 之上,gem 的代码都是公开源码,这导致第三方 gem 漏洞很容易被利用。而我们的应用在升级时,难免遇到gem不兼容的问题,项目只能“带伤”运行。

数据出自《CNCERT:2021年开源软件供应链安全风险研究报告》

地址详见:https://www.secrss.com/articles/32283

调查结果显示,近6年,Composer、Go、Maven、npm、PyPI、Rubygems 6种仓库的漏洞数均有不同程度的上涨;Rubygems 仓库漏洞增长速度最快,相比去年翻10.5倍;Go仓库和PyPI仓库增长率其次,环比增长率分别为252%和132%;Maven仓库2020年新增漏洞数基本与去年持平。

Rails 的主版本可以有效支撑3-5年,gem 版本依赖主版本。但是如果项目超过5年的生命周期,可以考虑项目瘦身,减少第三方gem依赖,保持最新版本。

对于全栈应用,因为依赖更多的 gem,升级的困难要大于 API 应用。

加固建议

一、简化,瘦身,减少第三方依赖。

二、尽量 API 化,前后端分离,各自加强安全左移工作。

三、全栈应用积极重构,核心业务从第三方 gem 剥离,更高程度的抽象核心逻辑代码。

四、以上3点说起来容易,做起来是真的难,所以项目立项的时候要考虑好如何发展自己的软件。

五、一定要从官方渠道安装gem,不要github搜完就加到 gemfile 里,很容易被供应链攻击。(哎,看看 node-pic 的供应链投毒,官方也不见得靠谱。)

六、多用 brakeman 。

七、对于 DAST 的集成是个很好的建议。

八、保持定期升级,不过,强烈建议看第八项。


A07:2021-身份识别和身份验证错误 Identification and Authentication Failures

该条目的名称之前为“无效的身份认证”,本次从第二位降到第七位,且包含了其他身份认证失效相关的 CWE。可见 owasp 不再做细分,而是从更高的统计层面合并同类项。

概念

用户验证和访问授权是2个相互补充的概念。Web应用常见的身份验证方式是密码验证,盗取登录密码是常见的攻击方式,比如撞库攻击,自动化攻击工具使这种攻击行为变得简单。在财富 100 强公司中,多达 90% 的 Web 应用登录尝试来自撞库攻击,而非合法登录。86%的数据泄露事件中,应用和身份是首要攻击目标。使用者不会经常更改自己的密码,且大多数在多个应用使用相同的密码,这使得撞库攻击变更更加容易。以上数据来自F5 lab。

Rails 实现

在使用第三方用户和权限 gem 的时候,它们通常不自带防爆破功能,这使得高频次登录行为的压制代码需要我们自己编写。建立黑名单是简单有效的方法,同时要限制登录失败尝试次数。

或者,把防爆破功能交给WAF去处理,它可以随时应用各种攻击变化,而我们只需要看应用日志,不必被登录日志的淹没而暴怒。

加固建议

一、减少身份校验失败时的信息泄露,使用更通用和“节能”的提示方式,减少不必要的信息泄露,也减少服务器性能压力。

二、减少密码依赖,改用其他的身份验证方式,增加双重验证。

三、CAPTCHA,简单有效。

四、使用签名 cookie

五、减少 session 的超时时间,避免“重放攻击”。

六、用 redis 这种缓存服务器来保存临时凭证,浏览器端仅提供对应的缓存key即可。


A08:2021-软件和数据完整性故障 Software and Data Integrity Failures

这是一个新的类别,却也是一个重要的类别,之前的『不安全的反序列化威胁』包含在其中。如果这份文档更新再晚一点出,在经历过 log4j 的肆意屠杀后,它的位置还会发生变化吧。

概念

最近几年,供应链攻击经常成为重大信息安全事件的主要手段,而 log4j 的漏洞大规模利用,使得这个分类的威胁要更加受到重视。该分类包含10个CWE,各个致命。

Rails 实现

Log4j 的远亲 log4r 没有在这次大规模事件中被提及,但是反序列化漏洞在ruby语言中要额外的加以重视,ruby语言动态构建类和方法的能力是天生的,如果代码的输入未加限制,危害等同于它的远亲。

而更重要的威胁,来自 Gemfile 中数据源的引用不当。我们几乎盲目的相信任何来自github的gem内容,而没有带入更便捷的代码审查,如果因为引用不当,又或是作者动了手脚,将是我们的灾难。

加固建议

一、再次看看 Gemfile 和 Gemfile.lock,审核外部引用的 gem

二、无论是内部加载的gem还是在vendor里的gem,审核代码,尤其是涉及核心业务的地方。

三、brakeman,之前提到过一次了。

四、使用更专业的供应链安全工具。


A09:2021-安全日志和监控故障 Security Logging and Monitoring Failures

从2017版本上升一位。

概念

应用需要提供日志记录和监控功能,在受到应用层攻击时,可以接收到达阈值的事件告警,根据记录详情进行攻击取证。可是化的日志呈现也是现代应用的标配。

Rails 实现

Rails 的强大和便捷,从诞生就体现在它的日志上,除了本地存储,还可以推送到远端的日志服务器。

加固建议

一、日志推送到端远端时,检查好日志接受者的安全性,避免es裸奔,或者弱密码。

二、针对自己的业务,定期做做漏洞扫面,看看文明的日志是否足够在灾难发生时为我们提供足够的证据。


A10:2021-服务端请求伪造 Server-Side Request Forgery

这是一个新类别,仅包含一个CWE,但它的威胁不能小觑。

概念

CSRF 对于 Rails 开发者再熟悉不过了,因为很多应用框架原生的支持,所以客户端请求伪造已经淡出了主要的威胁,从2017版本就排除在前十之外。

SSRF是服务端请求伪造,如果对 URL 的验证不充分,攻击者可构建恶意请求地址,比如一个含内部 redis 地址的 GET 方法。这种攻击在内部网络发生,由于我们经常使用云服务,和 DevOps,这种发生在应用环境内部网络的攻击更加严重。

Rails 实现

Rails 对地址的跳转约定,已经包含在 controller 中,尽量采用框架的方法将很大程度避免跳转地址的恶意构建。

加固建议

一、这条建议适用很多安全防护场景,就是采用网络隔离,不同的业务划分不同的网段,或者使用不同的访问策略,以减少黑客在内网横向移动的可能和难度。

二、这是一条代码开发者的建议,controller 只是做调配工作,具体的业务代码放到包装类里去实现,严格一些的话,action 内的逻辑代码不超过5行,超过的都要放入业务的包装类中。而业务的包装类做好分层设计,到采用更严格 的访问权限时,只需调整 action 入口,不用推翻大量代码。


总结

这篇文章是按照 OWASP TOP 10 2021 的逐条建议,对 Rails 开发做了梳理。编写本文的过程很漫长,它本来是作为 Rubyconf china 2021 的演讲稿一部分,但是期间经历了会议延期(2次),春节,冬奥会,俄乌战争,东残奥。孩子开学刚刚安静下来,吉林疫情开始爆发,学校上网课等等。无数的事情让这篇文章的编写时断时续,当然,这些都是客观,主观因为自己想说的太多、太杂,一时语塞。

今年会更多的输出文字内容,下一篇将商业软件的发售与授权,用 Rails 开发的软件产品,在销售给客户的过程中,如何使用 license 保护自己。

【Ruby on Rails】2021 OWASP TOP 10 的安全加固建议相关推荐

  1. 2021 OWASP TOP 10 漏洞指南

    一.什么是OWASP? 在 开放Web应用基金会致力于创造一个更安全的网络应用环境.它免费提供文章.工具.技术和论坛,让每个开发人员都能创建安全的代码.其最著名的项目之一是 OWASP Top 10. ...

  2. 2021 OWASP Top 10 榜单(初稿)发布,头牌易主

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 OWASP Top 10 榜单列出的是最危险的 web 漏洞,时隔四年且十多年以来,该榜单霸主易主. OWASP Top 10 榜单创建于21世 ...

  3. 【OWASP Top 10】2021版

    [OWASP Top 10]2021版 A01:失效的访问控制(Broken Access Control) 失效的访问控制(Broken Access Control)从第五位上升到了第一位.94% ...

  4. OWASP TOP 10 – 终极漏洞指南(2021)

    OWASP Top 10 是由开放 Web 应用程序安全项目 (OWASP) 建立的,该项目是一个非营利组织,可免费提供有关 Web 应用程序安全的文章和其他信息. 目录 什么是OWASP? 什么是 ...

  5. OWASP TOP 10 漏洞指南(2021)

    什么是OWASP TOP 10? OWASP,全称"开放式Web应用程序安全项目"是一个非营利性的组织,2003年该组织首次出版了"Top 10",也就是10项 ...

  6. OWASP Top 10 2021 全新出炉

    2021 年前 10 名发生了什么变化 有三个新类别,四个类别的命名和范围发生了变化,并且 2021 年的前 10 名中进行了一些合并. A01:2021-Broken Access Control ...

  7. 关于OWASP Top 10 2021的整理

    关于OWASP Top 10 2021的整理 前言 OWASP(open web application security project)是一个开放的在线社区,致力于使组织能够开发.购买和维护可信赖 ...

  8. 做网安必看的OWASP TOP 10(2021)最新榜单

    近日,OWASP发布2021年草案,全新的OWASP Top 10正式发布. 2021年的OWASP Top10 发生了很多变化,新增三个类别,四个类别的命名和范围也发生了变化,同时对top10进行了 ...

  9. OWASP TOP 10(2021)之注入漏洞(SQL注入和XSS注入)

    目录 一.SQL注入 1. 漏洞概述及原理 2. 漏洞可能造成的危害 3. 漏洞防范 4. SQL注入的分类与检测 5. 从攻击者的角度,如何绕过SQL注入防范呢? (1)对于关键字的绕过 (2)缓冲 ...

最新文章

  1. Git reset , revert, checkout的区别和联系
  2. c语言变量在头文件定义变量吗,在头文件C中声明变量
  3. leetcode算法题--三数之和
  4. 如何配置mysql8.0_安装和配置Mysql8.0
  5. new Random().Next(1, 100); 多线程同时执行结果很高概率相同,
  6. C++学习之普通函数指针与成员函数指针
  7. 复练-面试的科技树-我是谁、我喜欢、我能够
  8. NetBPM工作流的一个示例-请假审批
  9. [bzoj1086][SCOI2005]王室联邦
  10. css实现时间数字特效字体格式
  11. 如何让IE9或IE8打开多个网页时只保留一个IEXPLORE.EXE进程
  12. 鳥哥的 Linux 私房菜 -- 例行性工作排程的建立 cron,郁闷一下午
  13. 富文本 和 图片裁切
  14. Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use.
  15. 郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.2 Logistic梯度下降法...
  16. Windows环境下安装OpenCV-Python 完美解决:找不到指定模块(dll缺失)
  17. Elastic:如何摄入 Websocket 数据到 Elasticsearch
  18. php转调页面,如何转调
  19. 换发型特效怎么制作?这些方法值得收藏
  20. 从事Web前端要学什么 常用前端开发技术有哪些

热门文章

  1. 用于保存计算机输入输出数据的材料及其,用于保存计算机输入输出数据的材料及其制品称为()。...
  2. c++ -- 析构函数
  3. 四川南充商会商务运作百分百赚钱吗?是不是骗人的?
  4. 黄金票据维持域控权限
  5. 修改CentOS7系统时间EDT为CST【一篇就够】
  6. 设置springboot项目的欢迎界面
  7. 推荐7个好用的免费图床
  8. Linux C TCP Socket实现客户与服务器简单通信
  9. MoveBase源码阅读笔记
  10. Vue学习记录(Day.2)