为什么添加 Google 两步认证
OpenVPN 认证支持多种类型,授权可以从数据库、文本以及API接口获取,但都有一个问题就是密码都是唯一固定的,如果密码泄露会有很大安全风险,所以我们添加 Google 两步认证,实现如下授权,每次密码都不同。
用户名 | 密码 |
---|---|
admin | abcdef+(随机动态密码) |
目前我们授权是放在数据库授权表里如下:
id | name | pass | salt | |
---|---|---|---|---|
1 | admin | abcdef | admin@sinacloud.com | UWIUH5QW74LR5NDE |
2 | sina | 123456 | sina@sinacloud.com | JPNNZSTXIG7SLREK |
为了方便阅读,这里我们保存明文密码, 线上环境建议加密保存。
salt 由 pyotp.random_base32() 随机生成。
# 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
%
40
sinacloud.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() 对比校验。
auth.py
https://gist.github.com/selboo/9eb0d8b25cd71ea31c319b23ad94cd6e
转载请注明:爱开源 » OpenVPN 使用 Google 两步认证