camilord/twofactor_gauthenticator

此RoundCube插件在登录时增加了二步验证。它是从 https://github.com/alexandregz/twofactor_gauthenticator 分支出来的。

安装: 250

依赖项: 0

建议者: 0

安全: 0

星级: 18

关注者: 4

分支: 76

类型:roundcube-plugin

dev-master 2023-12-11 19:29 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,填写表单,您就可以使用了。

Login

2Steps

2Steps

注意

  • 在保存生成的密钥之前,请确保您使用“在此测试生成的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 提供了一些想法和支持

Login

2Steps

安装

(或使用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

来自 alexandregz#139

要将账户添加到应用程序中,您可以使用二维码(简便方法)或输入密钥。检查第一个代码后点击“保存”。

Settings by default

Settings OK

QR-Code example

此外,您还可以添加“恢复代码”,用于一次性使用(使用后将被删除)。恢复代码是可选的,因此可以留空。

Recovery codes

Check codes

Recovery codes

注册用户

如果配置值 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将此类消息标记为垃圾邮件

测试

与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

Elastic Skin start

Elastic Skin config

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