OpenVPN 高级管理

重点:

一键安装 OpenVPN 脚本

后续管理:证书吊销。给新用户颁发证书

关系型数据库相关概念

三个范式

1)OpenVPN 高级管理

本节介绍 OpenVPN 的高级功能,主要关于安全加强及客户端的管理功能,比如:员工入职、离职涉及到的创建账户与吊销账户证书。

1.1)启用 安全增强 功能

启用防止 DOS 攻击的 安全增强配置

// 生成 ta.key ( "安全增强配置" )

[root@open-server ~] openvpn --genkey --secret /etc/openvpn/certs/ta.key

[root@open-server ~] cat /etc/openvpn/certs/ta.key

[root@open-server ~] ll /etc/openvpn/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            # 生成该文件



// "添加 openvpn-server.conf 配置"

[root@open-server ~] vim /etc/openvpn/server.conf

# tls-auth ta.key 0 # This file is secret

tls-auth /etc/openvpn/certs/ta.key 0          # 客户端配置 1, 服务器端配置 0



// 重启 openvpn 服务

[root@open-server ~] systemctl restart openvpn@server.service



// 查看日志提示报错

[root@open-server ~] tail -n 20 /var/log/openvpn/openvpn.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/openvpn/certs/ta.key

修改客户端配置文件 client.ovpn,添加一行

tls-auth ta.key 1   # 客户端配置 1, 服务器端配置 0

客户端重新连接成功

1.2)设置 客户端私钥密码 增强安全性

新建一个账户 magedu,并且 设置证书密码提高证书及登录 VPN 的安全性。

如果不设置密码,谁拿到 用户证书与配置文件 都可以使用 OpenVPN 工具连接到生产环境

1.2.1)创建新用户,生成对应的有密码的私钥和证书申请

[root@open-server 3] cd /etc/openvpn/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/openvpn/easy-rsa-server/3



[root@open-server 3] ./easyrsa import-req /etc/openvpn/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/openvpn/client/magedu



// "将用户的证书相关文件 放在指定的目录 中"

[root@open-server ~] cp /etc/openvpn/easy-rsa-server/3/pki/issued/magedu.crt /etc/openvpn/client/magedu

[root@open-server ~] cp /etc/openvpn/easy-rsa-client/3/pki/private/magedu.key /etc/openvpn/client/magedu

[root@open-server ~] cp /etc/openvpn/certs/{ca.crt,ta.key} /etc/openvpn/client/magedu/

[root@open-server ~] cp /etc/openvpn/client/wangxiaochun/client.ovpn /etc/openvpn/client/magedu/



// "验证"

[root@open-server ~] ll /etc/openvpn/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.ovpn

-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/openvpn/client/magedu/

// 根据服务器端修改下面配置, 需要和服务器同步

[root@open-server magedu] vim client.ovpn

[root@open-server magedu] cat client.ovpn

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/openvpn/openvpn.log

1.3)账户证书管理

对新员工的入职和老员工的离职,会涉及到 证书的创建和吊销

1.3.1)证书自动过期

前面颁发的证书都有一定的有效期,过期后 就需要重新颁发新证书

// "过期时间" 由以下设置决定

[root@open-server ~] grep EASYRSA_CERT_EXPIRE /etc/openvpn/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/openvpn/openvpn.log -f



// "恢复时间"

[root@open-server ~] clock -s

1.3.2)证书手动注销

1.3.2.1)查看当前证书的有效性

// 证书有效为 V, 无效为 R

[root@open-server ~] cat /etc/openvpn/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/openvpn/easy-rsa-server/3

[root@open-server 3] ./easyrsa revoke magedu

yes



// 查看当前证书的有效性, "有效为 V, 无效为 R"

[root@open-server 3] cat /etc/openvpn/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/openvpn/server.conf

crl-verify /etc/openvpn/easy-rsa-server/3/pki/crl.pem



// 注: 每次吊销证书后, "都需重新启动才能生效"

[root@open-server 3] systemctl restart openvpn@server.service

1.3.2.5)再次测试连接失败

用户端再次连接失败

// "观察 OpenVPN 日志"

[root@open-server 3] tail -f /var/log/openvpn/openvpn.log -n0

1.3.3)账户重名证书颁发

假如公司已有员工叫 magedu 已经离职,且证书已被吊销,现在又新来一个员工仍叫 magedu,那么一般的区分办法是在用户名后面加数字,如:magedu1、magedu2 等,假如还想使用 magedu 这个账户名签发证书的话,那么需要删除服务器之前 magedu 的账户,并删除签发记录和证书,否则新用户的证书无法导入,并重新颁发证书。

对于员工重名的情况,可以为新员工指定新的名称,或者删除不再使用的重名用户证书,重新创建新证书。

1.3.3.1)手动重新颁发证书

// "删除已被吊销的账户证书"

[root@open-server ~] cd /etc/openvpn/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/openvpn/client/magedu/*

[root@open-server 3] rm -rf /etc/openvpn/easy-rsa-server/3/pki/reqs/magedu.req

[root@open-server 3] rm -rf /etc/openvpn/easy-rsa-server/3/pki/issued/magedu.crt



// "删除之前的带 R 的吊销记录"

[root@open-server 3] vim /etc/openvpn/easy-rsa-server/3/pki/index.txt



// "重新生成新的账户证书申请和私钥"

[root@open-server 3] cd /etc/openvpn//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/openvpn/easy-rsa-server/3

[root@open-server 3] ./easyrsa import-req /etc/openvpn/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/openvpn/easy-rsa-server/3/pki/issued/magedu.crt /etc/openvpn/client/magedu/

[root@open-server 3] cp /etc/openvpn/easy-rsa-client/3/pki/private/magedu.key /etc/openvpn/client/magedu/

[root@open-server 3] cp /etc/openvpn/certs/{ca.crt,ta.key} /etc/openvpn/client/magedu/

[root@open-server 3] cp /etc/openvpn/client/wangxiaochun/client.ovpn /etc/openvpn/client/magedu/



// "修改客户端配置文件"

// 注意: 参考现有用户在使用的客户端配置文件    ( "重要" )

// C:\Program Files\OpenVPN\config\client.ovpn

[root@open-server 3] vim /etc/openvpn/client/magedu/client.ovpn

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/openvpn/client/magedu

/etc/openvpn/client/magedu

├── ca.crt

├── client.ovpn

├── dh.pem

├── magedu.crt

├── magedu.key

└── ta.key



// 将 /etc/openvpn/client/magedu "所有文件打包"传到客户端使用

[root@open-server ~] cd /etc/openvpn/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 openvpn-user-crt.sh

#!/bin/bash

. /etc/init.d/functions



OPENVPN_SERVER=39.100.145.14

PASS=123456





remove_cert () {

    rm -rf /etc/openvpn/client/${NAME}

    find /etc/openvpn/ -name "$NAME.*" -delete

}



create_cert () {

    cd /etc/openvpn/easy-rsa-client/3

    ./easyrsa  gen-req ${NAME} nopass <<EOF



EOF



    cd /etc/openvpn/easy-rsa-server/3

    ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/${NAME}.req ${NAME}





    ./easyrsa sign client ${NAME} <<EOF

yes

EOF



    mkdir  /etc/openvpn/client/${NAME}

    cp /etc/openvpn/easy-rsa-server/3/pki/issued/${NAME}.crt /etc/openvpn/client/${NAME}

    cp /etc/openvpn/easy-rsa-client/3/pki/private/${NAME}.key  /etc/openvpn/client/${NAME}

    cp /etc/openvpn/certs/{ca.crt,dh.pem,ta.key} /etc/openvpn/client/${NAME}

    cat >  /etc/openvpn/client/${NAME}/client.ovpn <<EOF

client

dev tun

proto tcp

remote $OPENVPN_SERVER 1194

resolv-retry infinite

nobind

#persist-key

#persist-tun

ca ca.crt

cert $NAME.crt

key $NAME.key

remote-cert-tls server

tls-auth ta.key 1

cipher AES-256-CBC

verb 3

compress lz4-v2

EOF



    echo "证书存放路径:/etc/openvpn/client/${NAME},证书文件如下:"

    echo -e "\E[1;32m******************************************************************\E[0m"

    ls -l /etc/openvpn/client/${NAME}

    echo -e "\E[1;32m******************************************************************\E[0m"

    cd /etc/openvpn/client/${NAME}

    zip -qP "$PASS" /root/${NAME}.zip *

    action  "证书的打包文件已生成: /root/${NAME}.zip"

}





read -p "请输入用户的姓名拼音(如:wangxiaochun): " NAME



remove_cert

create_cert

1.3.3.2.2)执行脚本

[root@open-server ~] bash openvpn-user-crt.sh

请输入用户的姓名拼音(如:): testuser

1.3.3.3)在 Windows 客户端用新证书连接登录

1.4)实现 用户密码 认证

基于证书验证的基础上 再加上用户名密码验证 可以实现更高的安全性

1.4.1)修改服务端配置

"修改 OpenVPN 服务端配置"

[root@open-server ~] vim /etc/openvpn/server.conf

# 添加三行, 实现服务端支持密码认证方式

script-security 3       # 允许使用自定义脚本

auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env # 指定自定义脚本路径

username-as-common-name # 开启用户密码验证

1.4.2)创建自定义脚本

官方脚本下载

http://openvpn.se/files/other/checkpsw.sh

[root@open-server ~] vim /etc/openvpn/checkpsw.sh

#!/bin/sh

###########################################################

# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>

#

# 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/openvpn/psw-file"

LOG_FILE="/var/log/openvpn-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/openvpn/checkpsw.sh

1.4.3)创建用户密码文件

# 创建用户和密码认证文件, 每行是一个用户和密码

[root@open-server ~] cat > /etc/openvpn/psw-file <<EOF

test 123456

test2 654321

EOF



[root@open-server ~] systemctl restart openvpn@server

1.4.4)修改客户端配置

修改客户端配置文件 client.ovpn 文件

增加下面一行,使其 支持用户名/密码 与服务器进行身份验证。

[root@open-server ~] vim /etc/openvpn/client/wangxiaochun/client.ovpn

# 加下面一行, 可以支持用户密码认证

auth-user-pass

1.4.5)客户端连接验证

客户端基于证书验证的基础上再加上用户名密码验证

1.5)生产环境推荐配置文件

Server 端和 Client 端的生产推荐配置文件分别如下

1.5.1)Server 端配置

[root@open-server ~] grep '^[^#;]' /etc/openvpn/server.conf

port 1194

proto tcp

dev tun

ca /etc/openvpn/certs/ca.crt

cert /etc/openvpn/certs/server.crt

key /etc/openvpn/certs/server.key  # This file should be kept secret

dh /etc/openvpn/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/openvpn/certs/ta.key 0

cipher AES-256-CBC

compress lz4-v2

push "compress lz4-v2"

max-clients 2048

user openvpn

group openvpn

status /var/log/openvpn/openvpn-status.log

log-append /var/log/openvpn/openvpn.log

verb 3

mute 200

crl-verify /etc/openvpn/easy-rsa-server/3/pki/crl.pem

1.5.2)Client 端配置

[root@open-server ~] cat /etc/openvpn/client/wangxiaochun/client.ovpn

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

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Toasten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值