安全架构概述
Pritunl 的安全架构设计遵循深度防御原则,提供多层次的安全保护。本文将详细介绍 Pritunl 的核心安全功能及配置方法。
动态防火墙
工作原理
动态防火墙是 Pritunl 提供的最高安全级别功能。启用后,VPN 端口将不会对互联网开放,Pritunl 使用 iptables 阻止对该端口的访问。
连接流程:
- 客户端首先与 Pritunl Web 服务器进行认证
- 认证通过后,服务器为客户端 IP 动态开放 VPN 端口
- 客户端连接 VPN
- 连接建立后,端口再次关闭
安全优势
- 端口隐藏:VPN 端口对未认证用户完全不可见
- IP 白名单:仅允许已认证客户端 IP 访问
- 防扫描:无法通过端口扫描发现 VPN 服务
- 防暴力破解:未认证用户无法尝试连接
多层加密认证
动态防火墙使用三层加密认证:
1. SHA512-HMAC 密钥(授权)
`bash
# 客户端使用 SHA512-HMAC 密钥对连接请求签名
# 服务器验证签名并返回加密响应
`
2. NaCl 非对称密钥(授权 + 加密)
`bash
# 使用 NaCl 公钥加密客户端到服务器的通信
# 服务器使用客户端公钥加密响应
`
3. RSA-4096 非对称密钥(授权)
`bash
# 使用 RSA 证书验证客户端身份
# 与 OpenVPN 连接验证相同的证书
`
启用动态防火墙
前置条件:需要企业订阅
配置步骤:
- 登录 Web 控制台
- 进入服务器设置
- 启用 *Dynamic Client Firewall* 选项
- 重启服务器
注意事项:
- 仅支持 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
设备认证
工作原理
设备认证提供最高级别的连接安全保障:
- 用户配置 VPN profile
- 设备尝试连接
- 服务器提示设备批准
- 管理员或用户批准设备
- 设备获得连接权限
安全优势
- 防钓鱼:即使 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 | 设备认证 | ⭐⭐⭐⭐⭐ |
|---|---|---|
| 设备认证 | ⭐⭐⭐⭐⭐ | |
| Okta | 设备认证 | ⭐⭐⭐⭐⭐ |
| Azure | Duo Security | ⭐⭐⭐⭐ |
| 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:
- 获取 Yubico API 密钥
- 在设置中配置 API 密钥
- 管理员配置 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
`
解决:
- 使用推荐发行版
- 确保 SELinux 处于 enforcing 模式
- 检查策略是否正确加载
Q2: 动态防火墙不工作
检查:
- 确认企业订阅有效
- 检查 iptables 规则
- 验证客户端版本
Q3: MongoDB 连接不安全
解决:
- 启用用户认证
- 限制绑定地址
- 配置 SSL(如需要)
- 使用防火墙限制访问
下一篇预告
第三篇: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 官方文档整理,更多技术细节请访问官方文档。*
发表回复