Pritunl VPN 企业级部署完全指南(二):安全功能详解

作者:

安全架构概述

Pritunl 的安全架构设计遵循深度防御原则,提供多层次的安全保护。本文将详细介绍 Pritunl 的核心安全功能及配置方法。

动态防火墙

工作原理

动态防火墙是 Pritunl 提供的最高安全级别功能。启用后,VPN 端口将不会对互联网开放,Pritunl 使用 iptables 阻止对该端口的访问。

连接流程

  1. 客户端首先与 Pritunl Web 服务器进行认证
  2. 认证通过后,服务器为客户端 IP 动态开放 VPN 端口
  3. 客户端连接 VPN
  4. 连接建立后,端口再次关闭

安全优势

  • 端口隐藏:VPN 端口对未认证用户完全不可见
  • IP 白名单:仅允许已认证客户端 IP 访问
  • 防扫描:无法通过端口扫描发现 VPN 服务
  • 防暴力破解:未认证用户无法尝试连接

多层加密认证

动态防火墙使用三层加密认证:

1. SHA512-HMAC 密钥(授权)

`bash

# 客户端使用 SHA512-HMAC 密钥对连接请求签名

# 服务器验证签名并返回加密响应

`

2. NaCl 非对称密钥(授权 + 加密)

`bash

# 使用 NaCl 公钥加密客户端到服务器的通信

# 服务器使用客户端公钥加密响应

`

3. RSA-4096 非对称密钥(授权)

`bash

# 使用 RSA 证书验证客户端身份

# 与 OpenVPN 连接验证相同的证书

`

启用动态防火墙

前置条件:需要企业订阅

配置步骤

  1. 登录 Web 控制台
  2. 进入服务器设置
  3. 启用 *Dynamic Client Firewall* 选项
  4. 重启服务器

注意事项

  • 仅支持 Pritunl 客户端(不支持其他 OpenVPN 客户端)
  • 目前不支持服务器链接
  • 需要配置外部防火墙控制 SSH 等端口

双 Web 服务器架构

架构设计

Pritunl 使用内部和外部两个 Web 服务器:

外部服务器(pritunl-web)

  • Golang 编写,安全性极高
  • 处理 SSL 和请求验证
  • 静态定义所有处理器和数据结构
  • 防止类型混淆攻击

内部服务器(pritunl)

  • Python 编写,仅绑定 127.0.0.1
  • 处理业务逻辑
  • 受 SELinux 策略保护

安全优势

  • RCE 防护:Golang 服务器隔离 Python 进程
  • 请求验证:所有请求在外部服务器验证后重新创建
  • 防走私攻击:干净的请求防止 HTTP 请求走私
  • SELinux 保护:两个进程都有独立的 SELinux 策略

启用 Systemd 隔离

进一步隔离 Web 服务器进程:

`bash

# 启用 systemd 隔离

sudo pritunl set app.web_systemd true

sudo systemctl restart pritunl

# 验证服务状态

sudo systemctl status pritunl-web

`

隔离特性

  • 以非 root 用户运行
  • ProtectSystem=full 保护文件系统
  • 独立的 systemd 服务单元

Web 服务器严格认证

Session Cookie 安全

Session cookie 包含 NaCl 签名的额外令牌:

`bash

# 外部服务器预认证管理员 API 请求

# 无有效签名的请求被直接阻止

# 减少内部进程的攻击面

`

配置方法

`bash

# 检查当前模式

sudo pritunl get app.web_auth_strict

# 如果使用 API 密钥,禁用以启用严格模式

sudo pritunl disable-admin-api

`

日志验证

`

[pritunl0][INFO] Starting server

web_auth_strict = true

`

自我关闭通知系统

工作原理

每小时,Pritunl 服务器向 https://app.pritunl.com/notification 发送版本信息。如果发现漏洞,服务器可返回三种关闭状态:

状态 影响 场景

|——|——|——|

www 阻止所有 Web 请求 紧急安全漏洞
web 停止 Web 服务器 Web 层漏洞
vpn 停止所有 VPN 服务器 VPN 协议漏洞

安全优势

  • 自动响应:无需人工干预
  • 快速保护:1 小时内所有服务器响应
  • 无需监控:自动发现并处理漏洞

OpenVPN 进程权限降级

配置方法

`bash

# 在 Web 控制台右上角设置中启用

# Drop OpenVPN Permissions 选项

`

安全优势

  • OpenVPN 以非 root 用户运行
  • 限制进程权限
  • 减少攻击影响

注意:某些 Linux 发行版可能不兼容,需先测试。

SELinux 策略

策略覆盖

Pritunl 包含完整的 SELinux 策略:

  • pritunl 进程:主服务进程
  • pritunl-web 进程:Web 服务器进程
  • pritunl-dns 进程:DNS 服务器进程

验证 SELinux 状态

`bash

# 检查 SELinux 上下文

sudo journalctl -u pritunl | grep selinux_context

# 应该看到

selinux_context = “system_u:system_r:pritunl_t:s0”

`

推荐发行版

  • AlmaLinux 9(首选)
  • Rocky Linux 9
  • RHEL 9

设备认证

工作原理

设备认证提供最高级别的连接安全保障:

  1. 用户配置 VPN profile
  2. 设备尝试连接
  3. 服务器提示设备批准
  4. 管理员或用户批准设备
  5. 设备获得连接权限

安全优势

  • 防钓鱼:即使 profile 被盗,设备仍需批准
  • 设备控制:管理员可管理所有设备
  • 审计追踪:记录所有设备连接尝试

启用方法

在服务器设置中启用 *Device Authentication* 选项。

MongoDB 安全加固

用户认证

1. 创建管理员用户

`javascript

// 连接 MongoDB

mongo –ssl –host 127.0.0.1

// 切换到 admin 数据库

use admin;

// 创建管理员用户

db.createUser({

user: “admin”,

pwd: “YOUR_SECURE_PASSWORD”,

roles: [{role: “root”}]

});

// 创建 pritunl 用户

db.createUser({

user: “pritunl”,

pwd: “YOUR_SECURE_PASSWORD”,

roles: [{role: “dbOwner”, db: “pritunl”}]

});

`

2. 启用认证

编辑 /etc/mongod.conf

`yaml

security:

authorization: enabled

`

重启 MongoDB:

`bash

sudo systemctl restart mongod

`

3. 更新 Pritunl 配置

MongoDB URI 格式:

`

mongodb://pritunl:PASSWORD@127.0.0.1:27017/pritunl?authSource=admin

`

SSL 加密(可选)

生成 SSL 证书

`bash

# 安装 certbot

sudo yum -y install certbot

# 获取证书(Route53 DNS 验证)

sudo certbot certonly –dns-route53

–dns-route53-propagation-seconds 30

-d your-mongodb-domain.com

`

配置 MongoDB SSL

编辑 /etc/mongod.conf

`yaml

net:

port: 27017

bindIp: 0.0.0.0

tls:

mode: requireTLS

certificateKeyFile: /etc/ssl/mongodb.pem

security:

authorization: enabled

`

自动续订脚本

`bash

#!/bin/sh

EMAIL=email@domain.com

DOMAIN=subnet.domain.com

CUR_HASH=$(md5sum /etc/letsencrypt/live/${DOMAIN}/fullchain.pem | cut -d ‘ ‘ -f 1)

/usr/bin/certbot certonly –dns-route53

–dns-route53-propagation-seconds 30

-d ${DOMAIN}

NEW_HASH=$(md5sum /etc/letsencrypt/live/${DOMAIN}/fullchain.pem | cut -d ‘ ‘ -f 1)

if [ “${CUR_HASH}” != “${NEW_HASH}” ]; then

cat /etc/letsencrypt/live/${DOMAIN}/privkey.pem

/etc/letsencrypt/live/${DOMAIN}/fullchain.pem > /etc/ssl/mongodb.pem

chown mongod:mongod /etc/ssl/mongodb.pem

chmod 600 /etc/ssl/mongodb.pem

systemctl restart mongod

fi

`

安全单点登录配置

推荐配置

SSO 提供商 辅助认证 安全级别

|————|———-|———-|

Azure 设备认证 ⭐⭐⭐⭐⭐
Google 设备认证 ⭐⭐⭐⭐⭐
Okta 设备认证 ⭐⭐⭐⭐⭐
Azure Duo Security ⭐⭐⭐⭐
Google Yubico ⭐⭐⭐⭐

不推荐的配置

  • Radius:易受钓鱼攻击,安全机制过时
  • 不支持 API 的 SAML:无法验证用户状态
  • 仅 Duo 认证:单一认证因素

认证缓存配置

Pritunl 认证缓存(推荐)

`bash

# 在 Web 控制台设置中

# 启用 Pritunl Authentication Cache

# 禁用 OpenVPN Authentication Cache

`

安全特性

  • 令牌仅存储在客户端内存中
  • 设备关闭后令牌失效
  • 仅兼容 Pritunl 客户端

不推荐:OpenVPN 认证缓存

  • 依赖 IP 地址,安全性低
  • 兼容所有客户端,但不安全

服务器安全设置

推荐配置

`bash

# DH 参数

sudo pritunl set app.dh_param_bits 2048

# 加密算法(AES 128bit GCM 性能更好)

sudo pritunl set app.encryption_cipher aes-128-gcm

# 哈希算法

sudo pritunl set app.hash_algorithm SHA-256

# 限制路由

sudo pritunl set app.restrict_routing true

`

避免路由 0.0.0.0/0

问题场景

`bash

# 所有流量通过 VPN 路由

# 可能暴露 AWS 元数据服务

curl http://169.254.169.254 # 返回敏感信息

`

正确做法

  • 仅路由必要的内网网段
  • 使用分割隧道(Split Tunneling)
  • 限制 VPN 用户访问范围

审计和监控

启用审计

`bash

# 在 Web 控制台设置中

# Auditing Mode: All

# 记录所有安全相关事件

`

监控配置

`bash

# Monitoring Mode: 用于服务器资源监控

# 与安全审计分开配置

`

管理员安全

YubiKey 配置

所有管理员应配置 YubiKey:

  1. 获取 Yubico API 密钥
  2. 在设置中配置 API 密钥
  3. 管理员配置 YubiKey

支持型号

  • YubiKey 4
  • YubiKey 5
  • YubiKey Bio 系列

注意:仅支持 Yubico OTP,不支持仅 FIDO 的 Security Key 系列。

安全加固检查清单

基础安全

  • [ ] 使用 AlmaLinux/Rocky Linux
  • [ ] 启用 SELinux
  • [ ] 配置 LetsEncrypt 证书
  • [ ] 修改默认端口
  • [ ] 启用严格认证

高级安全

  • [ ] 启用动态防火墙
  • [ ] 配置设备认证
  • [ ] 启用 Systemd 隔离
  • [ ] 降级 OpenVPN 权限
  • [ ] 限制 Profile 导入

数据库安全

  • [ ] 启用 MongoDB 认证
  • [ ] 配置 SSL(如需要)
  • [ ] 定期备份数据库
  • [ ] 限制数据库访问

SSO 安全

  • [ ] 使用安全的 SSO 配置
  • [ ] 启用多因素认证
  • [ ] 配置认证缓存
  • [ ] 定期审查用户权限

常见安全问题

Q1: SELinux 未生效

检查方法

`bash

sestatus

sudo journalctl -u pritunl | grep selinux_context

`

解决

  1. 使用推荐发行版
  2. 确保 SELinux 处于 enforcing 模式
  3. 检查策略是否正确加载

Q2: 动态防火墙不工作

检查

  • 确认企业订阅有效
  • 检查 iptables 规则
  • 验证客户端版本

Q3: MongoDB 连接不安全

解决

  1. 启用用户认证
  2. 限制绑定地址
  3. 配置 SSL(如需要)
  4. 使用防火墙限制访问

下一篇预告

第三篇:SSO 单点登录配置

将详细介绍:

  • Google Workspace SSO
  • Azure AD SSO
  • Okta SSO
  • OneLogin SSO
  • JumpCloud SSO
  • Active Directory SSO
  • Duo Security 集成
  • YubiKey 配置

相关资源

  • 官方文档:https://docs.pritunl.com/kb/vpn/security
  • SELinux 策略:https://github.com/pritunl/pritunl-selinux
  • 安全公告:https://app.pritunl.com/notification

*本文基于 Pritunl 官方文档整理,更多技术细节请访问官方文档。*

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注