H2 数据库 - 仅供测试,禁止生产环境使用
⚠️ 严重安全警告:H2 数据库不适合生产环境。它仅供本地测试和开发使用。在生产环境中使用 H2 会使您的服务器面临严重的安全漏洞。在使用 H2 之前,请仔细阅读本页面。
🔴 安全风险 - 使用前必读
什么是 H2 数据库?
H2 是一个开源的 Java SQL 数据库。HertzBeat 内置 H2 作为默认嵌入式数据库,以便在无需单独安装数据库的情况下快速进行测试和评估。
为什么 H2 在生产环境中危险
H2 拥有一个叫做 CREATE ALIAS 的内置功能,允许在数据库查询中执行任意 Java 代码。这意味着:
-- 极其危险的 H2 功能示例:
CREATE ALIAS EXEC AS $$
String exec(String cmd) throws Exception {
Runtime.getRuntime().exec(cmd);
return null;
}
$$;
-- 可以在服务器上执行 Shell 命令:
CALL EXEC('rm -rf /重要数据');
如果您的 H2 数据库被恶意用户访问,他们可以:
- 在 HertzBeat 服务器上执行任意 Shell 命令
- 读取 HertzBeat 进程可访问的任何文件
- 完全控制运行 HertzBeat 的服务器
- 访问所有监控数据,包 括敏感凭据
📖 详细信息请参阅官方 H2 安全文档。
网络暴露风险
H2 可以以服务器模式运行,可能在网络上暴露数据库管理界面。默认情况下,H2 使用端口 8082(Web 控制台)和 9092(TCP 服务器)。如果这些端口可以从外部访问,任何用户都可以直接连接到您的数据库。
✅ H2 适合的场景
- 本地开发:快速搭建评估 HertzBeat 功能
- 自动化测试:隔离环境中的 CI/CD 流水线
- 演示展示:向利益相关者展示 HertzBeat
- 学习了解:在生产部署前了解 HertzBeat
🚫 H2 不适合的场景
- 生产部署
- 多用户环境
- 含有敏感监控数据的系统
- 可从互联网访问的 HertzBeat 实例
- 需要跨重启数据持久化的环境
- 高可用性部署
🔒 迁移到生产数据库
对于生产使用,请迁移到以下支持的数据库之一:
MySQL / MariaDB(推荐用于大多数部署)
- 安装 MySQL 5.7+ 或 MariaDB 10.5+
- 创建专用数据库和用户:
CREATE DATABASE hertzbeat;
CREATE USER 'hertzbeat'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON hertzbeat.* TO 'hertzbeat'@'localhost';
FLUSH PRIVILEGES;
- 更新
application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/hertzbeat?useUnicode=true&characterEncoding=utf-8
username: hertzbeat
password: 强密码
driver-class-name: com.mysql.cj.jdbc.Driver
- 下载 MySQL JDBC 驱动并放入
ext-lib/ - 重启 HertzBeat
PostgreSQL(推荐用于企业部署)
- 安装 PostgreSQL 12+
- 创建数据库和用户:
CREATE USER hertzbeat WITH PASSWORD '强密码';
CREATE DATABASE hertzbeat OWNER hertzbeat;
GRANT ALL PRIVILEGES ON DATABASE hertzbeat TO hertzbeat;
- 更新
application.yml:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/hertzbeat
username: hertzbeat
password: 强密码
driver-class-name: org.postgresql.Driver
📋 生产部署前安全检查清单
在任何非测试环境中部署 HertzBeat 之前,请验证:
- H2 数据库已替换为 MySQL 或 PostgreSQL
- H2 Web 控制台已禁用
- 数据库凭据强大且唯一
- 数据库无法直接从互联网访问
- HertzBeat 通过带 SSL 的反向代理运行
- 监控凭据已加密且受访问控制保护
- 已配置定期数据库备份
记住:H2 的便利性是以安全为代价换来的。在任何实际环境中部署 HertzBeat 之前,请务必计划迁移到生产级数据库。