美文网首页技术干货网络与信息安全互联网科技
知物由学 | 前Google高级软件工程师:我为什么建议你把账户

知物由学 | 前Google高级软件工程师:我为什么建议你把账户

作者: 8f334869c265 | 来源:发表于2018-05-25 20:26 被阅读7次

    “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充《论衡·实知》。人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道。“知物由学”希望通过一篇篇技术干货、趋势解读、人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你。当然,如果你有不错的认知或分享,也欢迎通过邮件(zhangyong02@corp.netease.com)投稿。

    作者介绍:Mike Hearn是一名软件开发人员,之前是Google的高级软件工程师和Gmail的反垃圾技术负责人,在反垃圾和登录安全方面有着八年的工作经验。

    以下是译文:

    我在谷歌期间参与一个统一账户系统(特别是反劫持anti-hijacking)的项目。登录是大多数网站的一部分,而本文也是我对如何构建安全登录的一些思考与建议。

    1.自己最好不要做登录系统

    无论你的业务是什么,用户身份验证都不是你的核心能力。因为现在的登录系统需要做很多,密码只是开始。如果想要让登录安全,你最终还要添加不少登录设置功能:

    忘记密码的恢复;

    电子邮件地址验证;

    注销账号;

    密码暴力的强制保护;

    通过短信,手机应用程序和硬件密钥的双重身份验证;

    账户劫持保护(当攻击者已经知道正确的密码并且用户没有修改时);

    地区/语言/名称/个人资料照片偏好;

    支持移动/桌面登录;

    随着用户对系统体验期望的提高且攻击者变得愈加厉害,继续努力变得不切实际。幸运的是,你可以将认证外包给使用OAuth(OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准)的公司。

    2.使用电子邮件/电话号码来识别用户

    登录系统来识别用户身份的方式莫过于两种,用户的电子邮箱或者电话号码。如果你想让用户使用与显示名称不同的名称,公司应该单独去做这项工作,为什么呢?

    无论如何,电子邮箱是最方便的;

    如果用户名成为你服务中的一种自我展示形式,用户会时不时地想改变它;

    用户容易忘记用户名,而不会忘记电子邮箱/电话号码;

    优质的用户名总是有限的;

    将用户名与显示名称分开将减少用户对名称设置的限制,如禁止使用空格。

    3.根本不使用密码

    如果你还没有准备好100%地依赖第三方ID提供商,那么至少支持用户不使用密码。

    因为你已经要求用户提供他们的电子邮箱,然后你在登录系统添加的的第一个功能将会是密码恢复,那么这就可以通过电子邮件向用户发送可点击的链接来工作。因此,任何可以阅读用户电子邮件的人都可以以任何方式登录,而你自己的站点密码不会增加额外的安全性。

    可能会有人说,这样会缺少密码输入框,用户会感到困惑。但现在Google登录就是要求用户提供他们的电子邮件地址,因此可以看出这不太可能让用户感到困惑,而且其中的好处是巨大的。

    这种方法还需要考虑的问题是:一些用户有电话号码,但没有电子邮箱。所以,你最终需要支持那些只能通过手机接收代码来登录的用户。这样的账户没有密码,所以如果你假定所有的用户都有密码,那么你需要添加许多安全敏感的代码路径的特殊情况,然而这就很容易导致致命的错误。

    4.不要使用隐私问题

    如果你使用了密码,但是至少不要让用户使用隐私的问题和答案来恢复忘记密码;

    隐私问题的答案往往是简单的猜测,用户会发现这些问题的答案不只是他们知道;

    预先提供的问题会使猜测问题变得更简单;

    预先提供的问题通常具有可猜测性(例如,“你在什么地方上的高中?”);

    有很多高调的黑客,通过滥用密码恢复流来工作。

    这里有一些例子:

    问:最喜欢的食物?

    答:披萨。

    答案总是披萨,你只需猜一次就可以猜中约20%的说英语的账户。只要10次猜测,你可以猜中三分之一以上有这个问题的所有说英语的账户。对于韩国账户,你可以在10次猜中所有账户的43%。

    问:我结婚的日期?答:星期四。

    一个自定义的问题,但也是致命的缺陷。攻击者只需要猜测5次(这样太少以至于不能被视为暴力强制尝试。)

    问:我出生在哪个城市? 

    答:首尔。

    在一些国家,几乎每个人都住在少数几个大城市。观察ID验证用户界面所使用的语言可以大大缩小可能城市的范围。对于韩国账户,你只需要10次猜测即可猜中使用此问题40%的账户。

    毫无疑问,专业账户系统并不都是使用隐私问题来允许用户恢复账户,这仅仅是其中的一个例子。用户不会在小于2%的机会下写一些足够复杂的东西来得到恢复密码的权力。这就是为什么Google将Q

    / As逐步转向支持短信(SMS)恢复的原因。虽然基于SMS的恢复有其自身的问题,但它仍然比隐私问题好很多。

    5.避免使用验证码(CAPTCHA)

    验证码是许多登录表单的常用功能,但是目前验证码的价值非常低。

    需要了解是,验证码只能对自动攻击施加非常基本的限制,而不会保护你的账户系统免受批量注册。除了账户安全,还需要解决Google注册滥用的问题。我们经常看到垃圾邮件发送者解决数千万个我们最难破解的验证码,因为有一些专业的验证码破解公司,比如DeathByCaptcha,他们是将OCR和人工解决结合起来。普通验证码还有一个问题就是会阻止盲人注册,而基于语音识别的验证码必需得由计算机解决,无法由人工解决。

    验证码对阻止暴力的强制尝试密码是最有用的,有的人可能需要数十万次或数百万次针对账户的尝试才能找到正确的密码。为了防止用户这种无尽的失败尝试的简单方法就是放弃验证码。而且即使简单的验证码也足以将一个小的延迟投入到bot循环中。

    验证码在停止批量账户注册方面的用处不大。构建系统来检测和阻止这是一件困难的事,要了解它有多困难,请访问buyaccs.com,并观察地下账户卖家收取的巨大价格变化。较高的价格有更好的防御系统,除非你是五大网站,否则你将无法战胜在账户注册安全方面所做的工作,这也是将登录系统外包给专门的公司的另一个理由。

    如果你仍想使用验证码,请使用重复验证码并确保你的验证码已足以防御反复攻击。不要试图使用自己做的或你在GitHub上找到的用具包。这些验证码总是会被现在的OCR解决,且除了降低客户注册的成功率外,什么做不了。

    PS:有人工智能加持的网易云易盾验证码服务可以有效解决这个问题,具体可以参阅这篇文章:应对羊毛党的老手段不管用了,但有些公司依然有办法,他们是怎么做的?

    6.外包双重认证(2-factor authentication)

    目前,双重身份验证是一项非常普遍的功能。而且做好这个很难,你不要想着自己实现它。

    SMS是不可靠的,特别是某些国家。恢复代码偶尔不会显示出来。因此,你最终会希望通过语音合成实现电话呼叫,因为电话呼叫更可靠,所以现在你需要多语言语音合成引擎;

    人们无法一直使用他们的电话号码。如果你依赖电子邮件地址,你的密码恢复流程可能非常容易。但一旦引入了实用的2FA,密码恢复就成为系统中最薄弱的一点。因为如果你不升级它,攻击者就会一直缠着它;

    2FA可能会被攻击者滥用,攻击者会将其添加到被他们盗用或被黑客入侵的账户中。这是为了阻止真正的用户找回这些账户;

    电话号码很容易移植攻击,因此就是要求用户设置移动应用程序或安全密钥。实施这些很麻烦,而且这也不能万无一失,并且你最终还需要一些用户支持这个设置的实现;

    正如你所想的那样,2FA增加了大量的手动客户支持工作,那是因为你不会再让用户使用电子邮件或基于私密问题的密码恢复。

    其中一些问题是根本性的,但其中大部分问题已经被大公司解决了,他们将免费为你代付手机费用和客户支持人员!不过,如果你不想使用它们,这里也有些初创公司会为你解决2FA的小部分难题。

    7.不要强制更改密码

    不要因为密码使用有些久远就要求用户更改密码。

    有些用户不会完成整个过程,然后你就会流失用户;

    有些用户会比你更聪明,使用一些技巧比如改变密码(一次、两次、三次),然后立即将密码更改回原来的密码,这意味着你需要存储最近密码的历史,以防止这种行为;

    无论如何它并没有提高安全性。

    8.记得注销

    在未成熟的账户系统中,注销错误非常普遍。听起来很简单,但最常用做法是有问题的。

    简单地删除会话cookie对于用户来说很方便,但意味着你无法从XSS恢复。一旦找到XSS,你希望被盗的会话cookie失效,但如果退出只是“请求浏览器删除cookie”,那么你是无法做到这一点的;

    为cookie添加时间戳,然后设置“最后注销时间”需要每个操作都检查账户数据库以发现用户的会话是否失效。此外,这样做也意味着需要用户退出浏览器或设备,然而这并不是用户所期望的。

    做到这一点的正确方法是保留使用内存缓存的失效会话cookie列表。但是对于大多数公司来说,有一种成本较低且足够好的方法:让用户的注销链接仅仅是清除会话cookie的一种方式,而不会让会话cookie失效,但会每5分钟左右自动更换一次。更换失效会话cookie的行为会查询数据库以查看管理员是否强制注销。如果用户正在呈现失效的cookie,则他们需要重新登录。这样在cookie被盗后进行清理是相对罕见的事件。

    9.将账户电子邮件与营销邮件分开

    发送密码恢复链接,注册验证等来自你公司的主要电子邮件服务器。不幸的是,贵公司的一些人正试图通过这个向用户发送他们不想要的商业邮件来与用户建立“关系”。

    即使用户同意在账户注册期间收到这些邮件,但是他们中的许多人不希望一直这样,然后有些人会通过将其设置为垃圾邮件来解决此问题。

    不幸的是,这种完全正常的行为将降低电子邮件域的声誉,然后你的账户系统中的邮件可能会开始进入用户的垃圾邮件文件夹。这就是为什么我们都看到了注册或密码恢复流程中的警告,要求我们检查我们的垃圾邮件文件夹。

    解决这个问题的一种方法是购买一个单独的顶级域名来发送你的账户邮件并确保配置DKIM。但是一些用户会注意到不匹配,并将你的电子邮件报告为网络钓鱼。最好的解决方案是将你的营销邮件从不同的DKIM领域发送出去,但这可能会涉及到与负责产品的同事进行竞争。

    10.保持密码数据库的安全

    如果你的数据库里面有密码,你就会有一个数据库攻击者。他们不直接关心你的公司,他们只是想要密码,以便他们可以尝试更高价值的目标。然而,数据泄露是令人尴尬,即使对客户的直接影响较低,也可能带来很大的代价。OAuth令牌数据库对攻击者而言价值远低于此值,因此受攻击的可能性要小得多。

    结论

    关于账户系统的信息还有很多,这个任务看起来很大。这就是为什么我一直建议把你的账户管理外包给大的公司。摆弄验证码不是你的核心业务;编写“注销”设计文档不是你的核心业务;诊断你为什么会流失忘记密码的用户不是你的核心业务;诊断为什么短信传送到对方不可靠不是你的核心业务。你在这些东西上浪费精力与费用时,你的对手们正在核心业务上下功夫。

    相关文章

      网友评论

        本文标题:知物由学 | 前Google高级软件工程师:我为什么建议你把账户

        本文链接:https://www.haomeiwen.com/subject/hanujftx.html