最新消息:

OpenVPN 使用 Google 两步认证

OpenVPN admin 16937浏览 7评论

为什么添加 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() 对比校验。

auth.py

https://gist.github.com/selboo/9eb0d8b25cd71ea31c319b23ad94cd6e

auth.py

转载请注明:爱开源 » OpenVPN 使用 Google 两步认证

您必须 登录 才能发表评论!

网友最新评论 (7)

  1. Ok, Err = Goog_Check(Salt, Code) 这行代码参数写反了
    heloworld4年前 (2020-12-28)
    • 感谢 https://gist.github.com/selboo/9eb0d8b25cd71ea31c319b23ad94cd6e
      admin4年前 (2021-01-01)
  2. def Read_File(oFile): 这个函数接收的文件是从哪里来的呢,是openvpn传过来的吗
    abc4年前 (2020-12-27)
    • 是的 openvpn 传过来的 auth-user-pass-verify /root/auth.py via-file https://openvpn.net/community-resources/reference-manual-for-openvpn-2-0/
      admin4年前 (2021-01-01)
  3. 您好,您的服务器是用的什么系统啊?是乌班图嘛?
    jeff4年前 (2020-06-27)
    • 文章使用的是 redhat 发行版 只要安装 openvpn 服务端都可以
      admin4年前 (2020-07-01)
  4. 楼主, auth.py 这个文件能否贴一下啊, 默认自带的checkpsw.sh, 想截取google otp总是不行, 打印出来的${password}是密文, 这个scripts 的原理是什么呢? thx
    arnolix6年前 (2019-02-20)