Docker 搭建 2FA 双因素认证 Web 应用
共计 2226 个字符,预计需要花费 6 分钟才能阅读完成。
一、2FA 简介及原理
简介
现在越来越多的应用要求 2FA 验证,比如 github 登录和删除仓库等敏感操作,都需要二次身份认证。而 2FA 大部分是要求下载手机软件,但是有时手机不在身边,所以搭建一个 web 应用比较方便。
2FA 即双因素认证。一般来说,在大多数场景下都是使用帐号和密码来进行身份验证,而 2FA 就是除了建立帐号密码之外的第二个关卡。就算账号和密码不小心外泄了,也不至于账号马上被盗用。
2FA 又分为硬件型和软件型。像在 App Store 上购买 App 时需要指纹,或者网银转账时需要用到的 U 盾,只有通过那只随身携带在身上的硬件才能通过验证,这些都属于硬件型的 2FA。而 OTP(One Time Password) 就是软件型的 2FA 。像大部分 APP 在风险操作时都会要求你输入验证码、或者当你要从新电脑登陆时,也需要到手机查看验证码,当然这些都是免费的。
2FA 原理
1. 服务器生成密钥
在实施 TOTP(Time-based One-Time Password)的 2FA 中,首先,服务器生成一个包含密钥的 QR Code。用户使用身份验证应用(例如 Authy)扫描此 QR Code。解码 QR Code 后,用户的身份验证应用将保存服务器提供的秘密密钥。
举例来说,GitHub 会生成一个 QR Code,解码后的内容可能是 otpauth://totp/GitHub:LarryLuTW?secret=X5CTBOMEYE3TXIIS,其中 secret=X5CTBOMEYE3TXIIS 是 GitHub 希望传递给用户的秘密密钥。
2. 双方生成相同的 TOTP
用户的身份验证应用使用存储的密钥生成基于时间的一次性密码(TOTP)。这涉及将当前时间戳除以一个时间间隔(通常是 30 秒),然后将商的结果与密钥进行 HMAC 哈希。最后,取哈希的最后几位数字作为生成的 TOTP。
例如,如果当前时间的 UNIX 时间戳是 1692604605,密钥是 X5CTBOMEYE3TXIIS,而时间间隔是 30 秒,那么身份验证应用将这两个值输入 HMAC 哈希函数。结果的十进制表示中的最后几位数字,比如六位,就成为了 TOTP。在 30 秒内,TOTP 会不断变化。
GitHub 服务器也会使用相同的算法,根据存储的密钥和当前时间戳生成一个期望的 TOTP。
3. 用户输入 TOTP
用户在登录时,需要输入其身份验证应用生成的当前 TOTP。这个 TOTP 在不断变化,每 30 秒更新一次。GitHub 服务器也会计算预期的 TOTP。
4. 验证
GitHub 服务器比对用户输入的 TOTP 与其自己计算的 TOTP 是否匹配。如果匹配,说明用户成功通过了双因素认证,获得了访问权限。这样,即使密码泄露,攻击者也需要同时获取动态的 TOTP 才能登录。
二、2FAuth是什么
由于 2FA 工具大部分都需要安装在手机上,这时候就有一个同步的问题,比如手机没带,那么你就无法登录需要 2FA 验证的网站。此外,2FA 还有数据丢失的风险,如果只在手机上配置了网站的 2FA,手机如果丢失了,那么必然非常麻烦,因为你登录不上去,更别谈重置 2FA 了。
而 2FAuth 是一种基于 Web 的自托管替代方案,可替代 Google Authenticator 等一次性密码 (OTP) 生成器,专为移动设备和桌面设备设计。它能够通过 web 方式获取 OTP,并且将 2FA 帐户存储在一个独立的数据库中,利于数据的备份和恢复。
Github 地址:https://github.com/Bubka/2FAuth
三、搭建 2FAuth
因为直接运行 docker 命令文件夹会有权限问题,所以需要先创建目录。
mkdir -p /home/docker/2fauth/
chown 1000:1000 /home/docker/2fauth/
chmod 700 data
根据自己的需要修改如下 docker 命令,比如修改 APP_URL
、APP_KEY
等。
docker run -d \
--name 2fauth \
-p 30095:8000/tcp \
-v /home/docker/2fauth/:/2fauth \
-e APP_DEBUG=true \
-e APP_NAME=2FAuth \
-e APP_KEY=SomeRandomStringOf32CharsExactly \
-e APP_URL=http://2fauth.example.com \
-e IS_DEMO_APP=false \
-e LOG_CHANNEL=daily \
-e LOG_LEVEL=notice \
-e DB_DATABASE="/srv/database/database.sqlite" \
-e CACHE_DRIVER=file \
-e SESSION_DRIVER=file \
-e AUTHENTICATION_GUARD=web-guard \
--privileged=true \
2fauth/2fauth
四、使用
1. 注册用户
没有默认的用户和密码,第一次使用需要进行注册。
/>
2. 添加账户
接下来将看见如下界面,因此此时还没有添加账户。
/>
可以通过多种方式添加账户,但直接扫描 QR 码需要 https 协议才可以,毕竟这本身就是一个安全软件,如果密钥被别人 http 截取了那不是白瞎了二次认证。
3. 查看验证码
可以通过保存二维码的方式,上传进行注册账户,如下图我注册了一个腾讯云的账户。
/>
点击即可查看验证码。
/>
4. 编辑账户
注册账户后可以进行编辑账户,编辑名称、图片等。
/>
开源项目地址:https://github.com/Bubka/2FAuth
提醒:本文发布于318天前,文中所关联的信息可能已发生改变,请知悉!
Tips:清朝云网络工作室