重点:
一键安装 OpenVPN 脚本
后续管理:证书吊销。给新用户颁发证书
关系型数据库相关概念
三个范式
1)OpenVPN 高级管理
本节介绍 OpenVPN 的高级功能,主要关于安全加强及客户端的管理功能,比如:员工入职、离职涉及到的创建账户与吊销账户证书。
1.1)启用 安全增强 功能
启用防止 DOS 攻击的 安全增强配置
// 生成 ta.key ( "安全增强配置" )
[root@open-server ~] open --genkey --secret /etc/open/certs/ta.key
[root@open-server ~] cat /etc/open/certs/ta.key
[root@open-server ~] ll /etc/open/certs
total 24
-rw------- 1 root root 1204 Aug 3 20:34 ca.crt
-rw------- 1 root root 424 Aug 3 20:35 dh.pem
-rw------- 1 root root 4608 Aug 3 20:34 server.crt
-rw------- 1 root root 1704 Aug 3 20:35 server.key
-rw------- 1 root root 636 Aug 4 15:53 ta.key # 生成该文件
// "添加 open-server.conf 配置"
[root@open-server ~] vim /etc/open/server.conf
# tls-auth ta.key 0 # This file is secret
tls-auth /etc/open/certs/ta.key 0 # 客户端配置 1, 服务器端配置 0
// 重启 open 服务
[root@open-server ~] systemctl restart [email protected]
// 查看日志提示报错
[root@open-server ~] tail -n 20 /var/log/open/open.log
Sun Dec 24 00:53:35 2023 TLS Error: cannot locate HMAC in incoming packet from [AF_INET]171.83.7.136:5712
Sun Dec 24 00:53:38 2023 TLS Error: cannot locate HMAC in incoming packet from [AF_INET]171.83.7.136:5712
客户端已经无法连接
我们将服务端 ta.key 传到客户端相关目录下
[root@open-server ~] sz /etc/open/certs/ta.key
修改客户端配置文件 client.o,添加一行
tls-auth ta.key 1 # 客户端配置 1, 服务器端配置 0
客户端重新连接成功
1.2)设置 客户端私钥密码 增强安全性
新建一个账户 magedu,并且 设置证书密码,提高证书及登录 VPN 的安全性。
如果不设置密码,谁拿到 用户证书与配置文件 都可以使用 OpenVPN 工具连接到生产环境
1.2.1)创建新用户,生成对应的有密码的私钥和证书申请
[root@open-server 3] cd /etc/open/easy-rsa-client/3
// "生成对应的有密码的私钥和证书申请"
[root@open-server 3] ./easyrsa gen-req magedu ( "不增加 nopass 选项" )
Enter PEM pass phrase: # 输入两遍密码
Verifying - Enter PEM pass phrase: # 输入两遍密码
Common Name (eg: your user, host, or server name) [magedu]: # 接受默认值, 直接回车
1.2.2)导入用户证书 申请并颁发证书
[root@open-server 3] cd /etc/open/easy-rsa-server/3
[root@open-server 3] ./easyrsa import-req /etc/open/easy-rsa-client/3/pki/reqs/magedu.req magedu
// 确保"证书有效期"是合理值
[root@open-server 3] grep EASYRSA_CERT_EXPIRE vars
set_var EASYRSA_CERT_EXPIRE 90
// 颁发证书
[root@open-server 3] ./easyrsa sign client magedu
Confirm request details: yes # 输入 yes
Certificate is to be certified until Mar 22 17:09:36 2024 GMT (90 days) # 有效期
1.2.3)将用户的证书相关文件 放在指定的目录 中
[root@open-server ~] mkdir /etc/open/client/magedu
// "将用户的证书相关文件 放在指定的目录 中"
[root@open-server ~] cp /etc/open/easy-rsa-server/3/pki/issued/magedu.crt /etc/open/client/magedu
[root@open-server ~] cp /etc/open/easy-rsa-client/3/pki/private/magedu.key /etc/open/client/magedu
[root@open-server ~] cp /etc/open/certs/{ca.crt,ta.key} /etc/open/client/magedu/
[root@open-server ~] cp /etc/open/client/wangxiaochun/client.o /etc/open/client/magedu/
// "验证"
[root@open-server ~] ll /etc/open/client/magedu/
total 24
-rw------- 1 root root 1204 Dec 24 01:12 ca.crt
-rw-r--r-- 1 root root 243 Dec 24 01:12 client.o
-rw------- 1 root root 4492 Dec 24 01:12 magedu.crt
-rw------- 1 root root 1854 Dec 24 01:12 magedu.key
-rw------- 1 root root 636 Dec 24 01:12 ta.key
[root@open-server ~] cd /etc/open/client/magedu/
// 根据服务器端修改下面配置, 需要和服务器同步
[root@open-server magedu] vim client.o
[root@open-server magedu] cat client.o
client
dev tap
proto udp
remote 39.100.147.82 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert magedu.crt # 注意修改
key magedu.key # 注意修改
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2
// "打包证书"
[root@open-server magedu] tar cf /root/magedu.tar ./*
[root@open-server magedu] sz /root/magedu.tar
1.2.4)将相关文件传给客户端主机相应目录
放置到 Windows 客户端的 C:\Program Files\OpenVPN\config 目录下
1.2.5)Windows 客户端 重新连接
需要输入 用户私钥密码 才可以进行连接
查看日志
[root@open-server ~] tail /var/log/open/open.log
1.3)账户证书管理
对新员工的入职和老员工的离职,会涉及到 证书的创建和吊销
1.3.1)证书自动过期
前面颁发的证书都有一定的有效期,过期后 就需要重新颁发新证书
// "过期时间" 由以下设置决定
[root@open-server ~] grep EASYRSA_CERT_EXPIRE /etc/open/easy-rsa-server/3/vars
set_var EASYRSA_CERT_EXPIRE 90
如果证书过期,在服务器端可以看到以下 日志
// 测试: 将服务器时间改为 2 年后时间
[root@open-server ~] date -s '2 year'
// 在服务器端日志中会显示用户证书过期
[root@open-server ~] tail -n0 /var/log/open/open.log -f
// "恢复时间"
[root@open-server ~] clock -s
1.3.2)证书手动注销
1.3.2.1)查看当前证书的有效性
// 证书有效为 V, 无效为 R
[root@open-server ~] cat /etc/open/easy-rsa-server/3/pki/index.txt
V 331220072305Z A3D7C296B478AC274ABC6A4DA5C03724 unknown /CN=server
V 240322083300Z A2375DB2C6F9E46CA36A42A9C2F7B355 unknown /CN=wangxiaochun
V 240322085217Z 7CA3A2DC6E0AB19BC20832D9C208CABF unknown /CN=wangj
V 240322085510Z 5B69E0DC04C16D877EBDC75F70A2D2FA unknown /CN=wangjun
V 240322085739Z 2EB217D663A268C7038D08EA6023BCFA unknown /CN=zhongst
V 240322170936Z 77B65551630285DDB34E07CE6A1C017B unknown /CN=magedu
1.3.2.2)吊销指定的用户的证书
revoke 吊销证书
// revoke "吊销证书"
[root@open-server ~] cd /etc/open/easy-rsa-server/3
[root@open-server 3] ./easyrsa revoke magedu
yes
// 查看当前证书的有效性, "有效为 V, 无效为 R"
[root@open-server 3] cat /etc/open/easy-rsa-server/3/pki/index.txt
V 331220072305Z A3D7C296B478AC274ABC6A4DA5C03724 unknown /CN=server
V 240322083300Z A2375DB2C6F9E46CA36A42A9C2F7B355 unknown /CN=wangxiaochun
V 240322085217Z 7CA3A2DC6E0AB19BC20832D9C208CABF unknown /CN=wangj
V 240322085510Z 5B69E0DC04C16D877EBDC75F70A2D2FA unknown /CN=wangjun
V 240322085739Z 2EB217D663A268C7038D08EA6023BCFA unknown /CN=zhongst
R 240322170936Z 231224151146Z 77B65551630285DDB34E07CE6A1C017B unknown /CN=magedu
// 但是断开客户端连接, "magedu 用户仍然能连接成功"
1.3.2.3)生成证书吊销列表
// 因为每次吊销证书后都需要 "更新证书吊销列表文件"
// 并需要重启 OpenVPN 服务
[root@open-server 3] ./easyrsa gen-crl "更新证书吊销列表文件"
// 查看 "吊销列表文件"
[root@open-server 3] cat pki/crl.pem
[root@open-server 3] sz pki/crl.pem
--- 省略 ---
# 传到 Windows 上, 修改文件后缀为 crl
# 双击就可以打开此文件, 看到下面显示信息
1.3.2.4)将吊销列表文件发布
// "第一次吊销证时"
// 需要在 OpenVPN 服务的编辑配置文件中(调用吊销证书的文件), "后续吊销无需此步"
[root@open-server 3.0.3] vim /etc/open/server.conf
crl-verify /etc/open/easy-rsa-server/3/pki/crl.pem
// 注: 每次吊销证书后, "都需重新启动才能生效"
[root@open-server 3] systemctl restart [email protected]
1.3.2.5)再次测试连接失败
用户端再次连接失败
// "观察 OpenVPN 日志"
[root@open-server 3] tail -f /var/log/open/open.log -n0
1.3.3)账户重名证书颁发
假如公司已有员工叫 magedu 已经离职,且证书已被吊销,现在又新来一个员工仍叫 magedu,那么一般的区分办法是在用户名后面加数字,如:magedu1、magedu2 等,假如还想使用 magedu 这个账户名签发证书的话,那么需要删除服务器之前 magedu 的账户,并删除签发记录和证书,否则新用户的证书无法导入,并重新颁发证书。
对于员工重名的情况,可以为新员工指定新的名称,或者删除不再使用的重名用户证书,重新创建新证书。
1.3.3.1)手动重新颁发证书
// "删除已被吊销的账户证书"
[root@open-server ~] cd /etc/open/easy-rsa-client/3/
[root@open-server 3] rm -rf pki/private/magedu.key
[root@open-server 3] rm -rf pki/reqs/magedu.req
[root@open-server 3] rm -rf /etc/open/client/magedu/*
[root@open-server 3] rm -rf /etc/open/easy-rsa-server/3/pki/reqs/magedu.req
[root@open-server 3] rm -rf /etc/open/easy-rsa-server/3/pki/issued/magedu.crt
// "删除之前的带 R 的吊销记录"
[root@open-server 3] vim /etc/open/easy-rsa-server/3/pki/index.txt
// "重新生成新的账户证书申请和私钥"
[root@open-server 3] cd /etc/open//easy-rsa-client/3
[root@open-server 3] ./easyrsa gen-req magedu
Enter PEM pass phrase: # 输入密码
Verifying - Enter PEM pass phrase: # 输入密码
Common Name (eg: your user, host, or server name) [magedu]: # 直接回车
// "CA 颁发证书"
[root@open-server 3] cd /etc/open/easy-rsa-server/3
[root@open-server 3] ./easyrsa import-req /etc/open/easy-rsa-client/3/pki/reqs/magedu.req magedu
[root@open-server 3] ./easyrsa sign client magedu
Confirm request details: yes # 输入 yes
// "生成相关文件"
[root@open-server 3] cp /etc/open/easy-rsa-server/3/pki/issued/magedu.crt /etc/open/client/magedu/
[root@open-server 3] cp /etc/open/easy-rsa-client/3/pki/private/magedu.key /etc/open/client/magedu/
[root@open-server 3] cp /etc/open/certs/{ca.crt,ta.key} /etc/open/client/magedu/
[root@open-server 3] cp /etc/open/client/wangxiaochun/client.o /etc/open/client/magedu/
// "修改客户端配置文件"
// 注意: 参考现有用户在使用的客户端配置文件 ( "重要" )
// C:\Program Files\OpenVPN\config\client.o
[root@open-server 3] vim /etc/open/client/magedu/client.o
client
dev tap
proto udp
remote 39.100.147.82 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert magedu.crt # 注意修改
key magedu.key # 注意修改
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2
// "验证"
[root@open-server ~] tree /etc/open/client/magedu
/etc/open/client/magedu
├── ca.crt
├── client.o
├── dh.pem
├── magedu.crt
├── magedu.key
└── ta.key
// 将 /etc/open/client/magedu "所有文件打包"传到客户端使用
[root@open-server ~] cd /etc/open/client/magedu
[root@open-server ~] tar cf /root/magedu.tar ./*
[root@open-server ~] sz /root/magedu.tar
1.3.3.2)自动化 证书颁发脚本
通过脚本实现自动化的证书颁发
1.3.3.2.1)脚本内容
注意:脚本内容 需要修改 公网 IP 地址 与 OpenVPN 客户端配置文件内容
[root@open-server ~] vim open-user-crt.sh
#!/bin/bash
. /etc/init.d/functions
OPENVPN_SERVER=39.100.145.14
PASS=123456
remove_cert () {
rm -rf /etc/open/client/${NAME}
find /etc/open/ -name "$NAME.*" -delete
}
create_cert () {
cd /etc/open/easy-rsa-client/3
./easyrsa gen-req ${NAME} nopass < /etc/open/client/${NAME}/client.o <
1.3.3.2.2)执行脚本
[root@open-server ~] bash open-user-crt.sh
请输入用户的姓名拼音(如:): testuser
1.3.3.3)在 Windows 客户端用新证书连接登录
1.4)实现 用户密码 认证
基于证书验证的基础上 再加上用户名密码验证 可以实现更高的安全性
1.4.1)修改服务端配置
"修改 OpenVPN 服务端配置"
[root@open-server ~] vim /etc/open/server.conf
# 添加三行, 实现服务端支持密码认证方式
script-security 3 # 允许使用自定义脚本
auth-user-pass-verify /etc/open/checkpsw.sh via-env # 指定自定义脚本路径
username-as-common-name # 开启用户密码验证
1.4.2)创建自定义脚本
官方脚本下载
http://open.se/files/other/checkpsw.sh
[root@open-server ~] vim /etc/open/checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/open/psw-file"
LOG_FILE="/var/log/open-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
# 增加执行权限
[root@open-server ~] chmod +x /etc/open/checkpsw.sh
1.4.3)创建用户密码文件
# 创建用户和密码认证文件, 每行是一个用户和密码
[root@open-server ~] cat > /etc/open/psw-file <
1.4.4)修改客户端配置
修改客户端配置文件 client.o 文件
增加下面一行,使其 支持用户名/密码 与服务器进行身份验证。
[root@open-server ~] vim /etc/open/client/wangxiaochun/client.o
# 加下面一行, 可以支持用户密码认证
auth-user-pass
1.4.5)客户端连接验证
客户端基于证书验证的基础上再加上用户名密码验证
1.5)生产环境推荐配置文件
Server 端和 Client 端的生产推荐配置文件分别如下
1.5.1)Server 端配置
[root@open-server ~] grep '^[^#;]' /etc/open/server.conf
port 1194
proto tcp
dev tun
ca /etc/open/certs/ca.crt
cert /etc/open/certs/server.crt
key /etc/open/certs/server.key # This file should be kept secret
dh /etc/open/certs/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.30.0.0 255.255.0.0"
keepalive 10 120
tls-auth /etc/open/certs/ta.key 0
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user open
group open
status /var/log/open/open-status.log
log-append /var/log/open/open.log
verb 3
mute 200
crl-verify /etc/open/easy-rsa-server/3/pki/crl.pem
1.5.2)Client 端配置
[root@open-server ~] cat /etc/open/client/wangxiaochun/client.o
client
dev tun
proto tcp
remote 10.0.0.8 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert magedu.crt
key magedu.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2