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