在 Joomla! 4 中实现安全、快速和简单的无密码认证
Joomla! 4 引入了许多新功能和令人兴奋的特性。虽然其中大部分都非常明显,为您提供更轻松地构建和使用网站的新方法,但仍有许多功能旨在增强您网站的安全性。今天我们将讨论 WebAuthn,这是一个独特地属于两个类别的功能:它既使您的网站登录更安全,又使登录更简单。
密码导致网站被黑客攻击
有一种普遍的误解认为只有高价值网站才有可能被黑客攻击。虽然高价值网站更有可能遭受有针对性的攻击活动,但这并不意味着小网站就不会受到攻击。网络犯罪分子热衷于攻击那些没有防范的网站,这些网站可以被用来发送垃圾邮件或钓鱼邮件、托管恶意软件或成为僵尸网络的无意识帮凶。
破坏网站的最常见途径是令人尴尬的简单:一个不安全或重复使用的密码,被自动攻击工具发现。有许多包含从过去大型网站泄露的已知真实密码的列表。这些机会主义攻击依赖于人类倾向于使用易于记忆的密码并在不同的网站和服务之间重复使用它们的倾向。虽然过时软件中的漏洞可能会使发现此类密码更容易或提供其他获取非法访问网站的方法,但这既不常见也不必要来破坏网站。
除此之外,如果攻击者获取了你网站数据库的副本——利用Joomla或第三方扩展的漏洞——他们将获得Joomla知道的所有用户名、电子邮件地址和密码的副本。Joomla一直在升级其数据库中存储密码的方式,使用更强大的散列算法,这使得密码更难破解。尽管如此,随着云计算提供商的出现和它们提供的相对便宜的价格,特别是GPU计算,破解密码的理想计算能力削弱了这些努力——至少在一定程度上。
自3.2版本以来,Joomla提供双重身份验证(2FA)作为减少不良密码影响的实用手段。然而,2FA使用起来很繁琐,因为它需要通过另一个设备或应用程序输入另一条信息。此外,最流行的2FA软件(谷歌身份验证器)的实施方式让许多用户感到惊讶:如果你重置或更改了手机,你将失去对所有存储的2FA的访问权限,从而被锁定在网站之外,需要一些“数据库手术”才能恢复访问权限。更不用说,它并没有完全解决像密码一样,也可能无意中被泄露给攻击者或被恶意软件窃取的问题。
这些挑战并非Joomla独有。这些是使用密码作为身份验证(登录)手段的固有弱点。虽然使用密码管理器为每个网站生成和存储不同、随机生成、长且复杂的密码,以及使用双重身份验证可以帮助减轻使用密码进行身份验证的风险,但这种解决方案很复杂,可能会让最需要它的用户望而却步。
现在介绍公钥加密技术
公钥加密技术于20世纪70年代问世,它解决了安全交换信息的问题。它基于两个数学上相互关联的非常长的数字。它们被称为公钥和私钥。一个公钥及其相互关联的私钥称为密钥对。你可以用其中一个密钥加密的信息只能用另一个密钥解密。拥有其中一个密钥不会损害加密的安全性。实际上,你应该将公钥与每个人共享,无论是朋友还是敌人。公钥加密技术背后的数学规定,拥有其中一个密钥并不能让你以任何实际方式找到另一个密钥,即使是在今天计算能力过剩的情况下。
公钥加密技术是我们所知的网络的基石。它是HTTPS中使用的技术,使得安全信息交换——比如在网上输入你的信用卡信息——变得可能且实用。
实际上,你可以使用相同的技术来替代密码。简单来说,浏览器需要生成一个密钥对并将公钥交给服务器。当需要登录时,服务器会将一块随机生成的数据发送给浏览器并记住它。浏览器使用自己保留的私钥加密这些数据,并将其加密后的数据发送回服务器。服务器使用与私钥相对应的公钥解密数据。然后检查解密后的数据是否与它记住发送给浏览器的数据匹配。如果是这样,用户就登录了。这个过程,以及浏览器和服务器建立相互信任所需的所有必要控制,是W3C标准,称为Web身份验证,简称WebAuthn。
WebAuthn是安全的
仅让浏览器处理生成密钥对并将密钥存储在用户设备上,而不采取任何进一步的保护措施,无异于徒劳。浏览器非常复杂。其复杂性是不断存在且易于理解的bug来源,其中一些bug具有安全影响,可能导致浏览器泄露其密钥。更不用说,用户设备上的恶意软件可能从设备存储或浏览器的内存中窃取密钥。因此,尽管WebAuthn允许浏览器自行处理所有这些操作,即所谓的软件认证器,但它对此表示反对,并坚持使用安全硬件。实际上,大多数现代浏览器根本不实现软件认证器,或者默认禁用。
大多数现代设备都内置了安全的加密硬件。这通常被称为TPM或安全区域。这些芯片对于设备处理器(CPU)、运行操作系统的芯片、您的浏览器以及所有其他内容来说都是黑盒子。也就是说,设备能做的只是向安全硬件发送数据,并返回加密或解密的消息。进一步来说,安全硬件可以通过生物识别技术解锁,例如Windows 10上的Windows Hello(使用指纹、面部扫描或其他生物识别),苹果设备上的TouchID / FaceID,或安卓设备上的指纹扫描。简而言之,仅拥有设备是不够的;您需要使用生物识别来证明您就是您所说的那个人。
此外,可以使用实现FIDO2或FIDO协议的安全硬件U盘进行认证。这些与TPM或安全区域类似,但它们不是集成到设备中,而是通过USB、NFC或低功耗蓝牙(BLE)连接到设备。它们通过按/触摸U盘上的按钮、扫描指纹、在设备上的U盘上输入PIN、在您的计算机上提供PIN或其组合来解锁。也就是说,将U盘连接到设备是不够的。它需要与用户的积极互动,因此消除了在浏览器出现bug或您的设备被入侵(例如,由于恶意软件)的情况下进行静默远程利用的可能性。显然,如果唯一的保护措施是按按钮,这些设备就像您的家门钥匙一样:如果您丢失了它们,它们可以用来解锁一切。这就是为什么Windows 10需要它们使用PIN进行保护,才能提供使用它们的机会。即使它们丢失或被盗,如果没有您唯一知道的PIN,它们也将毫无用处。
用于生成密钥对的加密硬件,无论是内置在设备中还是外部U盘,在WebAuthn的术语中被称为“认证器”。您的登录实际上是与认证器相关联,而不是直接与您使用的浏览器相关联。也就是说,如果您使用的是Yubico安全密钥NFC等安全硬件U盘,您可以在浏览器和设备(如笔记本电脑、手机和平板电脑)之间使用它,而无需在每个设备上的每个浏览器上重新配置。
WebAuthn之所以安全,另一个原因是服务器,在这种情况下是您的Joomla网站,只知道与登录网站所用的每个浏览器或设备关联的公钥。公钥设计成不是秘密的。您可以将其交给任何人,而不会影响您登录的安全性!如果有人入侵了您的网站,他们将获取存储的WebAuthn公钥,但这些公钥本身完全无用。与密码散列不同,它们不能被破解或以任何方式用于模拟登录。
WebAuthn 还将密钥对与其生成的网站的精确域名和子域名链接起来。这意味着为 example.com 生成的密钥对将不适用于 www.example.com、foobar.example.com 或 example.net。同样,为 www.example.com 生成的密钥对也将不适用于 example.com 或甚至 foobar.www.example.com。这听起来可能是一个微不足道的细节,但它可以保护您免受攻击者在其受信任网站的子域上安装恶意网站以拦截登录的侵害。
最后,WebAuthn 依赖于加密的信息交换。不需要输入任何内容。交换的信息本身就是加密的,它通过 HTTPS 加密传输,并包含让浏览器和服务器验证其未遭到篡改的控制措施。这使得 WebAuthn 无法被钓鱼(您不能被欺骗向攻击者泄露它)并且对网络攻击具有很高的抵抗力。
简而言之,WebAuthn 是我们能够利用现有技术达到的“无法被破解”的最佳状态。它不仅仅是密码的替代品,它旨在修复密码的所有错误,甚至更多。
您需要什么才能使用 WebAuthn
我非常高兴为支持 WebAuthn 的代码做出了贡献,这些代码包含在 Joomla 4 中。要在您的网站上使用 WebAuthn,您需要满足以下要求
启用“系统 - WebAuthn 无密码登录”插件。此插件默认启用,并在 Joomla 中实现 WebAuthn,包括认证器管理和登录。
使用有效证书的 HTTPS。您的网站必须始终只能通过 HTTPS 访问。您可以通过将全局配置中的“强制 HTTPS”设置为“整个站点”来实现这一点。请确保您拥有有效的 SSL 证书。大多数主机允许您使用 Let's Encrypt 服务免费获得证书。这里需要注意的是,如果您在本地开发或在临时 URL 上,WebAuthn 将无法工作。也就是说,WebAuthn 是您应该只在您的现场站点上启用的东西。
支持 WebAuthn 的浏览器。所有最新的 Google Chrome、Safari、Mozilla Firefox、Microsoft Edge、Opera、Brave 等浏览器都支持 WebAuthn。我强烈建议在桌面电脑上使用 Google Chrome、Safari、Mozilla Firefox、Microsoft Edge,在苹果设备上使用 Safari,在安卓设备上使用 Google Chrome 以获得对嵌入式认证器的最佳支持。
认证器。您应该使用以下两种类型的认证器
- 嵌入式认证器。如果您使用的是 Windows 10 版本 1903 或更高版本、Android Pie 或更高版本、macOS Big Sur 或更高版本、iOS/iPadOS 14 或更高版本且设备具有生物识别认证(指纹、红外摄像头面部扫描、TouchID 或 FaceID),则可以使用您的设备本身作为 WebAuthn 认证器。这些设备具有安全加密芯片、TPM 或 Secure Enclave,以及与 WebAuthn 一起使用的操作系统支持。
- 安全硬件连接线。这是针对较旧或较便宜的设备以及运行 Linux 和其他操作系统的设备的最佳解决方案。您可以使用任何支持 FIDO 或 FIDO2(后者更安全)的硬件连接线。您可以在本地和在线零售商处找到它们。它们的价格通常在 10 到 30 欧元之间。
每种类型的认证器都有其优缺点。嵌入式认证器没有额外的成本,因为它已嵌入到您的设备中。使用生物识别技术非常简单直观,可以减少登录时间。但是,如果您重新安装操作系统、重置您的设备或切换到不同的设备,您将失去对密钥的访问权限。当然,这也意味着如果您的设备丢失或被盗,远程擦除也将删除密钥。最后,您需要为每个浏览器和每个设备设置 WebAuthn – 即使是跨多个设备相同浏览器或同一设备上的不同浏览器。
另一方面,一个安全的硬件钥匙圈可以在所有浏览器和设备之间共享。您只需要设置一次。不过,并非所有设备都支持相同的接口。您的电脑可能有USB-A接口,手机可能是Lightning接口,平板可能是USB-C接口。有支持不同接口的端口转换钥匙圈和认证器,但这增加了复杂性和成本。此外,硬件钥匙圈需要通过物理方式与其交互来批准认证。这可能会很麻烦,取决于您的工作区域布局。如果您丢失了钥匙圈,它可以用来在支持它的所有网站上登录,除非您已经用PIN码保护了它。然而,如果您用PIN码保护了它,每次登录时都需要输入它,这变得和输入密码一样繁琐。
关于认证器,我的建议是尽可能使用嵌入式认证器。Windows 10、Android和iOS/iPadOS可以通过使用相同的指纹传感器或红外深度摄像头来扫描您的面部实现这一点,这些传感器或摄像头是您用来登录的。MacOS依赖于Touch ID传感器,如果您在合上盖子的模式下使用MacBook Pro,可能会觉得有点烦人。然而,从macOS Big Sur开始,只要您有Apple Watch并已将其配置为解锁您的电脑,您甚至不需要打开MacBook的盖子。登录到网站只需要在Apple Watch的侧面按钮上简单双击。话虽如此,我仍然建议使用带有PIN码保护的便宜安全硬件钥匙圈作为备份。把它放在安全的地方。如果您的所有设备都被重置/丢失/被盗,您至少还有一种可行的方法可以登录到您的网站,而不必求助于使用密码。
最后,有一个警告。WebAuthn密钥对绑定到您网站的确切域名,就像我之前解释的那样。这意味着,从WebAuthn的角度来看,www.example.com(前面有www)和example.com(前面没有www)被认为是不同的网站。我建议将非www域名重定向到www域名——或者反过来,根据您的喜好。否则,您会 wonder为什么WebAuthn不起作用,因为您永远不会想到去查看域名。相信我,我反复犯过这个错误。
实践中的WebAuthn
使用WebAuthn有两个部分:注册认证器和使用认证器。
第一部分是您如何告诉您的网站哪些设备或安全硬件钥匙圈可以信任以登录到网站。对于每个新网站和认证器,您只需要做一次。
后者是您将每天进行的操作:使用您的认证器登录而无需使用密码。
注册WebAuthn认证器
登录到您的网站后,转到您的Joomla用户资料并编辑它。在公共前端,通常在登录模块中有“资料”链接。在网站的管理员后端,您需要单击右上角的用户菜单图标,然后单击“编辑账户”。在两种情况下,您都会看到一个名为“W3C Web认证(WebAuthn登录)”的部分或标签页。
单击“添加新认证器”按钮。您的浏览器将要求您与您的认证器交互。移动设备将进一步询问您是否想使用内置的指纹/TouchID/FaceID或安全密钥。前者是设备中的嵌入式认证器。后者是您想使用安全硬件钥匙圈时的情况。选择对您有意义的选项,并按照屏幕上的说明激活认证器。
现在您会看到添加了一个名为“Authenticator added on 2020-11-25 10:26:02”类似的新认证器。如果您想,点击“编辑名称”按钮将其重命名为更描述性的名称,然后点击“保存”按钮。
就是这样!从现在起,您可以使用此认证器进行登录。
使用WebAuthn认证器登录
兼容Joomla 4的前端登录模块和后端登录页面显示“Web认证”按钮。首先输入您的用户名(但不要输入密码!),然后点击“Web认证”按钮。
您的浏览器将要求您选择并激活您的认证器。
完成上述操作后...您就登录了网站。就像魔法一样!
请注意,在这个时候,仍然需要输入您的用户名。有一种方法可以避免这种情况,但我们出于几个原因没有实现它。
- 只有一些认证器(那些实现较新的FIDO2协议的认证器)支持这一点。这将使WebAuthn仅限于更昂贵的硬件USB键和内置安全硬件的设备。
- 大多数外部硬件USB键只支持存储有限数量的网站用户名,通常在10到20个之间。这将限制您可以使用硬件USB键登录的网站数量。
- 除此之外,目前浏览器中没有用于管理存储在安全硬件USB键中的用户名的界面。这将在将您的安全硬件USB键与非常有限的网站关联后使其变得无用。
这些限制在很大程度上是成长中的问题。WebAuthn仅在2019年3月成为网络标准。它仍然是一项非常新的技术。这些限制已经在浏览器和设备方面得到了解决,我预计到2022年中旬这些问题将得到解决。因此,我们可以有很大的可能性实现无需输入用户名的登录。我已经编写了相应的代码,但我不能将其贡献给Joomla,直到浏览器解决了这些问题。
获取认证器
如果您没有内置认证器的设备,您将需要一个外部安全硬件USB键。它们有不同的价格范围和能力。您可以在亚马逊或您最喜欢的本地市场上搜索“FIDO2安全密钥”。
我使用的是设备的内置认证器或Yubico的NFC安全密钥。后者并不便宜,但它是我在多台PC、Apple设备和Android设备上测试过的,给我带来问题最少的设备之一。如果您担心组织中的成本,您可以订购不同制造商的几把密钥,并使用您的用户可能使用到的设备、操作系统和浏览器进行测试,以便找到最适合您的最便宜的选项。
WebAuthn和共享登录信息
您不能使用WebAuthn共享登录信息,例如,为了故障排除而临时授予某人访问您网站的权利。您必须将物理安全密钥邮寄给他们,这既慢又不实用。
如果您担心第三方开发人员和顾问安全访问您的网站,您应遵循两步流程。首先要求他们在您的网站上创建一个账户,并要求他们启用该账户上的WebAuthn。当他们完成后,您可以更改他们的账户用户组,以授予他们完成工作所需级别的访问权限,例如,将他们分配到管理员或超级用户组。
进一步保障登录安全的方法
截至目前,Joomla无法完全摒弃密码。当前架构规定,即使为账户设置了WebAuthn,密码验证也始终启用。这可以通过插件来解决,我将来可能会编写这样一个插件。但就目前的情况而言,即使你在用户账户中使用WebAuthn,你仍然需要一个密码来允许完全访问而不需要通过WebAuthn。我建议使用密码管理器——即使是浏览器内含的那个——为你的用户账户设置一个非常长、随机的密码。使用至少32个字符,最好是64个字符。除了作为最后的手段,你不会用它来登录你的网站。将其设置得非常长,使得在攻击者意外获取你的数据库内容的情况下,猜测或破解都变得不切实际。
此外,使用多个WebAuthn验证器。理想情况下,其中一个应该是带PIN码保护的廉价硬件令牌。将其存放在安全的地方。不要随身携带。如果所有设备都重置了,而且你无法访问存储你的长密码的安全密码管理器,这将作为备份。这种情况虽然极不可能发生,但确实可能发生。例如,如果你的所有设备都由苹果公司制造,你的主要浏览器(其中存储密码)是Safari,那么你的所有验证器和密码都与你iCloud账户相关联。如果你意外或恶意地被锁定在这个账户之外,你将失去对网站的访问权。拥有一个备份验证器远比直接更改数据库内容以恢复对网站的访问权要轻松得多。
记住,链条的强度取决于最薄弱的环节。不要让不安全的密码、失去对设备的访问权或丢失硬件令牌成为你的致命弱点。
好的安全措施是你不需要思考的。
最后,让我们反思一下为什么WebAuthn对于互联网,特别是Joomla来说是一个积极的进步。
我喜欢汽车类比。我常说WebAuthn是计算机版的座椅安全带。使用几次后,它就会成为第二本能。你几乎不需要考虑它。它无处不在都一样工作。
与之相比,使用密码的“真正的安全杂技表演”。每次你登录到一个网站,都像是从守护桥梁的哥布林那里接受了侧任务:给我你的用户名和密码,使用密码管理器,解决这个CAPTCHA,去那里为我拿一个双因素认证码。每天登录十几个网站,你的理智会很快变得模糊。难怪人们会在可能的情况下走捷径。
简而言之,WebAuthn是好的安全措施,因为它你不需要思考。它是安全的,易于使用,在每一个网站上工作,并且消除了整个网站登录杂技表演。我不知道你,但我期待任何可以使我的生活变得更简单的事情,尤其是在经历了疯狂的2020年之后。
线上线下都要保持安全!
在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人意见或经验,可能并不与Joomla项目的官方立场一致。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务
评论 1
另一个精彩的贡献,非常感谢你提供的代码和详细的解释。