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 官方文档整理,更多技术细节请访问官方文档。*

评论

发表回复

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