密码/账户安全:“太安全”有多安全?

信息安全 密码 密码策略
2021-09-05 14:23:56

我现在正处于开发后端系统的阶段,我们可以在其中查看/修改所有客户信息、他们的客户信息等。

我正在考虑要求通过身份验证应用程序(不是 SMS)(已经实现)使用双因素身份验证,如果这不可用,则需要使用非常、非常强的密码并将其限制在一定天数之前它需要更改,并阻止最常见的密码。

我有许多从 Github 存储库获得的“通用密码列表”,可在此处找到:https ://github.com/danielmiessler/SecLists/tree/master/Passwords 。

我正在考虑使用 100,000 密码列表,因为我相信它提供了最好的而且不会走得太远,但我需要您对是否使用 1/10,000 或百万列表提出意见。

最后,展望未来,如果帐户通过公司 vpn 登录,我只允许完全访问数据,如果没有,则给他们一个不让他们深入了解的简化版本。

当谈到使用某种 JS/Backend 脚本为用户自动生成安全密码时,我认为这些都不是答案。这是因为,他们不会记住密码,只会将其保存到浏览器中。当他们尝试登录未保存密码的地方时,您可以保证他们的帐户将收到重置密码请求。这可能会导致该会话的使用量下降,或者如果对他们来说太多,则在可预见的情况下整个帐户都无法使用。

对于这个级别的员工,我还禁用了基于电子邮件的密码重置选项,并要求他们在内部进行,以确保数周的安全实施和数小时的解释我的 Sec SE 线程不偏离主题不会消失浪费了 10 年前设置的电子邮件地址的密码。

我们自己的员工可以查看的信息包括所有客户信息和他们的客户信息,例如完整的联系方式、完整的家庭住址、银行账户分类代码/帐号、从他们的卡中扣款的能力(我们不存储他们的抄送信息,只是PP/Stripe Key) 甚至包括消费习惯,以及其他方面。

您对实施最强大的方法来保护该级别的用户帐户的想法是什么,不仅通过密码,而且通过其他方式,而不会惹恼用户?

4个回答

您需要在安全性和可用性之间取得平衡。

最新的 NIST 密码指南说,您不应为此而强制定期更改密码,也不应强加过多的密码复杂性规则。该指南建议它们可能导致密码实际上不太安全,您可以在此处阅读摘要NIST 密码摘要

它确实表明阻止最常见的密码是最佳实践,我的印象是前 100,000 个应该足够好,我认为前 100,000 个是过多的。如果用户在尝试注册时遇到第 4000 次密码尝试,他们会感到沮丧。

这张来自英特尔的漂亮信息图展示了为什么长度比复杂性更重要英特尔密码信息图

两因素身份验证肯定会提高安全性,但请注意由于 SS7 路由协议中的不安全性而当前使用 SMS 的想法,并考虑使用身份验证器应用程序 ARS Technica 2FA/SS7等替代方案

根据我的经验,密码短语比密码更容易记住,而且输入速度也不慢。我的意思是,标准推荐的密码需要几个数字加上变音符号,这意味着你的手指必须同时使用 shift 键并在键盘上。用你的母语写一个简单的句子通常打字速度一样快,而且对大脑来说更容易。

在随机页面打开一本小说,或使用像这样的随机短语生成器

它给了我“警察找到你了吗?”

这有一个大写字母,一个“?”,容易记住并且有趣,并且足够长以阻止 NSA。而且它比用户的生日安全得多。易记,难猜。

另外,如果您像我一样不会说英语,那么它会为您提供大量使用您的母语输入单词的机会,而这些单词不太可能出现在字典攻击中。你能用俄语拼出一个三明治吗?

构建安全系统不仅仅是密码长度。您可以做什么以及应该做什么取决于您的用户是谁以及您可以要求对他们的操作进行多少控制。

这可能看起来违反直觉,尤其是在阅读了我的其余答案之后,但是如果用户不为您的公司工作并且只是访问和管理他们自己的数据,那么只需对他们提出最低要求。如果他们想为自己的数据设置不安全的密码,您不应该阻止他们。您可以警告他们并为他们提供选项,甚至向他们提出建议,但不要阻止他们按照自己的意愿保护数据。

话虽如此,如果他们愿意,至少要给他们足够的选择来保护他们的数据。(我最大的安全问题是让网站设置密码长度限制小于 32 个字符。例如密码必须在 8 到 12 个字符之间。)

另一方面,如果他们为您工作,并且他们正在管理其他人的数据,(看起来至少部分是这种情况,因为您提到员工拥有更广泛的访问权限),那么您可以做很多事情。

请记住,其中大部分仅适用于人们为贵公司工作的后一种情况,以下是我的建议:

  1. 对于一个非常安全的系统,肯定需要某种 2 因素身份验证。对于 Web 界面,除了密码之外,您还可以要求客户端证书(在智能卡或类似设备上)进行身份验证。这意味着用户必须有一些东西并且知道一些东西。您还可以使用任何令牌生成器(硬件或软件)来获得类似的安全级别,但这通常需要用户每次输入不同的内容,而证书方法可以简单地发生,只要用户有他们的智能卡(当然用静态引脚保护)。

  2. 不活动后注销会话。如果他们仍在做事,请不要让他们退出。如果他们在 5 分钟内没有做任何事情,则将其注销。

  3. 要求使用 KeePass 或 LastPass 等客户端加密密码生成器,以便您可以有效地要求 64 个字符或更长的密码。由于这些存储在用户的机器上并用他们自己的密码加密,因此在用户和他们自己的机器之间进行了最弱的身份验证。身份验证的面向 Internet 的部分使用更安全的密码并防止密码重用问题。(密码重用是你最大的敌人)

  4. 始终需要 VPN。这听起来可能有些过头了,但我见过太多没有安全知识的 Web 开发人员,而且他们的代码很快就会被利用。但是,如果您的所有网络内容都是通过 VPN 完成的(至少对于员工而言),那么那些不应该访问的人甚至永远不会看到登录屏幕,无论是否不安全。(这不是编写不安全代码的许可)

  5. 聘请安全专家。如果您的预算允许,整个团队。因为你不可能想到所有事情,让专门从事安全工作的人来检查你的系统可能是我能给你的最好主意。确保他们进行了大量的渗透测试。

系统安全背后的主要思想是了解您的威胁模型(存储了用户的银行帐户信息,您就拥有了一个真正高级别的威胁模型)和深度防御。在您的系统和您的敌人之间放置尽可能多的层,而不会为您的合法用户牺牲太多便利。

最后的想法:培训您的员工使用安全实践并不过分要求他们。密码不仅仅是长度和复杂性。密码重用是我们面临的最棘手的问题之一,也是使用 2fa 的最大原因之一。我敢打赌,您的许多员工在工作中使用的密码与他们在其他服务中使用的密码相同。这些服务没有相同的威胁模型,也没有明智地保护他们的系统。

为了解决您的问题“您对实施最强大的方法来保护此级别的用户帐户的想法是什么,不仅通过密码,还通过其他方式,而不会惹恼用户?”

我知道“过度”的一种常见做法是在 X 次尝试失败后锁定帐户的做法。这是为了防止暴力攻击。乍一看,这似乎是明智的,但请考虑以下几点:

  • 用户名列表相对容易掌握或猜测。
  • 导致锁定的失败尝试次数通常很少。(10个或更少)
  • 从远程设备以用户身份登录是很常见的。

当您将这些放在一起时,公司可能会被恶意脚本以每个用户或大部分用户的身份多次远程登录,从而锁定所有帐户而陷入瘫痪。为避免这种情况,只需在 N 次尝试后每隔 X 秒将来自给定位置的尝试次数限制为 1。蛮力攻击依赖于在很短的时间内进行的许多猜测。如果蛮力攻击每 5 或 30 秒只能尝试 1 次攻击,而不是每秒数千次,那么蛮力路线就变得不切实际。

这对用户来说可能很烦人,因为他们需要打电话给某人才能解锁他们的帐户,但实际上可以用作安全漏洞。除了为恶意代码添加一种将所有人拒之门外的方法外,它还可能导致密钥持有者对呼叫解锁帐户的人变得不敏感。这可能导致更高级的社会工程攻击。

例如: IT 人:“这是本周第三次了!”
恶意攻击者:“是的,我就是不记得我的密码!你能把它重置为……”

编辑以显示它如何回答问题。