camilord / twofactor_gauthenticator
此RoundCube插件在登录时增加了二步验证。它是从 https://github.com/alexandregz/twofactor_gauthenticator 分支出来的。
Requires
- php: >=5.3.0
- ext-openssl: *
This package is auto-updated.
Last update: 2024-09-11 21:04:49 UTC
README
需求
- Roundcube Webmail 1.5.x
变更日志
- 修复了使用bootstrap 4.5.x的UI
- 改进了UI表单功能
与 alexandregz/twofactor_gauthenticator
的功能差异
- “记住设备在几天内可以配置。之前是30天,现在是默认7天。30天太多了。”
- 当你启用配置
force_enrollment_users
来强制所有用户使用2FA时,我添加了一个选项来排除一些强制执行2FA的用户/域。 - 当你点击“激活”复选框时,将立即生成
密钥
和恢复码
- 你也可以重新生成
密钥
- 二维码始终显示
- 在测试你的应用程序中的代码时,将显示服务器时间。
- 设置 > 2FA表单 = 固定以在Roundcube Webmail v1.5.x中正常工作或显示良好
- 更简洁的代码,更好的缩进,使用PHPStorm重新格式化代码
如何安装此插件?
- 下载包并解压内容
- 应该有一个名为
twofactor_gauthenticator
的文件夹 - 将文件夹移动到roundube安装目标下的
plugins
文件夹:{ROUNDCUBE_INSTALL}/plugins/
- 然后定义你的配置,将
{ROUNDCUBE_INSTALL}/plugins/config.inc.php.dist
复制为{ROUNDCUBE_INSTALL}/plugins/config.inc.php
- 就这样。登录您的账户,进入配置,应该会出现“2因子认证”选项
- 在您的账户中激活2FA,填写表单,您就可以使用了。
注意
- 在保存生成的密钥之前,请确保您使用“在此测试生成的PIN”进行了测试
- 如果您一直得到“错误代码”,这意味着您的PC时间和服务器时间不同。
两步验证
此RoundCube插件将两步验证(OTP)添加到登录过程中。
它与所有TOTP应用程序兼容 RFC 6238
部分代码由:Ricardo Signes Justin Buchanan Ricardo Iván Vieitez Parra 提供
GoogleAuthenticator类 由Michael Kliewe(查看密钥)
qrcode.js 由ShimSangmin
还要感谢 Victor R. Rodriguez Dominguez 提供了一些想法和支持
安装
- 从github克隆:HOME_RC/plugins$ git clone https://github.com/alexandregz/twofactor_gauthenticator.git
(或使用composer HOME_RC$ composer require alexandregz/twofactor_gauthenticator:dev-master
注意:当composer询问插件激活时,请回答 N)
- 在HOME_RC/config/config.inc.php中激活插件:$config['plugins'] = array('twofactor_gauthenticator');
配置
转到设置任务,在“2步骤谷歌验证”菜单中,点击“设置所有字段(需要保存)”。
插件会自动为您创建密钥。
注意:插件必须是base32有效字符([A-Z][2-7]),请参阅 https://github.com/alexandregz/twofactor_gauthenticator/blob/master/PHPGangsta/GoogleAuthenticator.php#L18
要将账户添加到应用程序中,您可以使用二维码(简便方法)或输入密钥。检查第一个代码后点击“保存”。
此外,您还可以添加“恢复代码”,用于一次性使用(使用后将被删除)。恢复代码是可选的,因此可以留空。
注册用户
如果配置值 force_enrollment_users 为 true,则所有用户都需要使用两步验证方法登录。他们会收到关于此的警告消息,并且不能跳过而未保存配置。
同一字段
如果配置值 2step_codes_on_login_form 为 true,则两步验证代码(和恢复代码)必须与密码值一起发送,从登录屏幕附加:普通代码紧随密码(passswordCODE),恢复代码在两个竖线之后(passsword||RECOVERYCODE)
实际上只适用于同一字段分支
代码
代码有2*30秒的时间容差,就像默认的Google应用一样(可能在未来的版本中可编辑)
许可协议
MIT,请参阅许可协议
注意事项
已与RoundCube 0.9.5和Google应用进行测试。还与Roundcube 1.0.4进行了测试
请记住,同步时间对于TOTP至关重要:“为此要正常工作,用户的设备时钟和服务器时钟需要大致同步(服务器通常接受由客户端时间戳生成的、与客户端时间戳相差±1的一次性密码)”(来自 http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm)
作者
Alexandre Espinosa Menor aemenor@gmail.com
问题
使用github打开问题,请不要将电子邮件发送给我,请 -通常Gmail将此类消息标记为垃圾邮件
测试
- Vagrant: https://github.com/alexandregz/vagrant-twofactor_gauthenticator
- Docker: https://hub.docker.com/r/alexandregz/twofactor_gauthenticator/
与Kolab一起使用
在public_html/assets目录中添加一个符号链接
显示由 alexandregz#29(评论) 提供的说明 https://github.com/d7415
客户端实现
您可以使用各种 OTP客户端 -通过 https://github.com/helmo 链接
日志
由 simon@magrin.com 建议
要记录错误代码的错误,将 $_enable_logs 变量更改为 true。
日志存储到文件 HOME_RC/logs/log_errors_2FA.txt 中 -必须创建目录
白名单
您可以在配置文件中定义白名单IP(请参阅 config.inc.php.dist),以实现自动登录 -插件不会要求您输入代码
卸载
要停用插件,您可以使用两种方法
-
仅针对一个用户:将数据库中的用户首选项恢复为null(rouncubeDB.users.preferences) -用户插件选项存储在这里。
-
针对所有用户:从 config.inc.php 中删除插件/删除插件本身
仅针对特定用户激活
-
使用 config.inc.php 文件(请参阅 config.inc.php.dist 示例文件)
-
修改数组 users_allowed_2FA,其中包含您想要使用插件的用户。注意:您可以使用正则表达式
用于1.3.x版本
使用 1.3.9版本 分支
$ git checkout 1.3.9-version
如果您下载了1.4.x RC版本(带有 弹性皮肤),则通常使用 master 版本(感谢 tborgans)
2022-04-02的安全事件
报告者:kototilt@haiiro.dev(感谢报告和PoC脚本)
我在脚本上进行了一些修改,不允许在不使用从渲染页面生成的参数会话的情况下保存配置,以强制用户输入之前的2FA代码并导航到网站。
注意:我还检查了用户是否启用了2FA,因为只有第一个条件——检查会话——应用程序在激活2FA之前就将我踢出。
twofactor_gauthenticator_save()
在函数 twofactor_gauthenticator_save()
中,我添加了以下代码
// save config function twofactor_gauthenticator_save() { $rcmail = rcmail::get_instance(); // 2022-04-03: Corrected security incidente reported by kototilt@haiiro.dev // "2FA in twofactor_gauthenticator can be bypassed allowing an attacker to disable 2FA or change the TOTP secret." // // Solution: if user don't have session created by any rendered page, we kick out $config_2FA = self::__get2FAconfig(); if(!$_SESSION['twofactor_gauthenticator_2FA_login'] && $config_2FA['activate']) { $this->__exitSession(); }
想法是从渲染的页面创建一个会话变量,该页面通过 __goingRoundcubeTask
函数(指向 roundcube任务
的重定向器)重定向
使用PoC Python脚本进行测试
之前,安全受到威胁
alex@vosjod:~/Desktop/report$ ./poc.py Password:xxxxxxxx 1. Fetching login page (https://:8888/roundcubemail-1.4.8) 2. Logging in POST https://:8888/roundcubemail-1.4.8/?_task=login 3. Disabling 2FA POST https://:8888/roundcubemail-1.4.8/?_task=settings&_action=plugin.twofactor_gauthenticator-save POST returned task "settings" 2FA disabled!
修改了代码并再次测试,不允许在不访问RC任务(带有2FA身份验证)的情况下禁用/修改
alex@vosjod:~/Desktop/report$ ./poc.py Password:xxxxxxxxx 1. Fetching login page (https://:8888/roundcubemail-1.4.8) 2. Logging in POST https://:8888/roundcubemail-1.4.8/?_task=login 3. Disabling 2FA POST https://:8888/roundcubemail-1.4.8/?_task=settings&_action=plugin.twofactor_gauthenticator-save POST returned task "login" Expected "settings" task, something went wrong