我们最近收到了两起关于 Discourse 站点被盗的报告,很可能是由于管理员账户密码较弱造成的。因此,我们希望记录以下内容:
- 发生被盗事件时该怎么做
- 我们将来可以采取哪些措施更好地预防这种情况
数据库
请注意,Discourse 多年来已在站点数据库中实施了以下保护措施:
-
完整的数据库备份下载链接只会通过站点管理员的有效电子邮件发送,因此您不仅需要登录(通过偷窥或忘记登出),还必须控制站点管理员的电子邮件地址。而且,您已经为您的电子邮件设置了 2FA,对吗?;)
-
要更改员工电子邮件,您必须验证对旧和新电子邮件地址的控制权——而普通用户只需验证对新电子邮件地址的控制权。这使得更改员工电子邮件地址变得更加困难。
-
假设您已配置了地理位置数据库 API 密钥(它是免费的,需要注册),那么当员工从与他们上次登录地点物理距离很远的位置登录时,您会得到主动警告。
-
超过一年未登录的管理员需要重新验证其电子邮件地址,以减少攻击面。此站点设置为
invalidate inactive admin email after days,默认值为 365。
尽管如此,在发生被盗事件时,您应始终假设恶意管理员账户已下载了站点的完整数据库/备份副本。
因此,您应立即使用以下命令重置所有帐户密码:
./launcher enter app
rails r 'UserPassword.update_all(password_hash: SecureRandom.hex * 2)'
此外,您必须让所有用户登出
./launcher enter app
rails r 'UserAuthToken.destroy_all'
最后,您必须删除所有 API 密钥
./launcher enter app
rails r 'UserApiKey.destroy_all'
rails r 'ApiKey.destroy_all'
数据库中的账户密码
根据我们的安全文档,Discourse 在数据库中存储密码时使用了非常强大、难以破解的哈希算法:
Discourse 使用 PBKDF2 算法来加密加盐密码。该算法受 NIST 推荐。网络安全专家普遍认为 PBKDF2 是一个安全的选择。
并且用户密码的最小默认长度为 10 位,管理员为 15 位——这使得反向破解密码哈希以获取原始密码变得困难。但这并不能阻止用户设置 password1password1 或其他易于反向破解的密码,即使使用强大的哈希算法也是如此。
数据库中的电子邮件
攻击者可以看到您站点上所有用户的电子邮件地址。这通常是只有版主点击按钮才能查看的特权信息。
数据库中的消息内容
由于攻击者获取了数据库的副本,他们可以看到所有帖子中存储的所有信息。
-
如果您在回复中(无论是私密还是公开)中转了外部密码或账户信息,应立即更改这些密码。
-
如果您的回复中(无论是私密还是公开)包含敏感信息,请注意攻击者可以看到这些信息。
加密消息
如果您使用的是Discourse Encrypt 插件,加密消息将是端到端加密的。这意味着如果数据库泄露,攻击者将无法访问加密消息中的内容。
法规
请务必就您的法律义务寻求专业的法律建议。某些法规,例如 GDPR 和 CCPA,可能要求进行披露。
未来
如果您有理由认为您的站点将受到攻击,您可能希望要求员工用户启用双因素身份验证。您需要的站点设置为“enforce second factor”(强制执行双重身份验证)
enforce second factor
强制用户启用双因素身份验证。选择“all”将对所有用户强制执行。选择“staff”仅对员工用户强制执行。