openvpn

openvpn

Compile

apt-get install unzip liblz4-dev libtool build-essential libssl-dev liblzo2-dev libpam-dev net-tools

unzip openvpn-2.4.10.zip
cd openvpn-2.4.10
autoreconf -i -v -f
./configure --enable-systemd
make
make install

编辑成果:

./src/openvpn/openvpn
./src/plugins/auth-pam/.libs/openvpn-plugin-auth-pam.so
./src/plugins/down-root/.libs/openvpn-plugin-down-root.so

pam + LDAP + OTP 认证

OTP 使用 Google Authenticator。以下为服务器端配置,测试环境是 Ubuntu 20.04。

/etc/openvpn/openvpn.conf

plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD pin OTP"
verify-client-cert none

# Debug
#log-append /tmp/openvpn.log
#verb 10

注:

  • CentOS yum 安装的 openvpn 的 pam.so 位置是 /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so 。

OpenVPN 客户端需要加上 static-challenge 配置项:

static-challenge "Enter 2-factor authentication Code: " 1

/etc/pam.d/openvpn

auth required pam_ldap.so debug
auth required pam_google_authenticator.so secret=/etc/openvpn/otp/${USER}.google_authenticator user=root nullok authtok_prompt=pin debug

auth sufficient pam_permit.so debug
session sufficient pam_permit.so
account sufficient pam_permit.so

注:

  • 必须要有 session 和 account 段。仅仅 auth 是不够的。

安装 LDAP / google authenticator

# nslcd 是 pam_ldap.so 使用的后端,用来与 LDAP 服务器通信
apt install -y vim nslcd libpam-google-authenticator

LDAP 配置 /etc/nslcd.conf

log /tmp/nslcd.log debug

# LDAP 服务器地址等配置
# ...

Debug:

  • pam 日志: /var/log/syslog 或 /var/log/auth.log (根据系统 systemd 的 syslog 配置)
  • LDAP 原始查询日志: 在 /etc/nslcd.conf 里的 log 配置项
  • OpenVPN 日志:verb >=7 会记录 pam 认证相关日志

已知问题:

CentOS 7 / Ubuntu 20.04 官方源的 openvpn 包自带的 openvpn-plugin-auth-pam.so 不支持 static-challenge 协议,表现为只要 OpenVPN 客户端开启了 static-challenge,OpenVPN 连接时总是会认证失败。解决方法是自己编辑 openvpn。(2021-03 测试)(参考)

相关文档和链接:

生成用户 OTP 密钥

add-otp-user

#!/bin/bash

#
# Generate OpenVPN users via google authenticator
#

if [ -z $1 ]; then
    echo "Usage: add_otp_user USERNAME"
    exit 1
fi


# Ensure the otp folder is present
[ -d /etc/openvpn/otp ] || mkdir -p /etc/openvpn/otp

google-authenticator \
                     --time-based \
                     --disallow-reuse \
                     --force \
                     --rate-limit=3 \
                     --rate-time=30 \
                     --window-size=3 \
                     -l "${1}@${OVPN_SERVER_CN}" \
                     -s /etc/openvpn/otp/${1}.google_authenticator

Last update: 2021-03-24 07:39:08 UTC