最新消息:

OpenVPN 使用 Google 两步认证

OpenVPN admin 253浏览 0评论

为什么添加 Google 两步认证

OpenVPN 认证支持多种类型,授权可以从数据库、文本以及API接口获取,但都有一个问题就是密码都是唯一固定的,如果密码泄露会有很大安全风险,所以我们添加 Google 两步认证,实现如下授权,每次密码都不同。

用户名 密码
admin abcdef+(随机动态密码)

目前我们授权是放在数据库授权表里如下:

id name pass mail salt
1 admin abcdef admin@sinacloud.com UWIUH5QW74LR5NDE
2 sina 123456 sina@sinacloud.com JPNNZSTXIG7SLREK

为了方便阅读,这里我们保存明文密码, 线上环境建议加密保存。

salt 由 pyotp.random_base32() 随机生成。

安装 qrencode 和 pyotp

# yum install qrencode -y
# pip install pyotp

生成二维码

>>> import pyotp>>> salt ="UWIUH5QW74LR5NDE" 

# 参考授权表 id 1

>>> mail ="admin@sinacloud.com"
>>> m = pyotp.totp.TOTP(salt).provisioning_uri(mail)
>>>  print m
otpauth://totp/admin%40sinacloud.com?secret=UWIUH5QW74LR5NDE

记录下 m 值。

salt 随机数, 建议每个用户都不同。

# qrencode -o admin.png -t png -s 20 'otpauth://totp/admin%40sinacloud.com?secret=UWIUH5QW74LR5NDE'

生成 admin.png 二维码,

发给 admin@sinacloud.com 用户。

安装 Authenticator APP

  • IOS 搜索安装 Authenticator
  • Android 搜索安装 Google Authenticator

使用 App 扫描上方的二维码

校验

>>> import pyotp
>>> pyotp.TOTP('UWIUH5QW74LR5NDE').now()  # 参考授权表 id 1
u'467207'

在同一时间内,App 和服务器获取验证码相同,证明校验成功。

修改客户端 ovpn

auth-user-pass

添加 auth-user-pass 参数,使用用户名和密码校验。

修改服务端 OpenVPN 配置

reneg-sec 0
auth-user-pass-verify /root/auth.py via-file

reneg-sec 0
reneg-sec 设置为0,因为OpenVPN默认会每 3600 秒重新校验一次密码,3600秒之后 密码肯定已经变了,导致已连接用户连接断开。https://openvpn.net/index.php/open-source/documentation/manuals/69-openvpn-21.html。

auth-user-pass-verify /root/auth.py via-file
via-file 会把用户名和密码传给 /root/auth.py, auth.py 校验用户名和密码,校验密码的时候截取最后 6 位数字、动态密码, 6 位之前为静态密码。

用户名 密码
admin abcdef333059

1.以用户名 “admin” 查询静态密码和salt # 参考授权表 id 1

2.abcdef 跟静态密码对比校验。

3.333059 和 pyotp.TOTP(‘UWIUH5QW74LR5NDE’).now() 对比校验。

转载请注明:热门技术 » OpenVPN 使用 Google 两步认证

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址