
isms-builder v1.37.2
自托管的信息安全管理体系 — ISO 27001、NIS2、GDPR/DSGVO、BSI IT-Grundschutz

ISMS Builder
自托管信息安全管理系统 — 开源,无需云端
📖 Wiki — Docker-镜像使用与环境变量、架构与模块、常见问题、参与贡献(德/英)
⚠️ 安全警告:仿冒仓库与分发恶意软件的副本
ISMS Builder 没有打包的“发布版”、安装程序或可下载的 ZIP 文件 — 唯一 合法的来源是本仓库,直接从 GitHub 以纯源代码形式克隆或下载。我们已知至少有一个 恶意仓库冒充本项目(伪造 README、伪造的“下载”按钮链接到伪装成截图的 ZIP, 其中包含 Windows 恶意软件加载器 —
.cmd→.exe→ Lua-DLL 载荷链)。 请勿从本仓库以外的任何地方下载或运行任何“isms_builder”ZIP/安装程序/exe。 如果您发现可疑的仓库或网站冒充本项目,请提交 issue 或 discussion,以便我们进行标记。
状态:积极开发中 — 尚未成为最终产品。 核心模块已可用并投入使用,但部分功能尚不完整, 平台仍在持续成长。非常欢迎贡献、反馈和实际环境 测试 — 这正是本项目开源的原因。
🛡️ 相关项目:NIS2 Quick-Check — 一个免费的独立 NIS2 自检工具(10 个领域 × 5 个问题,覆盖全部 27 个欧盟成员国、全部 24 种 欧盟官方语言)。完全在浏览器中运行,无需后端,无需安装。不属于 ISMS Builder 的一部分,使用 ISMS Builder 也无需安装它 — 只是一个用于快速初步了解的配套工具。
什么是 ISMS Builder?
ISMS Builder 是一个自托管 Web 平台,用于管理信息安全管理系统(ISMS)。 它覆盖完整的合规生命周期 — 从策略编写到审计证据 — 适用于 ISO 27001:2022、NIS2、GDPR/DSGVO、BSI IT-Grundschutz 及其他框架。
无云端。无 SaaS 费用。您的数据保留在您的服务器上。
专为中小企业、IT 团队和顾问设计,他们需要一个真正的 ISMS 工具,而无需五位数的供应商合同。
预期用途与范围
本项目最初是为一名单一 ISMS 从业者打造的工作工具,并由此发展而来。它之所以 开源,是因为这项工作可能对他人有用 — 而不是因为它是伪装成开源产品的商业项目。 明确说明这一点有助于您判断它是否适合您的情况。
它的设计目标。 一个小型 ISMS 团队 — 通常是一个人,有时是几个人 — 负责 编写和维护管理系统的文档:策略、风险、资产、控制措施、证据。 需要账户的人数预计保持在较小规模。触达更广泛的受众无需账户: 策略确认通过基于令牌的链接发送,因此接收者无需登录即可阅读和确认文档, 也不会出现在任何用户列表中。
它对您的要求。 ISMS Builder 是自托管的,由此衍生的一切都由您负责: 部署、TLS、加固、备份、更新、访问控制,以及您在其中存储的任何内容的数据保护 义务。本项目提供的是合理的默认配置,而非托管服务。
它不是什么。 没有托管的 SaaS 产品、没有商业支持合同、也没有 服务级别协议。它不是多租户托管产品。它不会让您通过任何标准的认证, 也不是法律建议 — 它帮助您组织和证明相关工作, 但评估仍由您和您的审计师负责。
谁在维护它。 一个人,同时还有一份全职工作。Issue 和讨论会被阅读和 回复,通常几天内完成;安全报告会被优先处理。功能请求受到欢迎,并且确实 会塑造路线图,但它们需要与有限的业余时间竞争。如果您的组织依赖 固定的时间表或有保证的响应,诚实的建议是选择商业供应商 — 这不是回避本项目的理由,只是需要现实地规划。
截图
| 登录 | 仪表盘 |
|---|---|
![]() | ![]() |
| 适用性声明 | 风险管理 |
|---|---|
![]() | ![]() |
| GDPR 与数据保护 | 资产管理 |
|---|---|
![]() | ![]() |
| 指南与文档 | 报告 |
|---|---|
![]() | ![]() |
运行
npm start并打开https://localhost:3000可在本地浏览完整的演示数据集。
功能概览
| 模块 | 描述 | 标准 |
|---|---|---|
| 策略管理 | 模板 CRUD、版本控制、生命周期(草稿 → 审核 → 已批准 → 已归档)、空间层级、附件 | ISO 27001 §5 |
| 适用性声明 | 8 个框架下的 313 项控制措施、内联编辑、差距分析、交叉映射 | ISO 27001 A / BSI / NIS2 / EUCS / EUAI / ISO 9001 / CRA |
| 风险管理 | 风险登记册、处理计划、审计员角色 | ISO 27001 §6.1 |
| 安全目标 | 带进度条的 KPI 跟踪、日历集成 | ISO 27001 §6.2 |
| GDPR 与隐私 | VVT、AV 合同、DSFA、TOMs、DSAR 队列、72 小时计时器、带邮件提醒的删除日志 | DSGVO 第 13–35 条 |
| 资产管理 | 资产登记册、可编辑的资产类型、保护目标(CIA + 真实性)及依赖继承、分类级别、EoL 跟踪 | ISO 27001 A.5.9–5.12 |
| BCM / BCP | 业务影响分析、连续性计划、演练 | ISO 27001 A.5.29–5.30 / NIS2 |
| 培训记录 | 培训目录、完成跟踪、证书上传 | ISO 27001 A.6.3 |
| 供应商管理 | 供应商登记册、审计排程、风险评估 | ISO 27001 A.5.19–5.22 |
| 法律与合同 | 合同、NDA、隐私政策、到期日历 | |
| 事件收件箱 | CISO 收件箱 + 公开报告表单(无需登录) | NIS2 / BSI |
| 治理 | 管理评审、行动跟踪 | ISO 27001 §9.3 |
| 报告 | 合规矩阵(控制措施 × 实体)、差距报告、评审周期、CSV 导出 | |
| 审计发现 | 发现登记册(现状→目标→风险→建议)、行动计划、严重性/状态跟踪、FIND-YYYY-NNNN 编号 | ISO 27001 §9.2 |
| 可追溯性 | 每条记录均链接到 SoA 控制措施和策略文档 — 双向 | |
| 语义搜索 | 通过 Ollama(nomic-embed-text)实现本地 AI 搜索,带关键词回退 | |
| 多实体 | 企业结构树、控制措施和策略的按实体适用性 | |
| 多语言界面与演示数据 | 完整界面和演示内容支持 🇩🇪 德语 / 🇬🇧 英语 / 🇫🇷 法语 / 🇳🇱 荷兰语;管理员可控制可用语言 |
⚠ 重要提示:ISO 控制措施需要管理员手动安装
ISO 27001:2022、ISO 9000:2015 和 ISO 9001:2015 是受版权保护的标准,由 国际标准化组织(ISO,© ISO)发布。控制措施定义 (标题、描述、要求文本)不包含在本软件中,且不得 在未获得有效 ISO 许可证的情况下重新分发。
这在实践中意味着什么: ISO 27001、ISO 9000 和 ISO 9001 的 SoA 模块在交付时不包含控制措施内容。 管理员必须手动导入控制措施后,这些框架才能使用:
- 从 iso.org 或授权的国家机构获取标准的许可副本
- 准备一个包含控制措施定义的 JSON 文件(格式见
scripts/import-iso-controls.sh中的文档) - 运行导入脚本: ```bash
bash scripts/import-iso-controls.sh path/to/iso-controls.json
- 重启 ISMS Builder 服务器
开箱即用的框架(无需 ISO 许可证): BSI IT-Grundschutz、EU NIS2、EUCS、EU AI Act 和 CRA 基于公开可用的 欧盟立法和德国联邦出版物,并已完全预装。
在未获得相应标准有效许可证的情况下运行 ISO 框架模块,责任完全由运营方承担。 ISMS Builder 项目及其贡献者不对未经许可使用受 ISO 保护的内容承担任何责任。
快速开始```bash
git clone https://github.com/coolstartnow/isms-builder.git cd isms-builder npm install cp .env.example .env # set JWT_SECRET to a long random string npm start # http://localhost:3000
使用 **`[email protected]` / `adminpass`** 登录。首次登录时,系统会提示您选择**演示数据语言**(🇩🇪 德语 / 🇬🇧 英语 / 🇫🇷 法语 / 🇳🇱 荷兰语),或从空系统开始。请立即更改管理员密码。
如需在生产环境中使用 HTTPS:```bash
# .env
JWT_SECRET=your-very-long-random-secret
STORAGE_BACKEND=json
SSL_CERT_FILE=/etc/ssl/certs/your.crt
SSL_KEY_FILE=/etc/ssl/private/your.key
在评估演示数据后要正式上线? 请运行交互式生产准备工具,而不是从全新安装开始——它会按模块(或一次性全部)清除演示/测试内容,这样您已经输入的任何真实数据(例如风险、资产)就无需重新输入:```bash bash stop.sh node scripts/prepare-production.js bash start.sh
它总是会在修改任何内容之前创建备份(`data.bak.<timestamp>/`,位于你的 `data/` 目录旁边),并且绝不会触碰 `STORAGE_BACKEND`——这与应用内的“演示重置”管理员操作不同,后者是为演示实例设计的,并且出于历史原因仍会切换到 `sqlite`(参见 [Issue #42](https://github.com/coolstartnow/isms-builder/issues/42))。
---
## Docker
每个版本都会作为 GitHub 包发布到 GitHub 容器注册表中,支持 `linux/amd64` 和 `linux/arm64`——标记为 `:latest` 和 `:<version>`(例如 `:1.37.5.2`):```bash
docker compose up -d
# App runs at http://localhost:3000
或者不使用 Compose(data/ 必须是绑定挂载——数据永远不会被烘焙进镜像中):```bash
docker run -d --name isms-builder -p 3000:3000
-e JWT_SECRET="$(openssl rand -hex 32)"
-v "$PWD/data:/app/data"
ghcr.io/coolstartnow/isms-builder:latest
这是默认配置,将数据以纯 JSON 文件形式存储在 `./data` 中——完全不需要数据库容器。这是小型团队的推荐设置,上述两条命令使用的正是这种方式。
**使用 PostgreSQL(或 MariaDB)替代 JSON。** 该镜像开箱即用地支持这一点,但与上述 JSON 设置不同——它需要第二个容器(即实际的数据库)以及少量环境变量来告知应用如何连接数据库。如果你只拉取了镜像本身(`docker pull ghcr.io/coolstartnow/isms-builder`)而从未克隆此仓库,那么这些变量名默认情况下在任何地方都不可见——`docker-compose.yml` 和 `.env.example`(其中记录了这些变量)是此 Git 仓库中的文件,而非镜像的一部分。本节的存在就是为了让这些信息不只是仓库内的秘密。
`isms-builder` 镜像本身从不捆绑数据库服务器——`postgres:17`(或 `mariadb:11`)是来自 Docker Hub 的完全通用、空白的数据库引擎,对该项目的表结构一无所知。这些表(风险、资产、SoA 控制项等)会在应用启动并发现空数据库时由应用自身自动创建——无需手动导入 SQL,也无需单独运行迁移步骤。如果你想了解完整的机制,请参阅下面的“数据库模式是如何创建的?”。
两个容器,共享一个 Docker 网络,然后告知应用数据库的位置:```bash
# 1) An isolated network so the two containers can reach each other by name
docker network create isms-net
# 2) The database — empty until the app first connects and creates its tables
docker run -d --name isms-postgres --network isms-net \
-e POSTGRES_DB=isms_builder \
-e POSTGRES_USER=isms \
-e POSTGRES_PASSWORD="$(openssl rand -hex 16)" \
-v isms-postgres-data:/var/lib/postgresql/data \
postgres:17-alpine
# 3) The app, pointed at that database by container name (isms-postgres) via
# Docker's built-in DNS on the shared network — no host/port juggling needed
docker run -d --name isms-builder --network isms-net -p 3000:3000 \
-e JWT_SECRET="$(openssl rand -hex 32)" \
-e STORAGE_BACKEND=postgres \
-e DB_HOST=isms-postgres \
-e DB_PORT=5432 \
-e DB_USER=isms \
-e DB_PASS="<same password as POSTGRES_PASSWORD above>" \
-e DB_NAME=isms_builder \
ghcr.io/coolstartnow/isms-builder:latest
每个变量的含义:
| 变量 | 用途 |
|---|---|
STORAGE_BACKEND | postgres(或 pg)用于 PostgreSQL,mariadb 用于 MariaDB/MySQL。留空(或设为 json)则使用默认的 JSON 配置。 |
DB_HOST | 数据库容器的主机名。在共享的 Docker 网络上,这只需填写容器的 --name —— Docker 会自动解析它。 |
DB_PORT | PostgreSQL 为 5432,MariaDB 为 3306。 |
DB_USER / DB_PASS / DB_NAME | 必须与你在数据库容器上设置的内容一致(上面的 POSTGRES_USER/POSTGRES_PASSWORD/POSTGRES_DB,或 MariaDB 对应的变量)。 |
对于 MariaDB,将 postgres:17-alpine 替换为 mariadb:11,在第 2 步中使用其 MARIADB_DATABASE /
MARIADB_USER / MARIADB_PASSWORD 变量,并在第 3 步中使用 STORAGE_BACKEND=mariadb /
DB_PORT=3306。本项目理解的全部环境变量的完整交叉引用列表——包括此处未涉及的(SSL、反向代理信任、SMTP、
2FA 等)——位于本仓库的 .env.example 中。
Compose 用户可以免费获得这些:docker-compose.yml 已附带 mariadb 和 postgres
服务配置文件(默认注释掉,并附有等效的环境变量说明)——
docker compose --profile postgres up -d 会自动启动并连接两个容器,
无需手动配置网络或复制粘贴密码。
数据库模式是如何创建的? 无论是 postgres:17 还是 mariadb:11
镜像都不了解此项目——它们是来自 Docker Hub 的通用空数据库引擎。
没有需要导入的 SQL 转储文件,也没有需要手动运行的单独迁移命令。
相反,当 isms-builder 容器启动并连接到空数据库的那一刻,其
自身的应用程序代码(而非数据库镜像)会当场创建它所需的每个表——参见
server/db/knexDatabase.js:一个表定义列表,每个表
都用 hasTable() 检查,并在缺失时用 createTable() 创建,所有这些都在应用开始
接受 HTTP 请求之前完成。这使得它是幂等的——首次启动会从零构建完整的模式,
而之后每次针对同一数据库的重启都是静默的空操作,因为
表已经存在。这是相同的机制,未经修改,已针对
SQLite、MariaDB 11 和 PostgreSQL 17 进行了实时验证(参见 #70)。
若要改为从源码构建,请取消注释 docker-compose.yml 中的 build: 块并运行
docker compose up -d --build。
镜像带有签名的构建来源证明:```bash gh attestation verify oci://ghcr.io/coolstartnow/isms-builder:latest --owner coolstartnow
## 要求
- **Node.js 18+**(已测试:18、20、22)
- npm 9+
- (可选)Docker + Docker Compose
- (可选)[Ollama](https://ollama.ai),用于本地 AI 语义搜索
---
## 配置(`.env`)
| 变量 | 默认值 | 说明 |
|---|---|---|
| `JWT_SECRET` | *(必填)* | 用于 JWT 签名的密钥 — 请使用 32 个以上随机字符 |
| `PORT` | `3000` | HTTP/HTTPS 监听端口 |
| `STORAGE_BACKEND` | `json` | `json`(开发/演示)或 `sqlite`(生产环境) |
| `SSL_CERT_FILE` | — | TLS 证书路径 → 启用 HTTPS |
| `SSL_KEY_FILE` | — | TLS 私钥路径 |
| `DATA_DIR` | `./data` | 覆盖数据目录(Docker 卷) |
| `SMTP_HOST` | — | 用于邮件告警的 SMTP 服务器 |
| `SMTP_PORT` | `587` | SMTP 端口 |
| `SMTP_USER` | — | SMTP 用户名 |
| `SMTP_PASS` | — | SMTP 密码 |
| `SMTP_FROM` | — | 通知的发件人地址 |
---
## 架构```
server/
index.js — Express app setup, router mounts
auth.js — JWT auth, RBAC ranks, session
routes/ — 17 Express route modules (one per domain)
db/ — Data stores (jsonStore / sqliteStore / orgSettingsStore / …)
ai/ — Semantic search (embedder, embeddingStore, lexicalSearch)
reports.js — Report generation logic
ui/
index.html — SPA shell (Atlassian Dark Theme)
app.js — All render functions, ~6000 lines vanilla JS
style.css — CSS variables, dark theme
data/ — JSON files / SQLite DB (gitignored)
docs/
ISMS-build-documentation.md — Full architecture reference
architecture/ — C4 diagrams, data model, OpenAPI 3.0.3 spec
tests/ — Jest + Supertest (176 tests, --runInBand)
- 认证: JWT Cookie(
sm_session)、bcrypt 密码、TOTP 双因素认证(可在组织范围内强制执行) - RBAC:
reader→editor/dept_head→contentowner/auditor→admin - 持久化: JSON 文件(默认/演示)或通过
better-sqlite3使用 SQLite - AI: 可选本地 Ollama(nomic-embed-text);关键字搜索始终可用作后备方案
- 审计日志: 每次创建/更新/删除/登录操作均被记录,可筛选、可导出
参见 docs/architecture/ 获取 C4 图表、完整数据模型以及 OpenAPI 3.0.3 规范(80+ 端点)。
运行测试
注意:
tests/下的测试套件是作者的个人开发测试,随项目一同发布以供透明参考。它不是应用程序本身的一部分,也不是运行应用所必需的。这些测试覆盖内部 API 行为,并使用仅在隔离测试环境中存在的硬编码测试凭据——它们与任何生产或演示数据均无关联。```bash npm test # runs all 423 tests npm run preflight # exactly what CI gates on (tests + pinning + audit) npm test -- --verbose # with test names
测试使用隔离的临时目录——不会触及任何生产数据。
---
## 贡献
非常欢迎贡献!请参阅 [CONTRIBUTING.md](https://github.com/coolstartnow/isms-builder/blob/main/CONTRIBUTING.md),其中包含:
- 开发环境搭建(5 分钟即可完成首次测试运行)
- 代码风格与约定
- 如何提交高质量的 issue 或 PR
**发现安全问题?** 请勿公开提交 issue——请使用
[私有漏洞报告](https://github.com/coolstartnow/isms-builder/security/advisories/new)。
[SECURITY.md](https://github.com/coolstartnow/isms-builder/blob/main/SECURITY.md) 描述了范围、安全港条款以及您可以合理预期的处理方式。
**适合新手的问题** 在问题跟踪器中标记为 [`good first issue`](https://github.com/coolstartnow/isms-builder/issues?q=label%3A%22good+first+issue%22)。
---
## 路线图
| 状态 | 功能 |
|---|---|
| ✅ 已完成 | 语义搜索(Ollama / nomic-embed-text) |
| ✅ 已完成 | SQLite 后端、Docker、CI/CD |
| ✅ 已完成 | GDPR 删除日志邮件告警 |
| ✅ 已完成 | 多语言演示包(DE / EN / FR / NL) |
| ✅ 已完成 | 审计发现模块,含整改计划(V 1.37.2.0) |
| ✅ 已完成 | FR/NL 指南翻译 + 管理员语言配置(V 1.37.2.0) |
| ✅ 已完成 | MariaDB/MySQL 后端(`STORAGE_BACKEND=mariadb`,V 1.37.2.1) |
| ✅ 已完成 | 扫描器 → 风险草稿(Greenbone/OpenVAS XML + PDF 导入,V 1.37.2.0) |
| ✅ 已完成 | 政策确认——员工以数字方式确认政策并留有审计追踪(V 1.37.2.0) |
| ✅ 已完成 | 指南 CRUD——创建、编辑和上传自有文档(V 1.37.2.0) |
| ✅ 已完成 | 指南搜索——跨类别全文搜索并显示摘要(V 1.37.2.0) |
| ✅ 已完成 | 资产保护目标——CIA + 真实性(1–4)、依赖关系及 BSI 最高原则继承(V 1.37.2.0) |
| ✅ 已完成 | NIS2 第 21 条治理检查清单(30 项)及第 23 条报告截止日期自动告警(V 1.37.2.0) |
| ✅ 已完成 | PostgreSQL 后端(`STORAGE_BACKEND=pg`)——与 MariaDB 相同的 Knex 存储层,已针对真实 PostgreSQL 17 实例验证,含完整 `docker compose` 路径(V 1.37.5) |
| ✅ 已完成 | ownCloud / Nextcloud 集成——已批准政策通过 WebDAV 自动发布为 PDF,可选收藏/公开链接可见性,已针对真实 NextcloudPi 实例进行实时验证(#66,V 1.37.5.1) |
| ✅ 已完成 | 每次发布后将 Docker 镜像发布至 GitHub Container Registry(`ghcr.io/coolstartnow/isms-builder`,`linux/amd64` + `linux/arm64`,带签名的构建来源)——由 @bucherfa 贡献(#71,V 1.40.0)。维护成本试验:若维护负担超出预期,将再次移除。 |
| 🔜 下一步 | AI 政策助手——Ollama 根据标题 + 框架起草政策内容 |
| 🔜 下一步 | 定时报告——每周/每月的合规报告通过邮件发送 |
| 🔜 下一步 | 审计日志异常检测(LLM 批处理) |
| 🚀 后续 | 定量风险评分(欧元值,FAIR 启发) |
| 🚀 后续 | 审计师协作门户——面向审计师的外部只读访问 |
| 🚀 后续 | 政策差距分析(LLM) |
| 🏁 V 2.x | 可配置的指南类别——管理员可定义自定义类别(如工作流程、组织文档) |
---
## 关于作者
**Claude Hecker** 从事 IT 工作已超过 35 年。在担任 CIO 约 15 年后,
他转型担任 CISO 和数据保护官(DSO/DSB)。在其职业生涯中,
他为一家大型欧洲企业设计并实施了企业级 IT 基础设施和广域网连接
(VPN、MPLS)——负责跨多个站点和司法管辖区的可靠、安全运营。
ISMS Builder 正是源于这段经验:在现实世界中构建和维护合规的 ISMS,
经历真实的审计,承受真实的监管压力。该工具反映了从业者的实际需求——
而非产品经理认为他们需要的功能。
**为何开源?**
中小企业理应获得合适的 ISMS 平台,而不必支付五位数的许可费用。
无论选择哪种工具,上手成本都是真实存在的——但这一成本不应因供应商
锁定或数据离开自有基础设施而雪上加霜。本项目倡导软件自由,并坚持
您的合规数据属于您自己这一原则。
---
## 标准引用声明
本软件引用已发布标准中的控制项标识符和简短标题,
仅用于互操作性和合规管理目的。
- **ISO/IEC 27001、ISO 9000、ISO 9001** 是国际标准化组织(ISO)发布的
标准。这些标准的控制项定义**不包含**在本软件发行版中——
ISO 版权不允许再分发控制项文本。用户必须自行提供 JSON 文件
(参见上文章节及 `scripts/import-iso-controls.sh`)。
相关标准须从 [ISO](https://www.iso.org/) 或授权的国家分销商处获取。
- **BSI IT-Grundschutz** 材料由德国联邦信息安全办公室(BSI)发布,
可在 [bsi.bund.de](https://www.bsi.bund.de) 免费获取。
- **NIS2、CRA、EUCS、EU AI Act** 是欧盟立法法案,
可通过 [eur-lex.europa.eu](https://eur-lex.europa.eu) 公开获取。
---
## 许可证
版权所有(C)2026 Claude Hecker
本程序为自由软件,依据
[GNU Affero 通用公共许可证 v3.0](https://github.com/coolstartnow/isms-builder/blob/main/LICENSE) 授权。
如果您以网络服务形式运行修改版本,则必须向该服务的用户提供
完整源代码(AGPL 第 13 条)。
本项目包含依据 MIT、BSD-2-Clause 和 Apache-2.0 许可证授权的第三方组件。
完整的署名和许可证文本请参阅 [THIRD-PARTY-LICENSES.md](https://github.com/coolstartnow/isms-builder/blob/main/THIRD-PARTY-LICENSES.md)。






