
掌握ChatGPT插件与自定义GPT
在网络安全方面,身份验证和授权是我们平台最重要的两个安全方面。但我们知道,保护我们的应用程序和用户数据是一场多方面的战斗。任何一扇门都不能没有保护。
尽管如此,您仍会花费大部分时间和精力来保护网站的主要访问渠道。因此,了解身份验证失效等问题对于提供强大的保护至关重要。
本文旨在探讨 Ruby on Rails 环境下身份验证失败的问题。
我们将简要介绍身份验证的概念,并帮助您更好地掌握如何提供适当的安全性。
为了实现这一点,我们首先要了解什么是失效身份验证。然后,我们将使用一些简单的例子来帮助我们描述失效身份验证攻击在野外可能是什么样子,以及它针对的是哪些漏洞。
最后,我们将为您提供一些缓解策略,以帮助您解决可能发现的漏洞。
好吧,让我们开始吧。
首先,让我们定义一下“身份验证失败”的含义。
简而言之,破坏的身份验证是多个漏洞的总称,攻击者可以利用这些漏洞劫持我们的系统并冒充其他用户。
我们知道,我们平台中的身份验证机制的作用是确保只有经过验证的用户才能访问 Web 应用程序上的信息和权限。但是,当攻击者成功绕过该过程并在应用程序上冒充用户时,它被称为“破坏”。本质上,攻击者可以跳过登录安全性并获得被黑客入侵用户拥有的所有权限。
更具体地说,失效身份验证是指在线平台或应用程序的身份验证机制中固有的漏洞或弱点。我们通常可以在糟糕的会话管理和凭证管理中发现这些漏洞。
这两种情况都属于身份验证漏洞,因为攻击者可以通过劫持会话 ID 或窃取登录凭据来伪装成用户。此外,这种漏洞还使攻击者能够窃取密码、密钥或会话令牌、用户帐户信息和其他详细信息,从而冒充用户身份。
因此,我们知道身份验证攻击主要针对我们的凭证或会话管理。但是,这实际上是如何发生的呢?
嗯,确实有很多方法。但为了简洁起见,我们将探讨实施不良管理机制和政策的情况。
实施不良的凭证管理机制和政策是攻击者访问您的系统的潜在途径。
允许使用“12345”或“password”等弱密码的安全策略是削弱我们凭证管理安全性的一种方式。
在这种情况下,攻击者只需要简单的密码破解技术,如暴力破解、彩虹表、字典,以及足够的时间来破坏您的安全并访问您的系统。
此外,使用弱加密来保护用户凭证是整个安全策略的一个重大漏洞。
使用不充分的加密机制(例如 base64)和散列算法(例如 SHA1 或 MD5)在数据库泄露时几乎无法提供保护,从而暴露凭证和敏感数据。
我们知道,每当用户与您的网站互动时,服务器应用程序都会为他们提供一个会话 ID 以进行会话管理并记录他们的互动。
根据OWASP 破解身份验证建议,此会话 ID 相当于您的原始登录凭据。因此,如果恶意行为者获取了此会话 ID 的访问权限,他们便可以有效地冒充您并绕过所有安全机制。
这种安全漏洞被称为会话劫持,会给受害者带来毁灭性的后果。
现在我们了解了系统中身份验证失败是如何发生的,让我们来探讨一些针对特定漏洞的攻击示例。
密码喷洒攻击利用允许用户使用简单且弱的密码(例如“12345”或“password”)的系统。
攻击者可以使用彩虹表或字典在用户帐户上尝试尽可能多的已知密码,以寻找弱凭证并获得系统访问权限。
凭证填充是指使用从其他违规行为中获取的凭证来访问我们的平台。
这种攻击基于这样的假设:大量用户为了追求方便和摩擦而在平台之间重复使用凭证。
如上所述,会话劫持是指恶意行为者接管用户会话的情况。这种情况可能很简单,比如用户在离开前忘记从计算机注销,然后其他人代替他登录。
此外,假设无论认证状态如何,都发放相同的 ID。在这种情况下,可能会引发一种称为“会话固定”的攻击,即未经授权的会话使用会话 ID。
如果用户会话 ID 显而易见,攻击者可以使用不安全的 WiFi 接入点、中间人攻击或简单地窃听地址栏来获取用户会话 ID。
解决漏洞和降低违规风险的最佳方法是遵循 OWASP 的最佳实践。
幸运的是,如果您使用像devise这样强大且久经考验的 gem ,您可以轻松地保护您的平台免受这些漏洞的侵害。
要安装 devise,您需要做的就是将gem添加到您的 Gemfile 中。
gem 'devise'
完成此操作后,您需要运行bundle install命令来在您的项目中安装 gem 依赖项。
bundle install
接下来,运行以下命令来生成项目上 gem 所需的默认资源。
$ rails generate devise:install
现在,在您的配置文件中添加以下配置,以设置用户身份验证和确认的电子邮件设置。
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
完成此操作后,运行以下命令来生成或更新代表项目中用户的模型。在这种情况下,您可以将MODEL替换为您为用户使用的任何模型名称。
$ rails generate devise MODEL
最后,运行迁移命令来更新数据库以反映修改后的模型结构。
rails db:migrate
您现在需要做的就是在您想要强制执行身份验证的控制器上添加以下行,就这样。
before_action :authenticate_user!
您可能还需要遵循一些步骤才能使用 devise 锁定和加载您的应用程序。请访问此处的devise 官方 GitHub 页面以获取更多信息。
现在,让我们看看如何在我们的项目中实施缓解策略。
最佳实践告诉我们,要确保所有密码不仅经过加密,还经过哈希处理和加盐处理。此策略可防止或至少减缓任何访问被攻破数据库的尝试,从而在发生入侵时保护用户的凭据。
如果您正在使用设备,则默认情况下会启用加密和加盐。
您可以通过修改devise_initializer.rb文件上的config.pepper值来配置加密密钥。
安全的应用程序必须要求其用户在创建密码时满足特定要求。
一些最常见的要求是
这些要求必须首先通过 JavaScript 在客户端创建的策略来执行和验证。不过,您也可以选择使用 devise 验证服务器端提供的值。
您可以使用config.password_length设置在devise_initializer.rb文件中配置密码长度。
此外,为了验证密码复杂性,您可以在用户模型上使用以下方法:
def password_complexity
# Regexp extracted from https://stackoverflow.com/questions/19605150/regex-for-password-must-contain-at-least-eight-characters-at-least-one-number-a
return if password.blank? || password =~ /(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-])/
errors.add :password, 'Complexity requirement not met. Please use: 1 uppercase, 1 lowercase, 1 digit and 1 special character'
end
请记住,其中一些规范在保护用户方面比其他规范更为有效,但当用户不愿意遵守它们时,它们也可能产生相反的效果。
凭证恢复过程应该需要进行多次验证检查,这使得攻击者滥用它变得复杂且昂贵。
为了在 devise 中实现这一点,您可以使用devise_initializer.rb文件中的以下配置设置:
实施密码泄露保护机制可让您的系统锁定密码被识别为泄露的用户的帐户。这样,您可以确保用户在被恶意攻击者窃取其凭据时有时间防止密码泄露。
为了提供此安全功能,我们推荐Pwned,它提供了更新的泄露密码存储库,以便实时进行交叉验证。
Web 应用程序必须在用户处于不活动状态一段时间后结束用户会话。要控制应用程序会话的长度,只需修改devise_initializer.rb文件中的config.timeout_in设置。
我们的平台必须在每次身份验证成功后提供单独的会话 ID。此外,我们的系统必须在会话结束后立即使旧会话 ID 失效,以防止劫持。
幸运的是,devise 已经为我们解决了这个问题。
这里不需要过多解释。Web URL 必须使用 SSL 进行保护,并且不能包含会话 ID。
以上就是我们对身份验证失败及其复杂性的简要探讨。但请记住,这绝不是广泛或完整的。
在本文中,我们花了一些时间阐述身份验证失效这一主题,并简要分析了网络上许多最常见和最隐蔽的漏洞。此外,我们还提供了一些可行且直接的策略来缓解这些漏洞。
然而,我们的工作是实施强有力且广泛的安全措施来保护用户的数据和客户的资产。
这就是为什么我们建议您考虑使用 StackHawk 的动态应用程序安全测试。
文章来源:Rails Broken Authentication Guide: Examples and Prevention